zoukankan      html  css  js  c++  java
  • C语言写的俄罗斯方块

    源:C语言写的俄罗斯方块

    2014年最后一天, 任天堂将风靡全球30年的经典游戏<<俄罗斯方块>>下架. 作为全球最畅销的游戏, 其移植版本遍布各个平台. 下面这个是我去年在51平台上实现的, 使用12864液晶做为显示器, 用矩阵键盘操作. 大家都知道标准51只有几百字节的RAM, 当时我用的那款单片机RAM只有512字节, 使用256字节做为显示缓存, 还剩下256字节, 最后居然也够用.

    前段时间兄弟很好奇这个游戏是怎么运作的(他有C语言基础), 想让我给他讲一下, 然后我就整理了一下代码, 将其移植到PC平台, 后来又将其移植到MSP430 Launchpad上, 使用超级终端(PuTTy)作为游戏界面.

    代码使用模块化编写, 简单且易于移植. Windows平台的控制台程序和MSP430 Launchpad上的绝大部分代码都是相同的, 只有UI模块根据平台进行了重写. 所以, 如果你想要移植它到其它平台, 或者使用其它显示设备, 只要简单的重写UI模块即可实现.

    在游戏模块中会将消行的行数返回, 而计分和升级全是独立于模块之外的, 故可使用自己的计分方法.

    Windows控制台版本中的dep文件夹中是依赖模块, 用于改变控制台字符颜色与其它一些属性. 来自己第三方, 详见文件开头的声明.

    另外在Windos控制台还实现了一个彩色版本, 接口与单色版本兼容. 在编译参数中定义 TETRIS_USE_COLOR 宏即可编译为彩色版. Windows控制台版本由GCC编译, 详细见对应目录下的builder.bat批处理文件.

    MSP430 Launchpad版本使用PuTTy做为显示终端, 用IAR For MSP430进行编译, 对应目录下有建立好的工程文件可直接使用.

    代码位于Github, 主分支为单色版本, 彩色版本见 CTetris 分支.

    原理说明(以单色版本为例, 彩色版略有区别):

    游戏主要使用两个表和一个缓存区来配合进行.

    两个表中一个为方块(包括各个变形)的点阵数据表, 另外一个为方块旋转时的掩码表.

    在两个表中每个数据为无符号16位整数, 每4个一组, 可以排列为一个4 * 4 的点阵, 方块数据就记录于此点阵中.  旋转掩码表的结构相同, 是用于简化方块旋转时冲突判断, 里面记录的是方块旋转时经过的所有路径. 可以将某一类方块数据和掩码数据展开看一下就会很轻松明白了.

    冲突检测. 游戏的运行过程就是根据输入不改变方块的坐标, 判断方块移动情况, 采取相应的措施. 为了方便判断方块的旋转, 故使用了旋转掩码表. 旋转掩码表中标为1的地方就是方块旋转到下一个变形所经过的路径, 其对应的位置不可位于地图外, 且不可被占用, 否则表示方块不可旋转, 详见代码.

    消行. 经典的俄罗斯方块地图区是10 * 20大小的, 在单色模式下使用了一个uint16_t[20]的数组做为地图, 方块的每一步动作都在地图中表现出来. 其中每一位表示地图中的一个小方格, 数组的每一个元素实际上只用到10位(横向), 所以当数据中某一个元素值大于2^10即1023时即表明此行已满, 再进行消行处理即可.

    另外其它一些相关信息可参考源代码目录下的readme.md.

    查看位于Github的源代码: https://github.com/ykaidong/Tetris

  • 相关阅读:
    解决本地浏览器的跨域问题
    页面嵌入iframe关于父子传参调用
    仿微信、qq聊天,@好友功能
    创建新react项目 运行npm start 报错踩过的坑
    前端向后端获取数据的三种方法:ajax、axios、fetch
    观察者模式代码详解
    代理模式实现图片预加载、懒加载
    网站登录注册-Session 和token的总结
    浅谈MVC、MVVM的区别
    vue中methods、computed、watch区别
  • 原文地址:https://www.cnblogs.com/LittleTiger/p/5378441.html
Copyright © 2011-2022 走看看