学习了C语言,写一个俄罗斯方块,代码绝对可以运行
大神勿笑,只适合初学者 本人也是菜鸟
1、考虑怎么存储俄罗斯方块
@ @ @@ #
从配置文件中读取方块的类型的代码在(Init.h的ReadRock函数中)在下面3中解释下代码如何实现
2如何画出方块
void DisplayRock(int rockIdx, RockLocation_t* LocatePtr, bool displayed)
//方块在图形窗口中的位置(即定位4*4大块的左上角坐标) typedef struct LOCATE { int left; int top; } RockLocation_t;
3如何实现同一种类型方块的翻转,
@ @ @ @ @@@@ # # #
typedef struct ROCK { //用来表示方块的形状(每一个字节是8位,用每4位表示方块中的一行) unsigned short rockShapeBits; int nextRockIndex; //下一个方块,在数组中的下标 } RockType;
当我们按“↑”时,把传入画方块函数DrawRock中的rockIndex变为当前方块结构体中的nextRockIndex即可。
简单解释下ReadRock函数的实现:当读取到空行的时候表示 一种方块已经读取完毕,当读取到 行时 表示同一种类型的方块读取完毕,具体看代码实现,代码中具体的注释
4、主要游戏实现的逻辑
注:上述预览图的游戏控制区和游戏显示区在Draw.h的DrawGameWindow()函数实现的
(1)在初始位置画出方块,在预览区画出下一次的方块
(2)方块有两种行为:响应键盘命令UserHitKeyBoard(),自由下落
如果敲击键盘了(w ,a ,s ,d, )空格表示暂停,如果在规定时间内没有敲击键盘的话,方块自由下落一个单位
if (kbhit()) //如果敲击键盘了 就处理按键 { userHit = getch(); UserHitKeyBoard(userHit, &curRockIndex, &curRockLocation); } //没有 就自动下移一个单位 :不能用else,因为可能按键不是上下左右 DWORD newtime = GetTickCount(); if (newtime - oldtime >= (unsigned int)(300) && moveAbled == TRUE) { oldtime = newtime; DisplayRock(curRockIndex, &curRockLocation, false); curRockLocation.top += ROCK_SQUARE_WIDTH; //下落一格 }
(3)当方块落地(即不能下移了)时,判断是否满行,如果满行则消除,然后再判断游戏是否结束,游戏结束的话,直接退出游戏
判断满行:FullLine()函数,从最底下的一行开始判断,直到遇到一行空行,
while (count != xROCK_SQUARE_NUM ) //遇到空行 14 { linefull = true; count = 0; for (int i = 1; i <= xROCK_SQUARE_NUM; ++i) { if (game_board[idx][i] == 0) { linefull = false; count++; } } if (linefull) //满行,消除当前行,更新分数 { DelCurLine(idx);//消除满行 game_socres += 3; UpdateSocres(game_socres); idx++;//因为下面要减1 } idx--; }
(4)消除满行
将要删除的满行擦除:即将方块化成与背景色相同的,该代码为黑色
然后将上面的一行向下移,移一行删除一行,直到遇到空行
具体看代码的具体实现 game.h
void DelCurLine(int rowIdx)
(4)判断方块是否能移动
在game.h中实现
bool MoveAble(int rockIndex, RockLocation_t* currentLocatePtr, int f_direction)
如果不能移动的话,给游戏game_board设置标记表示该位置被占有
//全局变量-游戏板的状态描述(即表示当前界面哪些位置有方块) //0表示没有,1表示有(多加了两行和两列,形成一个围墙,便于判断方块是否能够移动) int game_board[yROCK_SQUARE_NUM + 2][xROCK_SQUARE_NUM + 2] = { 0 };
实现过程遇到的一些问题
注:可能还在存在一些问题,欢迎各位大神来改正
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228078.html原文链接:https://javaforall.net
