俄罗斯方块教程_第1页
俄罗斯方块教程_第2页
俄罗斯方块教程_第3页
俄罗斯方块教程_第4页
俄罗斯方块教程_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机编写俄罗斯方块游戏单片机编写俄罗斯方块游戏 关于俄罗斯方块程序的一些问题 关于俄罗斯方块程序的一些问题 Tc2 0Tc2 0 中怎么样设置图形显示 中怎么样设置图形显示 Tc2 0Tc2 0 中常用图形函数的用法 中常用图形函数的用法 怎样获取鍵盘输入 怎样获取鍵盘输入 怎样控制方块的移动 怎样控制方块的移动 怎样控制时间间隔怎样控制时间间隔 用于游戏中控制形状的下落用于游戏中控制形状的下落 游戏中的各种形状及整个游戏空间怎么用数据表示 游戏中的各种形状及整个游戏空间怎么用数据表示 游戏中怎么判断左右及向下移动的可能性 游戏中怎么判断左右及向下移动的可能性 游戏中怎么判断某一形状旋转的可能性 游戏中怎么判断某一形状旋转的可能性 按向下方向键时加速某一形状下落速度的处理 按向下方向键时加速某一形状下落速度的处理 怎么判断某一形状已经到底 怎么判断某一形状已经到底 怎么判断某一已经被填满 怎么判断某一已经被填满 怎么消去已经被填满的一行 怎么消去已经被填满的一行 怎么消去某一形状落到底后能够消去的所有的行 怎么消去某一形状落到底后能够消去的所有的行 如长条最多可以消去四行如长条最多可以消去四行 怎样修改游戏板的状态 怎样修改游戏板的状态 怎样统计分数 怎样统计分数 怎样处理升级后的加速问题 怎样处理升级后的加速问题 怎样判断游戏结束 怎样判断游戏结束 关于计分板设计的问题 关于计分板设计的问题 关于关于 下一个下一个 形状取法的问题 形状取法的问题 剩下的问题 剩下的问题 新的问题 新的问题 我想有一个最高记录的显示 应该怎么做呀 我想有一个最高记录的显示 应该怎么做呀 我想实现一个进度存储功能 应该怎么做呀 我想实现一个进度存储功能 应该怎么做呀 Tc2 0Tc2 0 中怎么样设置图形显示 中怎么样设置图形显示 Tc2 0Tc2 0 中有两种显示模式 一种是我们所熟知的字符模式 另一种是图形模式 在字中有两种显示模式 一种是我们所熟知的字符模式 另一种是图形模式 在字 符模式下只能显式字符 如符模式下只能显式字符 如 ASCIIASCII 字符 一般是显示字符 一般是显示 2525 行 每行行 每行 8080 个字符 程序缺省的是字符模式 在字符模式下不能显式图形和进行绘图操作 个字符 程序缺省的是字符模式 在字符模式下不能显式图形和进行绘图操作 要想进行图形显示和绘图操作 必须切换到图形模要想进行图形显示和绘图操作 必须切换到图形模 式下 式下 Tc2 0Tc2 0 中用中用 initgraph initgraph 函数可以切换到图形模式 用函数可以切换到图形模式 用 closegraph closegraph 可以从图形模式可以从图形模式 切换回字符模式 切换回字符模式 initgraph initgraph 和和 closegraph closegraph 都是图形都是图形 函数 使用图形函数必须包括头文件函数 使用图形函数必须包括头文件 graphics h graphics h voidvoid farfar initgraph intinitgraph int farfar graphdriver int graphdriver int farfar graphmode char graphmode char farfar pathtodriver graphdriver pathtodriver graphdriver 是上涨指向图形驱动序号变量的指针 是上涨指向图形驱动序号变量的指针 graphmodegraphmode 是在是在 graphdrivergraphdriver 选定后 指向图形显示模式序号变量的指针 选定后 指向图形显示模式序号变量的指针 pathtodriverpathtodriver 表示存放图形驱表示存放图形驱 动文件的路径 动文件的路径 Tc2 0Tc2 0 中有多种图形驱动 每种图形驱动下又有几种图形显示模式 在我的程序中图中有多种图形驱动 每种图形驱动下又有几种图形显示模式 在我的程序中图 形驱动序号为形驱动序号为 VGAVGA 图形显示模式序号为 图形显示模式序号为 VGAHIVGAHI 这是一种分辨率为 这是一种分辨率为 640 480 640 480 从左到右坐从左到右坐 标依次为标依次为 0 6390 639 从上到下坐标依次为 从上到下坐标依次为 0 479 0 479 能够显示 能够显示 1616 种颜色的图形模式 别的图形种颜色的图形模式 别的图形 驱动序号和图形显示模式序号 可以从手册或联机帮助中找到 驱动序号和图形显示模式序号 可以从手册或联机帮助中找到 pathtodriverpathtodriver 指示存放图形驱动文件的路径 图形驱动序号不同 图形驱动文件也不指示存放图形驱动文件的路径 图形驱动序号不同 图形驱动文件也不 同 序号为同 序号为 VGAVGA 图形驱动对应图形驱动对应 egavga bgi egavga bgi 这个图形驱动文件 这个图形驱动文件 egavga bgi egavga bgi 一般在一般在 TcTc 目目 录下 录下 voidvoid farfar closegraph void closegraph void 没有参数 从图形模式直接返回字符模式 没有参数 从图形模式直接返回字符模式 initgraph initgraph 和和 closegraph closegraph 的常用用法如下 的常用用法如下 intint gdrivergdriver VGA VGA gmode VGAHI gmode VGAHI errorcode errorcode initializeinitialize graphicsgraphics modemode initgraph e tc2 readread resultresult ofof initializationinitialization errorcodeerrorcode graphresult graphresult ifif errorcode errorcode grOk grOk anan errorerror occurredoccurred printf Graphicsprintf Graphics error error s n s n grapherrormsg errorcode grapherrormsg errorcode printf Pressprintf Press anyany keykey toto halt halt getch getch exit 1 exit 1 returnreturn withwith errorerror codecode returnreturn toto texttext modemode closegraph closegraph Tc2 0Tc2 0 中常用图形函数的用法 中常用图形函数的用法 在这里讲几个游戏中用到的绘图用的图形函数 在这里讲几个游戏中用到的绘图用的图形函数 setcolor setcolor line line rectangle rectangle settextjustify settextjustify outtextxy outtextxy setfillstyle setfillstyle bar bar voidvoid farfar setcolor intsetcolor int color color 设置画线 画框和在图形模式下显示文字的当前颜色 这个函数将影响设置画线 画框和在图形模式下显示文字的当前颜色 这个函数将影响 line line rectangle rectangle 和和 outtextxy outtextxy 函数绘图的颜色 函数绘图的颜色 colorcolor 可以取常的颜色常量 可以取常的颜色常量 BLACKBLACK 0 0 BLUEBLUE 1 1 GREENGREEN 2 2 CYANCYAN 3 3 REDRED 4 4 MAGENTAMAGENTA 5 5 BROWNBROWN 6 6 LIGHTGRAYLIGHTGRAY 7 7 DARKGRAYDARKGRAY 8 8 LIGHTBLUELIGHTBLUE 9 9 LIGHTGREENLIGHTGREEN 10 10 LIGHTCYANLIGHTCYAN 11 11 LIGHTREDLIGHTRED 12 12 LIGHTMAGENTALIGHTMAGENTA 13 13 YELLOWYELLOW 14 14 WHITEWHITE 15 15 voidvoid farfar line intline int x1 intx1 int y1 inty1 int x2 intx2 int y2 y2 用当前颜色从用当前颜色从 x1 y1 x1 y1 画一条到画一条到 x2 y2 x2 y2 的线段 的线段 voidvoid farfar rectangle intrectangle int left intleft int top inttop int right intright int bottom bottom 用当前颜色画一个左上角为用当前颜色画一个左上角为 left top left top 右下角为 右下角为 right bottom right bottom 的矩形框 的矩形框 voidvoid farfar settextjustify intsettextjustify int horz inthorz int vert vert 设置图形模式下文字输出的对齐方式 主要影响设置图形模式下文字输出的对齐方式 主要影响 outtextxy outtextxy 函数 函数 horizhoriz 和和 vertvert 可取如下枚举常量 可取如下枚举常量 horizhoriz LEFT TEXT LEFT TEXT 0 0 Left justify Left justify texttext CENTER TEXT CENTER TEXT 1 1 Center Center texttext RIGHT TEXT RIGHT TEXT 2 2 Right justify Right justify texttext vertvert BOTTOM TEXT BOTTOM TEXT 0 0 Justify Justify fromfrom bottombottom CENTER TEXT CENTER TEXT 1 1 Center Center texttext TOP TEXT TOP TEXT 2 2 Justify Justify fromfrom toptop voidvoid farfar outtextxy intouttextxy int x intx int y chary char textstring textstring 在在 x y x y 处用当前字体处用当前字体 缺省的字体是缺省的字体是 DEFAULT FONT DEFAULT FONT 显示字符串显示字符串 textstringtextstring 字符串的对 字符串的对 齐方式由齐方式由 settextjustify settextjustify 指定 指定 voidvoid farfar setfillstyle intsetfillstyle int pattern intpattern int color color 设置图形的填充模式和填充颜色 主要影响设置图形的填充模式和填充颜色 主要影响 bar bar 等函数 等函数 patternpattern 一般取枚举常量值一般取枚举常量值 SOLID FILL colorSOLID FILL color 的取值与的取值与 setcolor intsetcolor int color color 中中 colorcolor 的的 取值范围相同 取值范围相同 介绍完了前面两个问题 现在来写一个程序 这个程序演示前了面所介绍的几个图形介绍完了前面两个问题 现在来写一个程序 这个程序演示前了面所介绍的几个图形 函数 函数 程序程序 prog1 cprog1 c 怎样获取鍵盘输入 怎样获取鍵盘输入 在在 Tc2 0Tc2 0 中有一个处理键盘输入的函数中有一个处理键盘输入的函数 bioskey bioskey intint bioskey intbioskey int cmd cmd 当当 cmdcmd 为为 1 1 时 时 bioskey bioskey 检测是否有键按下 没有键按下时返回检测是否有键按下 没有键按下时返回 0 0 有键按下时返回 有键按下时返回 按键码按键码 任何按键码都不为任何按键码都不为 0 0 但此时并不将检测到的按 但此时并不将检测到的按 键码从键盘缓冲队列中清除 键码从键盘缓冲队列中清除 当当 cmdcmd 为为 0 0 时 时 bioskey bioskey 返回键盘缓冲队列中的按键码 并将此按键码从键盘缓冲队返回键盘缓冲队列中的按键码 并将此按键码从键盘缓冲队 列中清除 如果键盘缓冲队列为空 则一直等到有键按列中清除 如果键盘缓冲队列为空 则一直等到有键按 下 才将得到的按键码返回 下 才将得到的按键码返回 EscapeEscape 键的按键码为键的按键码为 0 x11b 0 x11b 下面的小程序可以获取按键的按键码 下面的小程序可以获取按键的按键码 forfor key bioskey 0 key bioskey 0 waitwait forfor a a keystrokekeystroke printf 0 x x n key printf 0 x x n key ifif key 0 x11b key 0 x11b break break EscapeEscape 常用按键的按键码如下 常用按键的按键码如下 define define VK LEFTVK LEFT 0 x4b000 x4b00 define define VK RIGHTVK RIGHT 0 x4d000 x4d00 define define VK DOWNVK DOWN 0 x50000 x5000 define define VK UPVK UP 0 x48000 x4800 define define VK HOMEVK HOME 0 x47000 x4700 define define VK ENDVK END 0 x4f000 x4f00 define define VK SPACEVK SPACE 0 x39200 x3920 define define VK ESCVK ESC 0 x011b0 x011b define define VK ENTERVK ENTER 0 x1c0d0 x1c0d 完整的程序请参见完整的程序请参见 prog2 cprog2 c prog3 cprog3 c prog2 cprog2 c 获取按键的按键码 按获取按键的按键码 按 EscapeEscape 键退出程序 键退出程序 prog3 cprog3 c 根据不同的按键进行不同的操作 按根据不同的按键进行不同的操作 按 EscapeEscape 键退出程序 键退出程序 怎样控制方块的移动 怎样控制方块的移动 方块移动的实现很简单 将方块原来的位置用背景色画一个同样大小的方块 将原来方块移动的实现很简单 将方块原来的位置用背景色画一个同样大小的方块 将原来 的方块涂去 然后在新的位置上重新绘制方块就可以的方块涂去 然后在新的位置上重新绘制方块就可以 了 这样就实现了方块的移动 完整的程序请参见了 这样就实现了方块的移动 完整的程序请参见 prog4 cprog4 c 这个用方向键控制一个黄色 这个用方向键控制一个黄色 的小方块在屏幕上上 下 左 右移动 这个程序用到了前面几个问题讲的内容 如果你的小方块在屏幕上上 下 左 右移动 这个程序用到了前面几个问题讲的内容 如果你 有点忘了 还要回头看看哦 有点忘了 还要回头看看哦 怎样控制时间间隔怎样控制时间间隔 用于游戏中控制形状的下落用于游戏中控制形状的下落 解决这个问题要用到时钟中断 时钟中断大约每秒钟发生解决这个问题要用到时钟中断 时钟中断大约每秒钟发生 18 218 2 次 截获正常的时钟中次 截获正常的时钟中 断后 在处理完正常的时钟中断后 将一个计时变量断后 在处理完正常的时钟中断后 将一个计时变量 加加 1 1 这样 每秒钟计时变量约增加 这样 每秒钟计时变量约增加 1818 需要控控制时间的时候 只需要看这个计时变量 需要控控制时间的时候 只需要看这个计时变量 就行了 就行了 截获时钟中断要用到函数截获时钟中断要用到函数 getvect getvect 和和 setvect setvect 两个函数的声明如下 两个函数的声明如下 void void interruptinterrupt getvect int getvect int interruptno interruptno void void setvect intsetvect int interruptno interruptno voidvoid interruptinterrupt isr isr 保留字保留字 interruptinterrupt 指示函数是一个中断处理函数 在调用中断处理函数的时候 所有指示函数是一个中断处理函数 在调用中断处理函数的时候 所有 的寄存器将会被保存 中断处理函数的返回时的指令是的寄存器将会被保存 中断处理函数的返回时的指令是 iretiret 而不是一般函数用到的 而不是一般函数用到的 retret 指令 指令 getvect getvect 根据中断号根据中断号 interruptnointerruptno 获取中断号为获取中断号为 interruptnointerruptno 的中断处理函数的入口地址 的中断处理函数的入口地址 setvect setvect 将中断号为将中断号为 interruptnointerruptno 的中断处理函数的入口地址改为的中断处理函数的入口地址改为 isr isr 函数的入口地址 函数的入口地址 即中断发生时 将调用即中断发生时 将调用 isr isr 函数 函数 在程序开始的时候截获时钟中断 并设置新的中断处理 在程序结束的时候 一定要在程序开始的时候截获时钟中断 并设置新的中断处理 在程序结束的时候 一定要 记着恢复时钟中断哦 不然系统的计时功能会出问题记着恢复时钟中断哦 不然系统的计时功能会出问题 的 具体演示程序请参见的 具体演示程序请参见 prog5 cprog5 c 由于中断处理大家可能用的不多 所以我把 由于中断处理大家可能用的不多 所以我把 prog5 cprog5 c 这个程序完整地贴在下面 并加上详细的解释 这个程序完整地贴在下面 并加上详细的解释 prog5 cprog5 c ThisThis isis anan interruptinterrupt serviceservice routine routine YouYou cancan NOTNOT compilecompile thisthis programprogram withwith TestTest StackStack OverflowOverflow turnedturned onon andand getget anan executableexecutable filefile whichwhich willwill operateoperate correctly correctly 这个程序每隔这个程序每隔 1 1 秒钟输出一个整数 秒钟输出一个整数 1010 秒钟后结束程序 秒钟后结束程序 按按 escapeescape 键提前退出程序键提前退出程序 include include include include include include EscapeEscape keykey define define VK ESCVK ESC 0 x11b0 x11b define define TIMERTIMER 0 x1c0 x1c 时钟中断的中断号时钟中断的中断号 中断处理函数在中断处理函数在 C C 和和 C C 中的表示略有不同 中的表示略有不同 如果定义了如果定义了 cplusplus cplusplus 则表示在则表示在 C C 环境下 否则是在环境下 否则是在 C C 环境下 环境下 ifdef ifdef cplusplus cplusplus define define CPPARGS CPPARGS else else define define CPPARGS CPPARGS endif endif intint TimerCounter 0 TimerCounter 0 计时变量 每秒钟增加计时变量 每秒钟增加 1818 指向原来时钟中断处理过程入口的中断处理函数指针指向原来时钟中断处理过程入口的中断处理函数指针 句柄句柄 voidvoid interruptinterrupt oldhandler CPPARGS oldhandler CPPARGS 新的时钟中断处理函数新的时钟中断处理函数 voidvoid interruptinterrupt newhandler CPPARGS newhandler CPPARGS increaseincrease thethe globalglobal countercounter TimerCounter TimerCounter callcall thethe oldold routineroutine oldhandler oldhandler 设置新的时钟中断处理过程设置新的时钟中断处理过程 voidvoid SetTimer voidSetTimer void interruptinterrupt IntProc CPPARGS IntProc CPPARGS oldhandler getvect TIMER oldhandler getvect TIMER disable disable 设置新的时钟中断处理过程时 禁止所有中断设置新的时钟中断处理过程时 禁止所有中断 setvect TIMER IntProc setvect TIMER IntProc enable enable 开启中断开启中断 恢复原有的时钟中断处理过程恢复原有的时钟中断处理过程 voidvoid KillTimer KillTimer disable disable setvect TIMER oldhandler setvect TIMER oldhandler enable enable voidvoid main void main void intint key time 0 key time 0 SetTimer newhandler SetTimer newhandler 修改时钟中断修改时钟中断 forfor ifif bioskey 1 bioskey 1 key bioskey 0 key bioskey 0 ifif key VK ESC key VK ESC 按按 escapeescape 键提前退出程序键提前退出程序 printf Userprintf User cancel n cancel n break break ifif TimerCounter 18 TimerCounter 18 1 1 秒钟处理一次秒钟处理一次 恢复计时变量恢复计时变量 TimerCounter 0 TimerCounter 0 time time printf d n time printf d n time ifif time 10 time 10 1010 秒钟后结束程序秒钟后结束程序 printf Programprintf Program terminatedterminated normally n normally n break break KillTimer KillTimer 恢复时钟中断恢复时钟中断 游戏中的各种形状及整个游戏空间怎么用数据表示 游戏中的各种形状及整个游戏空间怎么用数据表示 以后我提到的形状都是指下面七种形之一及它们旋转后的变形体 以后我提到的形状都是指下面七种形之一及它们旋转后的变形体 我定义了一个结构来表示形状 我定义了一个结构来表示形状 structstruct shapeshape intint xy 8 xy 8 intint color color intint next next 1 1 0 0 1 1 2 2 3 3 2 2 1 1 0 0 所有的各种形状都可以放在所有的各种形状都可以放在 4x44x4 的格子里 假定第二列 第四行的格子坐标为的格子里 假定第二列 第四行的格子坐标为 0 0 0 0 如上图中黑块所示如上图中黑块所示 则每个形状的四个方块都可以用 则每个形状的四个方块都可以用 4 4 个数对来表示 坐标个数对来表示 坐标 x x 从左向右依次增加 从左向右依次增加 y y 从上到下依次增加 表示的时候 组成该形从上到下依次增加 表示的时候 组成该形 状的四个方块从左到右 从上到下状的四个方块从左到右 从上到下 不一定非要按这个顺不一定非要按这个顺 序序 如上面七种形状的第一个用数对来表示就是 如上面七种形状的第一个用数对来表示就是 2 0 2 0 1 0 1 0 0 0 0 0 1 0 1 0 结构 结构 shapeshape 中的中的 xyxy 就是用来表示这就是用来表示这 4 4 个数对的 为了简化程序 用一维数组个数对的 为了简化程序 用一维数组 xy 8 xy 8 来表示 来表示 xy 0 xy 0 xy 1 xy 1 表示第一个数对 表示第一个数对 xy 2 xy 2 xy 3 xy 3 表示第二个数对 依次类推 表示第二个数对 依次类推 shapeshape 中的中的 colorcolor 表示形状的颜色 不同的形状有不同的颜色 七种形状及它们旋转表示形状的颜色 不同的形状有不同的颜色 七种形状及它们旋转 后的变形体一共有后的变形体一共有 1919 种形状 用一个全局数组表示 假定旋转的方向是逆时针方向种形状 用一个全局数组表示 假定旋转的方向是逆时针方向 顺时顺时 针方向道理一样针方向道理一样 shapeshape 中的中的 nextnext 就表示当前形状逆时针旋转后的下一个形状的序号 就表示当前形状逆时针旋转后的下一个形状的序号 例如 第一种形状及其旋例如 第一种形状及其旋 转变形的形状用结构表示如下 转变形的形状用结构表示如下 structstruct shapeshape shapes 19 shapes 19 x1 y1 x2 y2 x3 y3 x4 y4 x1 y1 x2 y2 x3 y3 x4 y4 color color next next 0 2 0 2 0 1 0 1 0 0 0 0 1 1 0 0 CYAN CYAN 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 CYAN CYAN 2 2 0 2 0 2 1 2 1 2 1 1 1 1 1 1 0 0 CYAN CYAN 3 3 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 1 CYAN CYAN 0 0 游戏空间指的是整个游戏主要的界面游戏空间指的是整个游戏主要的界面 呵呵 这个定义我实在想不出更准确的 还请哪呵呵 这个定义我实在想不出更准确的 还请哪 位大虾指点位大虾指点 实际上是一个宽 实际上是一个宽 1010 格子 高格子 高 2020 格子的格子的 游戏板 用一个全局数组游戏板 用一个全局数组 board 12 22 board 12 22 表示 表示的时候 表示 表示的时候 board x y board x y 为为 1 1 时表示游戏时表示游戏 板上板上 x y x y 这个位置上已经有方块占着了 这个位置上已经有方块占着了 board x y board x y 为为 0 0 表示游戏板上这位置还空着 为了便于判断形状的移动是否到边 到底 初始的时候表示游戏板上这位置还空着 为了便于判断形状的移动是否到边 到底 初始的时候 在游戏板的两边各加一列 在游戏板的下面加一行 全在游戏板的两边各加一列 在游戏板的下面加一行 全 部填上部填上 1 1 表示不能移出界 即 表示不能移出界 即 board 0 y board 11 y board 0 y board 11 y 其中其中 y y 从从 0 0 到到 21 21 初始都为初始都为 1 1 board x 21 board x 21 其中其中 x x 从从 1 1 到到 10 10 初始都为初始都为 1 1 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 910910 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 prog6 cprog6 c 演示了用结构表示各种形状的方法 虽然程序稍长一些 但并不是特别复杂 演示了用结构表示各种形状的方法 虽然程序稍长一些 但并不是特别复杂 其中游戏板初始化部分并没有真正用到 但是后面的程其中游戏板初始化部分并没有真正用到 但是后面的程 序会用到的 其中序会用到的 其中 SIZESIZE 定义为定义为 1616 这样将整个屏幕的坐标系由原来的 这样将整个屏幕的坐标系由原来的 640 480640 480 转换成转换成 40 30 640 16 4040 30 640 16 40 480 16 30 480 16 30 游戏中所有的坐标都是基于 游戏中所有的坐标都是基于 40 3040 30 的坐标系的 这样有的坐标系的 这样有 助于简化程序 坐标的转换在程序中由助于简化程序 坐标的转换在程序中由 DrawBlock intDrawBlock int x intx int y y 来体现 来体现 新的坐标系如下图所示 新的坐标系如下图所示 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 910111213141516171819202122232425262728293031910111213141516171819202122232425262728293031 4 4 3 3 2 2 1 1 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 新坐标中最主要的是就是上面两块黑色的部分 左边那块大的就是游戏板 横坐标从新坐标中最主要的是就是上面两块黑色的部分 左边那块大的就是游戏板 横坐标从 1 1 到到 1010 纵坐标从 纵坐标从 1 1 到到 2020 右边那块小的就是显示 右边那块小的就是显示 下一个下一个 形状的部分 横坐标从形状的部分 横坐标从 1414 到到 1717 纵坐标从 纵坐标从 3 3 到到 6 6 这个新的坐标系是整个游戏的基础 后面所有的移动 变形等的 这个新的坐标系是整个游戏的基础 后面所有的移动 变形等的 计算都是基于这个坐标系的 计算都是基于这个坐标系的 游戏中怎么判断左右及向下移动的可能性 游戏中怎么判断左右及向下移动的可能性 看懂了前面的各种形状和游戏板等的表示 接下来的东西就都好办多了 先来看一下看懂了前面的各种形状和游戏板等的表示 接下来的东西就都好办多了 先来看一下 某个形状如何显示在游戏板当中 假设要在游戏板中某个形状如何显示在游戏板当中 假设要在游戏板中 显示第一个形状 第一个形状在结构中的表示如下 显示第一个形状 第一个形状在结构中的表示如下 structstruct shapeshape shapes 19 shapes 19 x1 y1 x2 y2 x3 y3 x4 y4 x1 y1 x2 y2 x3 y3 x4 y4 color color next next 0 2 0 2 0 1 0 1 0 0 0 0 1 1 0 0 CYAN CYAN 1 1 那么这个组成形状四个方块的坐标表示为那么这个组成形状四个方块的坐标表示为 0 2 0 2 0 1 0 1 0 0 0 0 和和 1 0 1 0 这实际上 这实际上 是相对坐标 假形状的实际坐标指的是是相对坐标 假形状的实际坐标指的是 4x44x4 方块中的第方块中的第 二列 第三行的方块的位置 设这个位置为二列 第三行的方块的位置 设这个位置为 x y x y 那么组成这个形状的四个小方块的实际 那么组成这个形状的四个小方块的实际 坐标 以第一个形状为例 就是坐标 以第一个形状为例 就是 x 0 y 2 x 0 y 2 x 0 y 1 x 0 y 1 x 0 y 0 x 0 y 0 和和 x 1 y 0 x 1 y 0 由于所 由于所 有的形状都可以在有的形状都可以在 4x44x4 的方块阵列中表示 这样就找到了一种统一的方法来表示所有的形的方块阵列中表示 这样就找到了一种统一的方法来表示所有的形 状了 状了 1 1 0 0 1 1 2 2 3 3 相对坐标相对坐标 2 2 1 1 组成第一种形状的四个方块的相对坐标为组成第一种形状的四个方块的相对坐标为 0 2 0 2 0 1 0 1 0 0 0 0 和和 1 0 1 0 0 0 让我们看看形状是如何显示在游戏板中的 以第一个形状为例 让我们看看形状是如何显示在游戏板中的 以第一个形状为例 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 910910 1 1 形状的坐标为形状的坐标为 2 3 2 3 组成形状的四个方块的坐标由形状的 组成形状的四个方块的坐标由形状的 2 2 坐标加上这四个小方块各自的相对坐标得出 它们分别是 坐标加上这四个小方块各自的相对坐标得出 它们分别是 3 3 2 0 3 2 2 0 3 2 2 0 3 1 2 0 3 1 2 0 3 0 2 0 3 0 和和 2 1 3 0 2 1 3 0 即 即 4 4 2 1 2 1 2 2 2 2 2 3 2 3 和和 3 3 3 3 如左图所示 如左图所示 5 5 6 6 7 7 形状的坐标为形状的坐标为 1 9 1 9 组成形状的四个方块的坐标分别是 组成形状的四个方块的坐标分别是 8 8 1 0 9 2 1 0 9 2 1 0 9 1 1 0 9 1 1 0 9 0 1 0 9 0 和和 1 1 9 0 1 1 9 0 即 即 9 9 1 7 1 7 1 8 1 8 1 9 1 9 和和 2 9 2 9 如左图所示 如左图所示 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 形状的坐标为形状的坐标为 9 20 9 20 组成形状的四个方块的坐标分别是 组成形状的四个方块的坐标分别是 19 19 9 0 20 2 9 0 20 2 9 0 20 1 9 0 20 1 9 0 20 0 9 0 20 0 和和 9 1 20 0 9 1 20 0 即 即 20 20 9 18 9 18 9 19 9 19 9 20 9 20 和和 10 20 10 20 如左图所示 如左图所示 从现在起 我不再举别的示例程序了 从现在开始所有的示例代码均来自于我写的从现在起 我不再举别的示例程序了 从现在开始所有的示例代码均来自于我写的 Russia c Russia c 为了记录游戏板的状态 用了一个全局数组 为了记录游戏板的状态 用了一个全局数组 board 12 22 board 12 22 board x y board x y 其中 其中 x x 从从 0 0 到到 1111 y y 从从 1 1 到到 2121 等于 等于 1 1 表示表示 x y x y 这个位置已经被填充了 组成形状的这个位置已经被填充了 组成形状的 四个方块的坐标都不能为四个方块的坐标都不能为 x y x y 否则将发生冲突 否则将发生冲突 board x y board x y 其中 其中 x x 从从 1 1 到到 1010 y y 从从 1 1 到到 2020 等于表示 等于表示 x y x y 这个位置还没有被填充 这个位置还没有被填充 游戏板初始化时 给游戏板初始化时 给 board 0 y board 0 y board 11 y board 11 y 其中 其中 y y 从从 1 1 到到 2121 都赋为 都赋为 1 1 给 给 board x 21 board x 21 其中 其中 x x 从从 1 1 到到 1010 都赋为 都赋为 1 1 这相当于一开始就给游戏板左右和下方加了 这相当于一开始就给游戏板左右和下方加了 个个 边边 所有的形状都不能够移入这个 所有的形状都不能够移入这个 边边 否则将发生冲突 否则将发生冲突 现在我们可以开始讨论如何判断一个形状向左 向右和向下移动的可能性了 先说个现在我们可以开始讨论如何判断一个形状向左 向右和向下移动的可能性了 先说个 概念 概念 当前形状当前形状 是指那个正在下落还没有落到底的那个形状 如果当前形状向左移动 是指那个正在下落还没有落到底的那个形状 如果当前形状向左移动 不与游戏板现有状态发生冲突 则可以向左移动 具体做法是 先假设当前形状已经向左不与游戏板现有状态发生冲突 则可以向左移动 具体做法是 先假设当前形状已经向左 移动了 判断此时是否与游戏板现有状态发生冲突 如果不发生冲突 则可以向左移动 移动了 判断此时是否与游戏板现有状态发生冲突 如果不发生冲突 则可以向左移动 否则 不可以向左移动 否则 不可以向左移动 判断索引号为判断索引号为 ShapeIndexShapeIndex 的形状在坐标的形状在坐标 x y x y 是否与游戏板当前状态发生冲突的代码是否与游戏板当前状态发生冲突的代码 如下 我把详细的说明加在这段代码中 如下 我把详细的说明加在这段代码中 enumenum boolbool Confilict intConfilict int ShapeIndex intShapeIndex int x intx int y y intint i i 对组成索引号为对组成索引号为 ShapeIndexShapeIndex 的形状的四个方块依次判断的形状的四个方块依次判断 forfor i 0 i 7 i i i 0 i 7 i i i i 分别取分别取 0 2 4 60 2 4 6 如果四个方块中有任何一个方块的如果四个方块中有任何一个方块的 x x 坐标小于坐标小于 1 1 或大于或大于 1010 表示超出左边界或右边界 表示超出左边界或右边界 此时 发生冲突 此时 发生冲突 ifif shapes ShapeIndex xy x 1 shapes ShapeIndex xy x10 shapes ShapeIndex xy x 10 returnreturn True True 如果四个方块中某个方块的如果四个方块中某个方块的 y y 坐标小于坐标小于 1 1 表示整个形状还没有完全落入游戏板中 表示整个形状还没有完全落入游戏板中 此时 没有必要对这个方块进行判断 此时 没有必要对这个方块进行判断 ifif shapes ShapeIndex xy i 1 y 1 shapes ShapeIndex xy i 1 y 1 continue continue 如果四个方块中有任何一个方块与游戏板当前状态发生冲突 则整个形状在如果四个方块中有任何一个方块与游戏板当前状态发生冲突 则整个形状在 x y x y 处处 与游戏板当前状态冲突与游戏板当前状态冲突 ifif board shapes ShapeIndex xy x shapes ShapeIndex xy i 1 y board shapes ShapeIndex xy x shapes ShapeIndex xy i 1 y returnreturn True True 四个方块中没有任何一个方块与游戏板当前状态发生冲突 则整个形状在四个方块中没有任何一个方块与游戏板当前状态发生冲突 则整个形状在 x y x y 处处 没有与游戏板当前状态冲突没有与游戏板当前状态冲突 returnreturn False False 对以上代码附加说明如下 对以上代码附加说明如下 shapes ShapeIndex xyshapes ShapeIndex xy 其中 其中 i i 等于等于 0 2 4 60 2 4 6 表示组成索引号为 表示组成索引号为 ShapeIndexShapeIndex 的形的形 状的某个方块的状的某个方块的 x x 相对坐标 相对坐标 i i 等于等于 0 0 时 表示第时 表示第 1 1 个方块的个方块的 x x 相对坐标 相对坐标 i i 等于等于 2 2 时 时 表示第表示第 2 2 个方块的个方块的 x x 相对坐标 相对坐标 i i 等于等于 4 4 时 表示第时 表示第 3 3 个方块的个方块的 x x 相对坐标 相对坐标 i i 等于等于 6 6 时 时 表示第表示第 4 4 个方块的个方块的 x x 相对坐标 相对坐标 shapes ShapeIndex xyshapes ShapeIndex xy 其中 其中 i i 等于等于 1 3 5 71 3 5 7 表示组成索引号为 表示组成索引号为 ShapeIndexShapeIndex 的形的形 状的某个方块的状的某个方块的 y y 相对坐标 相对坐标 i i 等于等于 1 1 时 表示第时 表示第 1 1 个方块的个方块的 y y 相对坐标 相对坐标 i i 等于等于 3 3 时 时 表示第表示第 2 2 个方块的个方块的 y y 相对坐标 相对坐标 i i 等于等于 5 5 时 表示第时 表示第 3 3 个方块的个方块的 y y 相对坐标 相对坐标 i i 等于等于 7 7 时 时 表示第表示第 4 4 个方块的个方块的 y y 相对坐标 相对坐标 shapes ShapeIndex xy xshapes ShapeIndex xy x 其中 其中 i i 等于等于 0 2 4 60 2 4 6 表示索引号为 表示索引号为 ShapeIndexShapeIndex 的形状的形状 的坐标为的坐标为 x y x y 时 组成该形状的某个方块的时 组成该形状的某个方块的 x x 实际坐标 实际坐标 i i 等于等于 0 0 时 表示第时 表示第 1 1 个方块个方块 的的 x x 实际坐标 实际坐标 i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论