怎么用c语言写俄罗斯方块( 四 )


1000100011000000 这个方法挺靠谱 , 但我们还可以优化一下:不用4*4的数组 , 而是用16个bit位来表示这个点阵 。这样存储起来比较方便 , 故我们用unsigned int 的低16位来表示方块的点阵 。
我们可以用掩码与表示俄罗斯方块的位进行操作 , 来识别并在屏幕上画出方块 。我们把俄罗斯方块点阵的数位存在rockArray中 , 我们可以事先把这19种方块的字模点阵自己转化成十六进制 , 然后在rockArray数组的初始化时赋值进去 。
但这样做未免有点太费力 , 且扩展性也不太好 , 若以后设计的新方块种类加入 , 要改变数组rockArray中的值 。我们可以考虑把所有俄罗斯方块的点阵存储在配置文件中 , 在程序初始化时读取文件 , 把这些点阵转换成unsigned int的变量存储在rockArray中 。
这样 , 以后我们增添新的方块形状只需要在配置文件中增加新的点阵即可 。@### @### @@###### (为使得看起来更醒目 , 我们用@表示1 , 用#表示0)3、让图形动起来 在某位置处用函数DrawRock在屏幕上画出俄罗斯方块 , 然后再擦除掉(即用背景色在原位置处重绘一次方块) , 最后在下落的下一个位置处用函数DrawRock在屏幕上画出俄罗斯方块 , 如此循环 , 中间用计时器间隔一段时间以控制下落的速度 。
同理 , 按下屏幕的左右键也是如此 , 只是在按下键盘时把方块的位置重新计算了 。那么按下上方向键时 , 如何让方块翻转呢?我们在配置文件中就把方块的顺时针翻转形态放在了一起:@### @### @@###### @@@# @########### @@###@###@########@# @@@######### 我们每按一次上方向键改变一次方块的形状即可 。
若一直按上键 , 形状应该是循环地翻滚 。我们想到了循环链表的数据结构可实现这个效果 。
可是我们若把这些一种类的方块的各种形态串成循环链表形式 , 那么每次重新生成方块时我们就难以随机地生成方块了 。故还是得用数组来存储 , 但又要有循环链表的功能 , 于是我们想到了静态循环链表 。
我们用结构体来作为一个方块在rockArray中的元素 typedef struct ROCK { //用来表示方块的形状(每一个字节是8位 , 用每4位表示方块中的一行) unsigned int rockShapeBits ; int nextRockIndex ; //下一个方块 , 在数组中的下标 } RockType ; 这样 , 当我们按下上方向键时 , 把传入函数DrawRock中的rockIndex变为当前方块结构体中的nextRockIndex即可 。参考资料:C语言图形界面篇 。
5.怎样用C语言写俄罗斯方块,求指教,谢谢首先你要下载vc++ , 初学者可以用vs98安装好后在项目中可以添加如下代码 #include "graphics.h"#include #include int gcW = 20, gcColor[] = {DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA,MAGENTA, YELLOW};struct tetris { int _pool[16][32], (*pool)[32], tmap[8][4][16]; int x, y, s, st, t;}gt;void trsInit() { int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802}, {39,305,114,562},{54,561},{99,306},{51,51},{-1}}; int *p, i, j, b; for (p = sp[0]; *p >= 0; ++p) if ( *p == 0 ) *p = p[-2]; gt.pool = >._pool[4]; for (j = 0; j < 7; ++j) for (i = 0; i < 4; ++i) for (b = 0; b < 16; ++b) gt.tmap[j+1][i][b] = (sp[j][i] & 1) * (j + 1), sp[j][i] >>= 1; memset(gt._pool, -1, sizeof(gt._pool)); for (i = 0; i < 10; ++i) memset(>.pool[i], 0, sizeof(int[21])); return ;}int trsCopy(int sp[], int x, int y, int c) { int m[] = {0,32,64,96,1,33,65,97,2,34,66,98,3,35,67,99}, i, cx, cy; for (i = 0; i < 16; ++i) if (sp[i]) { cx = x + (m[i] >> 5), cy = y + (m[i] & 31); if (gt.pool[cx][cy]) if (c == 2) gt.pool[cx][cy] = 0; else return 0; if (c==1) gt.pool[cx][cy] = sp[i]; } return 1;}int trsScene() { int x, y = 0; gt.s = random(7) + 1, gt.st = gt.t = 0; gt.x = 4, gt.y = 0; for (--gt.t ; ; delay(10), --gt.t) { int k = 0; while (kbhit()) { k = getch(); if (k == 27) return 0; if (k == 'A' || k == 'a') { if (trsCopy(gt.tmap[gt.s][gt.st], gt.x-1, gt.y, 0)) --gt.x; } else if (k == 'D' || k == 'd') { if (trsCopy(gt.tmap[gt.s][gt.st], gt.x+1, gt.y, 0)) ++gt.x; } else if (k == 'W' || k == 'w') { if (trsCopy(gt.tmap[gt.s][(gt.st+1) % 4], gt.x, gt.y, 0)) gt.st = (gt.st+1) % 4; } } if (k == 'S' || k == 's' || gt.t