VC+俄罗斯方块课程设计报告源代码
C课程设计报告(俄罗斯方块)

C课程设计报告设计人:*** ***日期:2011-11-12指导教师:**设计题目:俄罗斯方块游戏目录目录 (1)一、设计任务 (3)二、设计目的 (3)三、功能描述 (4)1、游戏方块预览功能 (4)2、游戏方块控制功能 (4)3、游戏显示更新功能 (4)4、游戏速度分数更新功能 (5)5、游戏帮助功能 (5)四、总体设计 (5)1、功能模块设计 (6)(1)游戏执行主流程 (6)(2)游戏方块预览 (6)(3)游戏方块控制 (6)(4)游戏显示更新 (8)(5)游戏速度分数更新 (8)(6)游戏帮助 (8)2、数据结构设计: (9)(1)游戏底板BOARD结构体 (9)(2)游戏方块SHAPE结构体, (9)(3)SHAPE结构数组 (9)3、函数功能描述 (12)(1)newtimer() (12)(2)SetTimer() (12)(3)KillTimer() (12)(4)initialize() (12)(5)DelFullRow() (12)(6)setFullRow() (12)(7)MkNextBox() (12)(8)EraseBox() (13)(9)show_box() (13)(10)MoveAble() (13)(11)主函数main() (13)五、程序实现 (13)1、源代码分析 (13)(1)程序预处理 (13)(2)主函数 (17)(3)初始化界面 (21)(4)时钟中断处理 (23)(5)成绩、速度及帮助的显示 (24)(6)满行处理 (26)(7)游戏方块的显示和清除 (29)(8)游戏方块操作判断处理 (34)2、运行结果及界面介绍 (39)(1)游戏初始状态 (39)(2)游戏进行状态 (39)八、设计心得 (40)九、小组合作分工情况 (41)十、附录 (42)1、程序完整源代码 (42)2、截图 (57)一、设计任务1. 随机产生经典俄罗斯方块图形2. 设置难度级别,不同级别速度不同3. 方向键实现下落图形的左移、右移、加速下落、变形等基本操作4. 正确判断游戏结束5. 对游戏成绩进行记分二、设计目的本程序旨在训练学生的基本编程能力和游戏开发的技巧,熟悉C语言图形模式下的编程。
VC+俄罗斯方块课程设计报告含源代码

课程设计报告文档题目 ___________ 俄罗斯方块 _________________ 一.引言1编写目的:通过本课程设计,使学生巩固面向对象程序设计的基本概念、原理和技术,学会使用Visual C++开发工具进行简单面向对象程序的开发,将理论与实际相结合,完成一个小型面向对象程序的设计与实现,并在此基础上强化学生的实践意识,提高其实际动手能力和创新能力。
2、.定义:无3、参考资料:郑莉.C++语言程序设计.北京:清华大学出版社,2003罗建军.大学Visual C++程序设计案例教程.北京:高等教育出版社,2004 刘路放.Visual C++与面向对象程序设计教程.北京:高等教育出版社,2000David J.Visual C++ 技术内幕.潘爱民印译.北京:清华大学出版社,1999 侯俊杰.深入浅出MFC武汉:华中科技大学出版社,2001二.任务的描述:1. 目标:编写基于VC++开发工具并能通过键盘和鼠标进行人机交流俄罗斯方块游戏,界面友好,容易操作的游戏。
2. 功能描述:通过控制键盘可以进行游戏的开始、暂停、结束;能够控制方块的移动、变形;具有进行经典的俄罗斯方块游戏的一般功能。
3. 性能描述(1)数据精确度:无(2)时间特性:无4. 运行环境:windows98以上操作系统5. 条件与限制:硬件:装有Windows操作系统的计算机软件:Microsoft Visual Studio 6.0、Microsoft Visual Studio 2005三.任务设计1、程序的整个流程图将新生的下坠物代替旧的“下一个下坠物”下降下一个单位N到达底部消行操作结束开始NY能否左移NY左移Y是否按右方向键N\Y下移N是否按上方向键N是否变形变形开始能否下移Y3、等级管理模块流程图2、键盘响应函数流程图是否按下方向键dT到达底部游戏结束游戏结束处理右移N将旧的下一个下坠物用作当前下坠物是否按左方向键CToolEar 1、CMainFrame()构造函数:初始化游戏;一些状态显示比如:级别、下一个方块。
俄罗斯方块c语言源代码

俄罗斯方块c语言源代码俄罗斯方块游戏是一款非常受欢迎的游戏,使用C语言编写源代码实现其功能。
下面是俄罗斯方块游戏的C语言源代码:1. 创建窗口函数: // 创建窗口函数 void CreateWindow(int width, int height) { // 使用SDL库创建窗口 SDL_Init(SDL_INIT_EVERYTHING); SDL_Window *window = SDL_CreateWindow("Tetris",SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,width, height, 0); // 设置刷新时间SDL_SetHint(SDL_HINT_RENDER_VSYNC, "1"); }2. 创建游戏函数: // 创建游戏函数 void CreateGame() { // 设置随机数种子srand((unsigned int)time(NULL)); // 加载游戏资源 LoadResources(); // 初始化游戏数据InitGameData(); // 初始化游戏界面InitGameUI(); // 开始游戏循环 GameLoop(); // 清理游戏资源 CleanupGame(); }3. 绘图函数: // 绘图函数 void Draw(int x, inty, Color color) { // 使用SDL库在指定位置绘制指定颜色的矩形 SDL_Rect rect; rect.x = x;rect.y = y; rect.w = BLOCK_SIZE; rect.h = BLOCK_SIZE; SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a);SDL_RenderFillRect(renderer, &rect); }。
俄罗斯方块源代码

C语言俄罗斯方块源代码Vc6.0编译通过#include<windows.h>#include<stdio.h>#include<time.h>#include<stdlib.h>#include<malloc.h>#include<conio.h>#define MAP_WIDTH10#define MAP_HEIGHT20#define BLOCKM"■"#define BKBLOCK"□"#define OUTSTD GetStdHandle(STD_OUTPUT_HANDLE)typedef int(*PFUN)(void *pData);void ShowMapArray(int map[MAP_HEIGHT][MAP_WIDTH]);//生成方块int xyIsInarrBlock(int arrBlock[4][2], int x, int y) //有返回1 没有返回0 {int i;for (i = 0;i<4;i++)if (arrBlock[i][0] == x && arrBlock[i][1] == y)return 1;return 0;}void GetTransBlocks(int arrBlock[4][2])//坐标模式4*4方块{int nTmp, x, y;int nCount = 1;int i;int nMinx = 0, nMiny = 0;memset(arrBlock, 0, 8 * sizeof(int));while (nCount < 4){nTmp = rand() % nCount;x = arrBlock[nTmp][0];y = arrBlock[nTmp][1];nTmp = rand() % 4;switch (nTmp){case 0:x--;break;case 1:y--;break;case 2:x++;break;case 3:y++;break;}if (xyIsInarrBlock(arrBlock, x, y))continue;arrBlock[nCount][0] = x;arrBlock[nCount][1] = y;if (nMinx > x)nMinx = x;if (nMiny > y)nMiny = y;nCount++;}for (i = 0;i<4;i++){if (nMinx < 0)arrBlock[i][0] -= nMinx;if (nMiny < 0)arrBlock[i][1] -= nMiny;}}//旋转void Ratat(int arrBlock[4][2], int Direct) // driect 1 顺时针方向旋转,-1 逆时针方向旋转{int i;int nMinx, nMiny;int nTmp;for (i = 0;i<4;i++){nTmp = arrBlock[i][0];arrBlock[i][0] = arrBlock[i][1] * (-1)*Direct;arrBlock[i][1] = nTmp*Direct;if (i == 0){nMinx = arrBlock[i][0];nMiny = arrBlock[i][1];}else{if (nMinx > arrBlock[i][0])nMinx = arrBlock[i][0];if (nMiny > arrBlock[i][1])nMiny = arrBlock[i][1];}}for (i = 0;i<4;i++){if (nMinx < 0)arrBlock[i][0] -= nMinx;if (nMiny < 0)arrBlock[i][1] -= nMiny;}}void gotoxy(int x, int y){COORD pos = { x,y };SetConsoleCursorPosition(OUTSTD, pos);}void showxy(int x, int y, int bShow){COORD pos = { x * 2 + 2,y + 2 };SetConsoleCursorPosition(OUTSTD, pos);if (bShow)printf(BLOCKM);elseprintf(BKBLOCK);}void DisShowCursor(){CONSOLE_CURSOR_INFO cci;GetConsoleCursorInfo(OUTSTD, &cci);cci.bVisible = FALSE;SetConsoleCursorInfo(OUTSTD, &cci);}int CheckBlockPlace(int map[MAP_HEIGHT][MAP_WIDTH], int x, int y, int block[4][2], int bShow) //判断位置是否可用{int i;if (x < 0 || y < 0 || x >= MAP_WIDTH || y >= MAP_HEIGHT)return 0;for (i = 0;i<4;i++){if (map[y + block[i][1]][x + block[i][0]] == 1 && bShow)return 0;if (y + block[i][1] >= MAP_HEIGHT || x + block[i][0] >= MAP_WIDTH)return 0;}return 1;}int ShowBlock(int x, int y, int block[4][2], int bShow){int i;for (i = 0;i<4;i++)showxy(block[i][0] + x, block[i][1] + y, bShow);return 1;}void LoadMap(int map[MAP_HEIGHT][MAP_WIDTH]){int i, j;DisShowCursor();system("cls");printf("----------------俄罗斯方块v0.1--------------");printf("\n\n");for (i = 0;i<MAP_HEIGHT;i++){printf(" ");for (j = 0;j<MAP_WIDTH;j++){if (map[i][j])printf(BLOCKM);elseprintf(BKBLOCK);}printf("\n");}gotoxy(MAP_WIDTH * 2 + 6, 4);printf("按s开始\n");gotoxy(MAP_WIDTH * 2 + 6, 5);printf("Next:");gotoxy(MAP_WIDTH * 2 + 6, 12);printf("分数:");}int gameDown(int map[MAP_HEIGHT][MAP_WIDTH], int blockxy[4][2], int nSec, PFUN OnFun, void *pOnData){int i, j, k;int nSelect;int x = 3, y = 0;static int maxy = 20;int missrow = 0;int xsum = 0;while (1){nSelect = OnFun(pOnData);if (nSelect){switch (nSelect){case 75:{if (CheckBlockPlace(map, x - 1, y, blockxy, 1))x--;}break;case 72:{Ratat(blockxy, 1);if (!CheckBlockPlace(map, x, y, blockxy, 1)){Ratat(blockxy, -1);}}break;case 77:{if (CheckBlockPlace(map, x + 1, y, blockxy, 1))x++;}break;}}else{if (CheckBlockPlace(map, x, y, blockxy, 1)){ShowBlock(x, y, blockxy, 1);Sleep(nSec);if (CheckBlockPlace(map, x, y + 1, blockxy, 1)){ShowBlock(x, y, blockxy, 0);y++;}else{for (i = 0;i<4;i++){map[y + blockxy[i][1]][x + blockxy[i][0]] = 1;}if (y < maxy)maxy = y;break;}}elsereturn -1;}}for (i = maxy;i<MAP_HEIGHT;i++){xsum = 0;for (j = 0;j<MAP_WIDTH;j++){xsum += map[i][j];}if (xsum == MAP_WIDTH){for (k = i;k >= maxy;k--)for (j = 0;j<MAP_WIDTH;j++)map[k][j] = map[k - 1][j];missrow++;LoadMap(map);}}return missrow;}// help functionvoid ShowMapArray(int map[MAP_HEIGHT][MAP_WIDTH]){int i, j;for (i = 0;i<MAP_HEIGHT;i++){COORD pos = { MAP_WIDTH * 2,i };SetConsoleCursorPosition(OUTSTD, pos);for (j = 0;j<MAP_WIDTH;j++){printf("%d", map[i][j]);}}}int GetInfo(void *pData){while (kbhit()){char ch1 = getch();if (ch1 < 0){ch1 = getch();}return ch1;}while (kbhit())getch();return 0;}int main(){int map[MAP_HEIGHT][MAP_WIDTH] = { 0 };int blockarrnow[4][2] = { 0 }, blockarrnext[4][2] = { 0 };int ch, nRe, i, j, nScro = 0, nSpeed = 300;BOOL bRun = TRUE;LoadMap(map);srand((unsigned)time(NULL));while (bRun){if (kbhit()){ch = getch();}if (ch == 's' || ch == 'S'){GetTransBlocks(blockarrnow);while (bRun){GetTransBlocks(blockarrnext);ShowBlock(MAP_WIDTH + 2, 5, blockarrnext, 1);nRe = gameDown(map, blockarrnow, nSpeed, GetInfo, NULL);for (i = 0;i<4;i++){blockarrnow[i][0] = blockarrnext[i][0];blockarrnow[i][1] = blockarrnext[i][1];}for (i = 0;i <= 4;i++)for (j = 0;j <= 4;j++){gotoxy(MAP_WIDTH * 2 + 4 + j * 2, 7 + i);printf(" ");}if (nRe < 0){bRun = FALSE;break;}else{nScro += (nRe * 100);gotoxy(MAP_WIDTH * 2 + 11, 12);printf("%d", nScro);}}}}return 0;}Vs2015 编译运行配图。
C语言俄罗斯方块源代码

一、选题的依据及意义:依据自定义函数的利用,结合循环结构、数组、结构体还有点指针与文件只是进行编译。
通过对学生选课管理系统的操作来进一步掌握和利用C语言进行设计的能力;不仅可以练习而且积累经验逐渐培养编程能力。
二、本课程设计内容俄罗斯方块提示:(1)可能要用的函数:①int kbhit( )函数用于判断是否有按键,若有返回非零值,否则返回零。
在conio.h中定义。
②int bioskey(int cmd);返回按键扫描码和ASCII码,VC++6.0中不能用。
在bios.h中定义。
③TC下"conio.h"头文件中定义的用于清屏的函数是clrscr();④VC下"stdlib.h"头文件中定义的用于清屏的函数是system("CLS");⑤int random(int num):返回一个0到(num-1)之间的随机整数。
在stdlib.h中定义。
⑥void randomize( ):生成随机种子。
在stdlib.h中定义。
(2)俄罗斯方块包括如下图形,其中“*”可以用其它字符表示。
Esc退出并保存在指定文件中。
如下图可以用7*7字符数组存储,定义如下:char s[7][7]={"0000000","0000000","0000000","0000000","1000222","1001002","1111110"}(4)其中可以用“2”表示移动的俄罗斯方块,“1”表示静止的俄罗斯方块,“0”或空格表示空白。
(5)移动或旋转俄罗斯方块所用按键可自己定义。
南京财经大学C语言课程设计实现方案#include "stdio.h"#include "conio.h"#include "stdlib.h"#include "windows.h"#include "time.h"#define random(x) (rand()%x)#define N 13#define M 10#define K 5int s[N][M]={{0,0,0,2,2,2},{0,0,0,0,2},{0},{0},{0},{0},{0},{0},{0},{0}, {1},{1,0,0,1},{1,1,1,1,1,1,0,1,1,1}};/*当前状态*/int a[K][3][3]={{0,2,0,2,2,2},{2,0,0,2,2,2},{2,0,0,2,0,0,2,2},{2,2,2,0,0,2}, {{2},{2},{2}}};void Disp(){int i,j;for(i=0;i<N;i++){for(j=0;j<M;j++)printf("%c",s[i][j]?48+s[i][j]:' ');printf("\n");}printf("\n\n操作说明:按4左移,按6右移,按2下移\n");}void Down(){int i,j,k;for(j=0;j<M;j++)if(s[N-1][j]==2)break;/*判断是否在下边界*/if(j<M)/*若方块在下边界则将方块由2变1*/{for(i=0;i<N;i++)for(j=0;j<M;j++)if(s[i][j]==2)s[i][j]=1;for(i=N-1;i>=0;i--){for(j=0;j<M;j++)if(s[i][j]==0)break;//判断第i行是否有空格if(j==M)/*若第i行没空格消去第i行*/for(k=i++-1;k>=0;k--)for(j=0;j<M;j++)s[k+1][j]=s[k][j];}return;}for(i=0;i<N-1;i++){for(j=0;j<M;j++)if(s[i][j]==2)if(s[i+1][j]!=0&&s[i+1][j]!=2)break;/*方块下方不空退出内循环*/ if(j<M)break;/*方块下方不空退出外循环*/}if(i<N-1||j<M)//若已触到则将方块由2变1*/{for(i=0;i<N;i++)for(j=0;j<M;j++)if(s[i][j]==2)s[i][j]=1;for(i=0;i<N;i++)for(j=0;j<M;j++)if(s[i][j]==2)s[i][j]=1;for(i=N-1;i>=0;i--){for(j=0;j<M;j++)if(s[i][j]==0)break;//判断第i行是否有空格if(j==M)/*若第i行没空格消去第i行*/for(k=i++-1;k>=0;k--)for(j=0;j<M;j++)s[k+1][j]=s[k][j];}return;}for(i=N-1;i>=0;i--)for(j=0;j<M;j++)if(s[i][j]==2)s[i+1][j]=s[i][j],s[i][j]=0;/*方块下移*/}void Right(){int i,j;for(i=0;i<N;i++)if(s[i][M-1]==2)return;/* 已经在右边界退出 */for(i=0;i<N;i++)for(j=0;j<M-1;j++)if(s[i][j]==2)if(s[i][j+1]!=0&&s[i][j+1]!=2)return;/* 方块右方不空退出 */ for(j=M-2;j>=0;j--)for(i=0;i<N;i++)if(s[i][j]==2)s[i][j+1]=s[i][j],s[i][j]=0;/* 方块右移 */}void Left(){int i,j;for(i=0;i<N;i++)if(s[i][0]==2)return;/* 已经在左边界退出 */for(i=0;i<N;i++)for(j=1;j<M;j++)if(s[i][j]==2)if(s[i][j-1]!=0&&s[i][j-1]!=2)return;/* 方块左方不空退出 */ for(j=1;j<M;j++)for(i=0;i<N;i++)if(s[i][j]==2)s[i][j-1]=s[i][j],s[i][j]=0;/* 方块左移 */}int Have()/*判断是否有可移动方块,没有返回1,否则返回0*/{int i,j;for(i=0;i<N;i++)for(j=1;j<M;j++)if(s[i][j]==2)return 0;return 1;}void Add()/*随机生成方块*/{int t=random(K),x=random(M-3);/*生成两随机数t和x分别作为第t种方块和第x位置出现*/ int i,j; if(x<0)x=-x%(M-3);for(i=0;i<3;i++)for(j=x;j<x+3;j++)s[i][j]=a[t][i][j-x];return;}void main(){char c='A';while(1)/*判断是否有按键,没有循环输出i,否则停,conio.h*/{if(!kbhit())c='2';else c=getch();if(c=='p')getch();system("CLS");/*清屏,TC用clrscr();,VC用system("CLS");*/switch(c){case '4':Left();break; /*左移*/case '6':Right();break; /*右移*/case '9':case 27: return; /*按9或Esc(=27)另存后退出*/case '2':; /*下移*/default:Down();}c='2';if(Have())Add();Disp();Sleep(600);/*睡眠600ms,windows.h*/}}南京财经大学C语言课程设计小结学习C语言的起步就是学习它的方法规则,如果把它学习得好在学习后面的时候就比较容易理解。
C语言程序设计-俄罗斯方块源程序

其中的主要逻辑有:(1)由于c的随机性函数不好,所以每次游戏开始根据bios时间设置种子。
(2)得分越高,方块下降速度越快(每200分为单位)。
(3)每下落一个方块加1分,每消除一行加10分,两行加30分,三行加70分,四行加150分。
初试分数为100分。
游戏控制:up-旋转;空格-下落到底;左右下方向键-控制方向。
P-开始或暂停游戏。
ESC-退出。
特点:(1)由于tc不支持中文,所以基本都是英文注释。
(2)函数命名尽可能规范的表达其内部处理目的和过程。
(3)代码加上注释仅有577行。
(我下载过的两个俄罗斯方块代码一个在1087行,一个在993行,我的比它们代码少)。
(4)除了消除空格时算法比较复杂,其他算法都比较简单易读。
(5)绘图效率和局部代码效率扔有待提高。
(6)FrameTime参数可能依据不同硬件环境进行具体设置,InitGame需要正确的TC路径。
俄罗斯方块源于大约9年前上大一时的一个梦,我们在学习c语言时,我的同寝室友邀请我合作一起完成俄罗斯方块(课外作业性质),但是当时限于我们的水平比较菜和学习状态比较懒散,我们没有完成。
大一的时候我在机房里无意发现别人留下的俄罗斯方块程序,运行,老师发现后激动的问我是我写的吗,我惭愧的摇摇头。
那时看到别人做c的大程序深感羡慕(自己只是写几十行的程序)。
数年后我仍然看到有不同样式的实现,但是我一直没有实现它,知道今天忽然有这个想法去做,算是弥补多年前的遗憾和心愿吧。
---------------------------------------------Q&A:----------------------------------------------Q:我编译时出现错误:fatal error C1083: Cannot open include file: 'bios.h': Nosuch file or directory,该如何解决?A:正文中的代码,是使用Borland公司的TC2.0编译的,编译结果运行在Windows的16位虚拟机上。
vc++课程设计 俄罗斯方块
Visual C++程序设计课程大作业题目名称:俄罗斯方块游戏系名称:计算机科学及信息工程系专业班级:08级网络工程一班学生姓名:王振锋学号:2008030300222010 年 6 月目录一、成员分工 (3)二、需求分析 (4)2.1系统概述 (4)2.2系统运行环境 (4)2.3功能需求描述 (4)三、总体设计 (4)3.1屏幕的组成 (4)3.2形状的组成 (5)3.3形状的统一 (5)3.4移动与旋转的统一 (6)四、详细设计 (9)4.1程序流程图 (9)4.1.1数据流图 (9)4.1.2系统功能模块 (10)4.1.3 系统流程图 (10)4.2程序模块详细设计 (11)4.2.1界面的设计 (11)4.2.2背景色的选择模块 (12)4.2.3游戏随机选择方块模块 (13)4.2.4游戏预览功能模块 (15)4.2.5收埋功能模块 (19)4.2.6记分功能模块 (22)4.2.7鼠标控制功能模块 (23)五、系统测试 (26)六、总结 (26)七、参考文献 (26)一、成员分工我们小组成员共有三名,分别是王振锋,霍超,***;为了能按时圆满的完成这次vc++课程设计,我们小组进行了详细的分工,以确保设计能按时完成。
经过周密的考虑和详细的调查最终确定该俄罗斯方块游戏需要以下几个功能模块:(1)需求分析(2)界面的设计(3)背景色的选择模块(4)游戏随机选择方块模块(5)游戏预览功能模块(6)收埋功能模块(7)记分功能模块(8)鼠标控制功能模块(9)模块联结(10)系统测试经过小组成员的讨论,并根据个人的特长和具体爱好做如下具体分工:霍超具体完成以下模块的设计与实现:(1 )需求分析(2 )界面的设计(3 )背景色的选择模块王振锋具体完成以下模块的设计与实现:(1)游戏随机选择方块模块(2)游戏预览功能模块(3)收埋功能模块(4)记分功能模块***主要具体完成以下模块的设计与实现:(1)鼠标控制功能模块(2)模块联结(3)系统测试二、需求分析2.1系统概述该游戏软件在Windows系统为玩家提供传统俄罗斯方块游戏的基本功能,玩家可以通过键盘控制在游戏区中堆积软件随机提供的由四个小方块不同组合的7种类型不同颜色的方块,每个小方格的颜色也是随机的,并且在整个下落的过程中,其颜色也呈动态变化。
俄罗斯方块C源代码
/* *俄罗斯方块源程序 */ #include <stdio.h> #include <stdlib.h> #include <dos.h> #include <graphics.h> /*图形函数库*/
/*定义按键码*/ #define VK_LEFT 0x4b00 #define VK_RIGHT 0x4d00 #define VK_DOWN 0x5000 #define VK_UP 0x4800 #define VK_ESC 0x011b #define TIMER 0x1c /*设置中断号*/
颜色填充。*/ sprintf(speed_str,"%3d",speed+1); outtextxy(x,y,"Level"); outtextxy(x,y+10,speed_str); /*输出字符串指针 speed_str 所指的文本在规定的(x, y)位置*/ outtextxy(x,y+50,"Nextbox"); }
/* 设置新的时钟中断处理过程 */ void SetTimer(void interrupt(*IntProc)(void)) { oldtimer=getvect(TIMER); /*获取中断号为 TIMER 的中断处理函数的入口地 址*/ disable(); /* 设置新的时钟中断处理过程时,禁止所有中断 */ setvect(TIMER,IntProc); /*将中断号为 TIMER 的中断处理函数的入口地址改为 IntProc()函数的入口地址 即中断发生时,将调用 IntProc()函数。*/ enable(); /* 开启中断 */ }
C语言实现俄罗斯方块源代码
C语⾔实现俄罗斯⽅块源代码本⽂实例为⼤家分享了C语⾔实现俄罗斯⽅块的具体代码,供⼤家参考,具体内容如下GitHub:Head.h#ifndef _HEAD_H_#define _HEAD_H_#include<graphics.h>#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<time.h>#include<string.h>#define _CRT_SECURE_NO_WARNINGS 1//界⾯的相关的参数#define WALL_SQUARE_WIDTH 10 //围墙⽅块的宽度#define xWALL_SQUARE_NUM 30 //x轴⽅向的⽅块的数⽬#define yWALL_SQUARE_WIDTH 46 //y轴⽅向的⽅块的数⽬#define GAME_WALL_WIDTH (WALL_SQUARE_WIDTH*xWALL_SQUARE_NUM) //游戏区域的宽度 300#define GAME_WALL_HTGH (WALL_SQUARE_WIDTH*yWALL_SQUARE_WIDTH) //游戏区域的⾼度 460#define WINDOW_WIDTH 480 // 游戏总窗⼝宽度 480#define WINDOW_HIGH 460 // 游戏总窗⼝⾼度 460//定义俄罗斯⽅块的相关参数#define ROCK_SQUARE_WIDTH (2*WALL_SQUARE_WIDTH) //俄罗斯⽅块的⼤⼩是围墙的两倍 20#define xROCK_SQUARE_NUM ((GAME_WALL_WIDTH -20)/ROCK_SQUARE_WIDTH) // 游戏区x轴放的⽅块数⽬:14 #define yROCK_SQUARE_NUM ((GAME_WALL_HTGH -20)/ROCK_SQUARE_WIDTH) // 游戏区y轴放的⽅块数⽬:22 //定义移动⽅块的相关操作#define DIRECT_UP 3#define DIRECT_DOWN 2#define DIRECT_LEFT -1#define DIRECT_RIGHT 1/*数据结构-线性表(结构体数组)*/typedef struct ROCK{//⽤来表⽰⽅块的形状(每⼀个字节是8位,⽤每4位表⽰⽅块中的⼀⾏)unsigned short rockShapeBits;int nextRockIndex; //下⼀个⽅块,在数组中的下标} RockType;//⽅块在图形窗⼝中的位置(即定位4*4⼤块的左上⾓坐标)typedef struct LOCATE{int left;int top;} RockLocation_t;//全局变量-游戏板的状态描述(即表⽰当前界⾯哪些位置有⽅块)//0表⽰没有,1表⽰有(多加了两⾏和两列,形成⼀个围墙,便于判断⽅块是否能够移动)int game_board[yROCK_SQUARE_NUM + 2][xROCK_SQUARE_NUM + 2] = { 0 };int game_socres = 0; //全局分数// 把俄罗斯⽅块的19种类放到数组中int rockTypeNum = 19;RockType RockArray[19] = { (0, 0) };//预览区的⽅块的位置RockLocation_t preRockLocation = {GAME_WALL_WIDTH+70,70};//每次⽣成初始化⽅块的位置RockLocation_t initRockLocation = { (WALL_SQUARE_WIDTH + 100), WALL_SQUARE_WIDTH };//分数显⽰的位置//各个⽂件中的函数void DisplayRock(int rockIdx, RockLocation_t* LocatePtr, bool displayed);//初始化Init源⽂件void InitGame();//game.hvoid PlayGame();bool IsGameOver();#endifDraw.h#include"Head.h"//画出游戏界⾯void DrawGameWindow(){//先画出围墙setcolor(BLUE);setlinestyle(PS_SOLID,NULL,0);setfillcolor(BLUE);//画出上下围墙for (int x = WALL_SQUARE_WIDTH; x <= GAME_WALL_WIDTH; x += WALL_SQUARE_WIDTH){fillrectangle(x - WALL_SQUARE_WIDTH, 0, x, WALL_SQUARE_WIDTH); //上fillrectangle(x - WALL_SQUARE_WIDTH, GAME_WALL_HTGH - WALL_SQUARE_WIDTH, x, GAME_WALL_HTGH);//下 }//画出左右围墙for (int y = WALL_SQUARE_WIDTH; y <= GAME_WALL_HTGH; y += WALL_SQUARE_WIDTH){fillrectangle(0, y, WALL_SQUARE_WIDTH, y + WALL_SQUARE_WIDTH);//左fillrectangle(GAME_WALL_WIDTH - WALL_SQUARE_WIDTH, y, GAME_WALL_WIDTH, y + WALL_SQUARE_WIDTH);//右 }//画出右边统计分数及相关东西//画出分割线setcolor(WHITE);setlinestyle(PS_DASH,2);line(GAME_WALL_WIDTH + 20, 0, GAME_WALL_WIDTH + 20, GAME_WALL_HTGH);//设置字体LOGFONT font;gettextstyle(&font);settextstyle(18, 0, _T("宋体"));font.lfQuality = ANTIALIASED_QUALITY;//设置输出效果为抗锯齿//1显⽰预览形状outtextxy(GAME_WALL_WIDTH + 80, 30, _T("预览"));outtextxy(GAME_WALL_WIDTH + 80, 170, _T("分数"));outtextxy(GAME_WALL_WIDTH + 65, 250, _T("操作说明"));outtextxy(GAME_WALL_WIDTH + 40, 290, _T("w a s d控制⽅向"));outtextxy(GAME_WALL_WIDTH + 40, 335, _T("空格暂停"));//显⽰分数setcolor(RED);outtextxy(GAME_WALL_WIDTH + 90, 200, '0');}//在游戏区显⽰编号为rockIdx的⽅块void DisplayRock(int rockIdx, RockLocation_t* LocatePtr, bool displayed){int color;//⽅块的填充颜⾊int lineColor = WHITE;//线的颜⾊int boardFalg = 0;int xRock = 0;int yRock = 0;unsigned short rockCode = RockArray[rockIdx].rockShapeBits;//如果displayed为true的话,将⽅块块颜⾊设置为white,game_board对应的位置设置为1;//如果displayed为false的话,将⽅块块颜⾊设置为black,game_board对应的位置设置为0;displayed ? (color = RED, boardFalg = 1) : (color = BLACK,lineColor = BLACK, boardFalg = 0);setcolor(lineColor);setlinestyle(PS_SOLID);//设置为实线,xRock = LocatePtr->left;yRock = LocatePtr->top;int count = 0;//每4个换⾏,记录坐标偏移量unsigned short mask = 1;for (int i = 1; i <= 16; ++i){mask = 1 << (16 - i);if ((rockCode & mask) != 0) //如果不为0的话,就画出⼩⽅块{fillrectangle(xRock , yRock, xRock + ROCK_SQUARE_WIDTH, yRock + ROCK_SQUARE_WIDTH); }if (i % 4 == 0) //换⾏{yRock = yRock + ROCK_SQUARE_WIDTH;xRock = xRock = LocatePtr->left;}else{xRock += ROCK_SQUARE_WIDTH;}}}Init.h#include"Head.h"static void ShapeStrToBit(unsigned char *rockShapeStr, unsigned short& rockShapeBit);static void ReadRcok();void InitGame(){//把全局游戏游戏版初始化,边界初始化为1for (int i = 0; i < xROCK_SQUARE_NUM + 2; i++){game_board[0][i] = 1; //上边界game_board[yROCK_SQUARE_NUM + 1][i] = 1; //下边界}for (int i = 0; i < yROCK_SQUARE_NUM + 2; i++){game_board[i][0] = 1 ; //左边界game_board[i][xROCK_SQUARE_NUM + 1] = 1; //右边界}//读取俄罗斯⽅块ReadRcok();}//从⽂件中读取⽅块的形状存储到rockArray中void ReadRcok(){FILE* fp = fopen("RockShape.ini","r");if (NULL == fp){printf("打开⽂件失败\n");return;}unsigned char readBuf[1024]; //fp读取到字符串readbuf中unsigned short rockShapeBit = 0;//存放⽅块形状,占16⽐特位unsigned char rockShapeStr[16];//存放⽅块字符串int ShapeStrIdx = 0;int rockNum = 0;//统计⽅块的个数以及存放⽅块数组RockArray的下标int rocknext = 0;//⽅块数组中下⼀个形状int rockShapeStart = 0;//同⼀类型的形状while (true){size_t readSize = fread(readBuf, 1, 1024, fp);if (readSize == 0)break;//处理readbuffor (size_t idx = 0; idx < readSize; ++idx){//将字符存放到rockShapeStr中if (readBuf[idx] == '@' || readBuf[idx] == '#'){rockShapeStr[ShapeStrIdx] = (unsigned char)readBuf[idx];++ShapeStrIdx;}++idx; //可能idx == readSize了if (readBuf[idx] == '*')//修改上⼀次⽅块的next值{idx += 5;RockArray[--rockNum].nextRockIndex = rockShapeStart;rockNum++;rockShapeStart = rockNum;rocknext = rockShapeStart ;}}//可能没有填满if (ShapeStrIdx < 16){break;}else //填满shapestr{ShapeStrIdx = 0;//置0//将rockShapeStr 转为rockShapeBitShapeStrToBit(rockShapeStr, rockShapeBit);rocknext++;RockArray[rockNum].rockShapeBits = rockShapeBit;RockArray[rockNum].nextRockIndex = rocknext;rockNum++;}}}fclose(fp);}//将从⽂件中读取的字符串(长度默认为16)转换成 unsigned shortvoid ShapeStrToBit(unsigned char *rockShapeStr, unsigned short& rockShapeBit){rockShapeBit = 0;for (size_t idx = 0; idx < 16; ++idx){if (rockShapeStr[idx] == '@') //1{rockShapeBit |= (1 << (16 - idx - 1));}// #为0 不需要处理}}game.h#include"Head.h"#define _CRT_SECURE_NO_WARNINGS 1bool MoveAble(int rockIndex, RockLocation_t* currentLocatePtr, int f_direction);void SetGameBoardFlag(int rockIdx, RockLocation_t* curRockLocation);void UserHitKeyBoard(char userHit, int* RockIndex, RockLocation_t* curRockLocation); void FullLine();void UpdateSocres(int scores);void DelCurLine(int rowIdx);bool IsGameOver();void PlayGame(){char userHit = 0;//⽤户敲击键盘int curRockIndex = 0;//当前⽅块的rockArray下标int nextRockIndex = 0;//下次RockLocation_t curRockLocation;curRockLocation.left = initRockLocation.left;curRockLocation.top = initRockLocation.top;DWORD oldtime = 0;srand((unsigned int)time(NULL));curRockIndex = rand() % rockTypeNum;nextRockIndex = rand() % rockTypeNum;//画出预览区初始化⽅块//在初始位置和预览区显⽰⽅块形状bool moveAbled = false;while (true){//判断当前⽅块是否落地(判断能否再下移):如果落地,判断是否满⾏,再判断是否结束游戏,改变game_board ,画出下次初始化的⽅块,以及⽣成新的预览⽅块 //moveAbled = MoveAble(curRockIndex, &curRockLocation, DIRECT_DOWN);if (!moveAbled) //判断是否落地,不能下移表⽰落地{//修改game_board的值SetGameBoardFlag(curRockIndex, &curRockLocation);FullLine();if (IsGameOver()){MessageBox(NULL, _T("游戏结束"), _T("GAME OVER"), MB_OK);exit(0);}//为下次⽣成模块开始准备DisplayRock(nextRockIndex, &preRockLocation, false);//擦除旧的⽅块curRockIndex = nextRockIndex;nextRockIndex = rand() % rockTypeNum; //⽣成新的预览⽅块DisplayRock(curRockIndex, &initRockLocation, 1);DisplayRock(nextRockIndex, &preRockLocation, 1);FlushBatchDraw();//修改curRockLocation的值curRockLocation.left = initRockLocation.left;curRockLocation.top = initRockLocation.top;}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; //下落⼀格}//AutomaticDownMove(curRockIndex, &curRockLocation);//画出新⽅块DisplayRock(curRockIndex, &curRockLocation, 1);FlushBatchDraw();Sleep(20);}}//响应键盘命令时间void UserHitKeyBoard(char userHit, int* RockIndex, RockLocation_t* curRockLocation){switch (userHit){case 'W':case 'w'://↑if (MoveAble(RockArray[*RockIndex].nextRockIndex, curRockLocation, DIRECT_UP)){DisplayRock(*RockIndex, curRockLocation, false);*RockIndex = RockArray[*RockIndex].nextRockIndex;}break;case 'S':case 's'://↓if (MoveAble(*RockIndex, curRockLocation, DIRECT_DOWN)){DisplayRock(*RockIndex, curRockLocation, false);curRockLocation->top += 2 * (ROCK_SQUARE_WIDTH);if (!MoveAble(*RockIndex, curRockLocation, DIRECT_DOWN)){curRockLocation->top -= ROCK_SQUARE_WIDTH;}}break;case 'A':if (MoveAble(*RockIndex, curRockLocation, DIRECT_LEFT)){DisplayRock(*RockIndex, curRockLocation, false);curRockLocation->left -= ROCK_SQUARE_WIDTH;}break;case 'D':case 'd': //→if (MoveAble(*RockIndex, curRockLocation, DIRECT_RIGHT)){DisplayRock(*RockIndex, curRockLocation, FALSE);curRockLocation->left += ROCK_SQUARE_WIDTH;}break;case ' ': //暂停while (1){userHit = getch();if (userHit == ' ')break;}break;default:break;}}//判断是否满⾏,满⾏消除,然后计算得分void FullLine(){bool linefull = true;int idx = yROCK_SQUARE_NUM;//从最后⼀⾏往上查找 22int count = 0;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--;}}void UpdateSocres(int scores){setcolor(RED);TCHAR s[10];_stprintf(s, _T("%d"), scores);outtextxy(GAME_WALL_WIDTH + 90, 200, s);}//消除当前⾏void DelCurLine(int rowIdx){//擦除当前⾏setcolor(BLACK);setfillcolor(BLACK);for (int i = 1; i < xROCK_SQUARE_NUM; ++i){fillrectangle(WALL_SQUARE_WIDTH + (i - 1)*ROCK_SQUARE_WIDTH, (rowIdx - 1)*ROCK_SQUARE_WIDTH + WALL_SQUARE_WIDTH, WALL_SQUARE_WIDTH + i*ROCK_SQUARE_WIDTH, rowIdx*ROCK_SQUARE_WIDTH + WALL_SQUARE_WIDTH);}//把上⾯的向下移int cnt = 0;while (cnt != xROCK_SQUARE_NUM) //直到遇到是空⾏的为⽌cnt = 0;for (int i = 1; i <= xROCK_SQUARE_NUM; i++){game_board[rowIdx][i] = game_board[rowIdx - 1][i];//擦除上⾯的⼀⾏setcolor(BLACK);setfillcolor(BLACK);fillrectangle(WALL_SQUARE_WIDTH + ROCK_SQUARE_WIDTH*i - ROCK_SQUARE_WIDTH , WALL_SQUARE_WIDTH + ROCK_SQUARE_WIDTH*(rowIdx - 1) - ROCK_SQUARE_WIDTH , WALL_SQUARE_WIDTH + ROCK_SQUARE_WIDTH*i,WALL_SQUARE_WIDTH + ROCK_SQUARE_WIDTH*(rowIdx - 1));//显⽰下⾯的⼀⾏if (game_board[rowIdx][i] == 1){setcolor(WHITE);setfillcolor(RED);fillrectangle(WALL_SQUARE_WIDTH + ROCK_SQUARE_WIDTH*i - ROCK_SQUARE_WIDTH , WALL_SQUARE_WIDTH + ROCK_SQUARE_WIDTH*rowIdx - ROCK_SQUARE_WIDTH ,WALL_SQUARE_WIDTH + ROCK_SQUARE_WIDTH*i,WALL_SQUARE_WIDTH + ROCK_SQUARE_WIDTH*rowIdx);}if (game_board[rowIdx][i] == 0)cnt++; //统计⼀⾏是不是都是空格}//forrowIdx--;}}//是否可以移动⽅块bool MoveAble(int rockIndex, RockLocation_t* currentLocatePtr, int f_direction){int mask;int rockX;int rockY;rockX = currentLocatePtr->left;rockY = currentLocatePtr->top;mask = (unsigned short)1 << 15;for (int i = 1; i <= 16; i++){//与掩码相与为1的即为⽅块上的点if ((RockArray[rockIndex].rockShapeBits & mask) != 0){//判断能否移动(即扫描即将移动的位置是否与设置的围墙有重叠)//若是向上(即翻滚变形)if (f_direction == DIRECT_UP){//因为此情况下传⼊的是下⼀个⽅块的形状,故我们直接判断此⽅块的位置是否已经被占//判断下⼀个⽅块if (game_board[(rockY - WALL_SQUARE_WIDTH) / ROCK_SQUARE_WIDTH + 1][(rockX - WALL_SQUARE_WIDTH) / ROCK_SQUARE_WIDTH + 1] == 1)return false;}//如果是向下⽅向移动else if (f_direction == DIRECT_DOWN){if (game_board[(rockY - WALL_SQUARE_WIDTH) / ROCK_SQUARE_WIDTH + 2][(rockX - WALL_SQUARE_WIDTH) / ROCK_SQUARE_WIDTH + 1] == 1)return false;}else //如果是左右⽅向移动{ //f_direction的DIRECT_LEFT为-1,DIRECT_RIGHT为1,故直接加f_direction即可判断。
俄罗斯方块vb代码
信阳农业高等专科学校《Visual Basic程序设计》课程设计报告报告题目:俄罗斯方块系别:计算机科学系专业:应用电子班级: 10级电子一班姓名:师艳霞辅导老师:侯丽萍完成时间:2011.12.10内容简介我设计的是一个游戏《俄罗斯方块》。
打开Visual Basic程序,创建一个工程,一、新建一个窗体form1,如图所示:二、新建窗体form2,设计窗体,如图所示:将这个窗体的caption属性改为“俄罗斯方块游戏设置”,关卡(速度)内的滑动条HScroll1的largechang属性为5,mas属性为10,min属性为1,smallchange属性为1,tabindex为2。
难度(高度)内的滑动条HScroll2属性同HScroll1,min属性为0,tabindex为4。
编写代码:Private Sub Command2_Click()Form2.HideForm3.ShowEnd SubPrivate Sub Command1_Click()Form2.HideForm3.ShowForm3.Text2.Text = HScroll1.Value Form3.Text1.Text = HScroll2.Value End SubPrivate Sub HScroll2_Change()Frame2.Caption = "难度(高度):" + Str(HScroll2.Value)Command1.SetFocusEnd SubPrivate Sub HScroll2_Scroll()Frame2.Caption = "难度(高度):" + Str(HScroll2.Value)Command1.SetFocusEnd SubPrivate Sub HScroll1_Change()Frame1.Caption = "关卡(速度):" + Str(HScroll1.Value)Command1.SetFocusEnd SubPrivate Sub HScroll1_Scroll()Frame1.Caption = "关卡(速度):" + Str(HScroll1.Value)Command1.SetFocusEnd Sub三、新建窗体form3,设计窗体,如图:窗体的caption属性为“俄罗斯方块”,picture属性添加icon图片。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告文档题目俄罗斯方块一.引言1、编写目的:通过本课程设计,使学生巩固面向对象程序设计的基本概念、原理和技术,学会使用Visual C++开发工具进行简单面向对象程序的开发,将理论与实际相结合,完成一个小型面向对象程序的设计与实现,并在此基础上强化学生的实践意识,提高其实际动手能力和创新能力。
2、.定义:无3、参考资料:郑莉.C++语言程序设计.北京:清华大学出版社,2003 罗建军.大学Visual C++程序设计案例教程.北京:高等教育出版社,2004 刘路放.Visual C++与面向对象程序设计教程.北京:高等教育出版社,2000David J.Visual C++ 技术内幕.潘爱民印译.北京:清华大学出版社,1999 侯俊杰.深入浅出MFC武汉:华中科技大学出版社,2001二.任务的描述:1.目标:编写基于VC++开发工具并能通过键盘和鼠标进行人机交流俄罗斯方块游戏,界面友好,容易操作的游戏。
2.功能描述:通过控制键盘可以进行游戏的开始、暂停、结束;能够控制方块的移动、变形;具有进行经典的俄罗斯方块游戏的一般功能。
3.性能描述(1)数据精确度:无(2)时间特性:无4.运行环境:windows98以上操作系统5.条件与限制:硬件:装有Windows操作系统的计算机软件:Microsoft Visual Studio 6.0、Microsoft Visual Studio 2005三.任务设计1、程序的整个流程图下降下一个单位将新生的下坠物代替旧的“下一个下坠物”开始右移下移比如:级别、下一个方块。
数据成员:int m_oldArea;区域大小 int m_o ldLevel;等级int m_oldBlockSytle;背景风格 BOOL m_oldDrawGrid; 成员函数:一1、 COptionDlg ()初始化界面:用户选择的区域大小代码,及级别代码 ,方块样式2、 DoDataExchange()数据类型的转换:由键盘消息转换成函数响应消息3、 Onok ()当用户按0K 按钮(ID 是IDOK )时调用。
覆盖该 函数执行0K 按钮动作。
对话框 包括 自动数据检验和交换,缺省方式是对应用的某些 变量进行数据的检验和 更新。
(4) CSkyblue_RectApp ()程序自动生成。
(5) CSkyblue_RectView ()视图类:这是本游戏主要编写的地方:实现方块的随机生 成、方块的移动、变形。
游戏的消行、升级、速度的提升以及游戏的开始和结束。
数据成员:int m_nWidth; 子窗口的宽度存入等级4、主界面显示模块j 流结束图开始画封面游. 等级加一 更新速度()类是结束立MFC 程序时自动生成的类,俄罗斯方块游戏基本(1)类 1: CAboutDIg上用不到这个类,故不做解释Mai nFrame()框架类主要是对游戏的框架进行设计。
sBar m_wndStatusBar;工具栏 ar m_wn dToolBar;状态栏(2) 数据成员: 成员函数: 类2: C CStatu CToolB 1、CMainFrame()构造函数:初始化游戏;(3)/lai nF rame()析构函数:删除游戏数据;3、OnCreate():工具栏的实现 ; CreateWindow ()游戏窗口的规格实现; 类3: COptionDlg ()游戏状态显示类:主要实现对游戏在进行中的一些状态显示2、~CM 4、Pre 终止时间函数NY是否结束;画背开始游戏 画方块和分数 调用时间函数int m_nHeight; 子窗口的高度int m_iCol;int m_iRow; 列与行的数量int m_iLarge; (小方块的大小,它会随着行与列的不同而不同,具体为:12行10列,30个象素的正方形18 行15 列,2024 行20 列,1530 行25 列,12)int m_iLevel; 当前的级别,换算成速度的算法为:1500 - m_iLevel*200int m_iBlockSytle; 当前选择的方块显示样式int m_iStartX;int m_iStartY; 游戏区域左上角的坐标BOOL IsLeftLimit(); 坠物件是否可向左移动BOOL IsRightLitmit();int InterFace[74][4];接触面二维数组,记录1〜7种下坠物的1〜4种形态的接触面信息,把该下坠物的某种形态种的4个方块,有接触面则记录方位,无则为-1 标识。
int m_curre ntRect;当前的方块形状CString m_strArea;CStri ng m_strLevel;当前的样式,下一个将会出现的样式int m_icurrentStatus;int m_inextStatus;OnDraw 中需要用到的设备名称CPen *m_pBlackPen;CBrush *m_pGrayBrush;CBrush *m_pBlackBrush;BOOL m_bDrawGrid; 是否画网格线int m」Performa nee;游戏总成绩BOOL m_bGameEnd;游戏是否已结束,为FALSE表示开始,否则为结束成员函数1、ActiveStatusToGameStatus(将当前下坠物的位置映射到游戏区域地图数组中去;2、CSkyblue_RectView()初始化游戏;3、~CSkyblue_RectView()删除游戏数据;4、CurrentAreaAndLevel()用于生成当前区域大小与级别所对应的汉字描述;5、DCEnvClear()调取位图资源;6、DcEnvInitial() 绘图环境初始化;7、DrawGame(CDC *pDC)绘制整个游戏所在窗口的背景;8、InvalidateCurrent()刷新当前的区域;9、IsBottom()判断当前方块是否已到底,并且销行等相关的工作;10、IsLeftLimit() 方块是否还可以左移;11 、IsRightLitmit() 方块是否还可以右移;12、OnCreate(LPCREATESTRUCT lpCreateStruct) 创建一些设备;13、OnDraw(CDC* pDC)承担所有绘制屏幕工作;14、OnGameEnd() 游戏结束;15、OnGameExit()清理内存设备环境,释放资源;16、OnGameOption() 游戏设置;17、OnGamePaush(游戏暂停;18、 OnGameStartfl 游戏开始; 19、 OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)()处理用户的输入,方块的 左,右移,加速及变形;20、 OnOptionArea()用菜单设置区域大小; 21、 OnOptionLevel1()用菜单设置游戏级别: 22、 OnTimer()承担所有驱动工作; 23、 OnUpdateGameEnd(CCmdUI* pCmdUI)()如果游戏开始,则此[游戏结束]按钮被开启; 24、 OnUpdateGameExit(CCmdUI* pCmdUI)如果游戏开始,则此[退出系统]按钮被屏蔽; 25、 OnUpdateGamePaush(CCmdUI* pCmdUI)如游戏开始,则[游戏暂停]按钮开启 26、 Random(int MaxNumber):产生一个最大值不大于指定值的随机正整数 (Random); 27、 RectArrow(int m_Type):当前方块下降加速,左移,右移 28、 RectChange()方块的变形 29、 RectDown()当前方块下降 30、 RectStatusToActiveStatus(int m_which)初始掉落时,将根据方块的样式决定当前动态数组的值 一 31、 RectStatusToNextStatus(int m_which)初始掉落时,将根据方块的样式决定下一次将要 掉下来的动态数组的值32、3 •类之间的关系:1 .问题1(1) 问题描述:所遇问题的描述。
(2) 解决办法:该问题的解决办法2 .问题2(1) 问题描述:所遇问题的描述。
(2) 解决办法:该问题的解决办法五.程序运行1、游戏主页面CAboutDlg四.编写代码CMain FrameSkyblue_Rect c^s 包sses _________ 含CSkyblue_Re ctView游戏(G)远项(0J構助(H)祚戏级别选择:I第四级:中高级右块样式选择:|兰白条级两网格背景厂背景音乐OK Cancel设置按钮2、游戏开始:注:右上角是下一个方块右下角分别显示分数、游戏大小和级别。
3、开始时可以按暂停按钮出现下面情况开始按钮被激活4、按结束按钮出现设置按钮激活5、消行及得分6、升级7、游戏结束3.错误描述及其解决办法( 1)问题1:问题描述:所遇问题的描述。
解决办法:该问题的解决办法。
(2)问题 2问题描述:所遇问题的描述。
解决办法:该问题的解决办法六、感想认识通过本次课程设计,谈谈对面向对象编程的体会。
七.程序代码skyblue_Rect.cpp : Defines the class behaviors for the application.//#include "stdafx.h"#include "skyblue_Rect.h"#include "MainFrm.h"#include "skyblue_RectDoc.h"#include "skyblue_RectView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif ///////////////////////////////////////////////////////////////////////////// // CSkyblue_RectAppBEGIN_MESSAGE_MAP(CSkyblue_RectApp, CWinApp)//{{AFX_MSG_MAP(CSkyblue_RectApp)ON_COMMAND(ID_APP_ABOUT, OnAppAbout)// NOTE - the ClassWizard will add and remove mapping macros here. // DO NOTEDIT what you see in these blocks of generated code!//}}AFX_MSG_MAP// Standard file based document commandsON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen) // Standard print setup commandON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CSkyblue_RectApp construction CSkyblue_RectApp::CSkyblue_RectApp() {// TODO: add construction code here,// Place all significant initialization in InitInstance} ///////////////////////////////////////////////////////////////////////////// // The one and only CSkyblue_RectApp object CSkyblue_RectApp theApp;/////////////////////////////////////////////////////////////////////////////// CSkyblue_RectApp initializationBOOL CSkyblue_RectApp::InitInstance(){AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size// of your final executable, you should remove from the following// the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL#elseEnable3dControlsStatic(); // Call this when linking to MFC statically #endif// Change the registry key under which our settings are stored.// TODO: You should modify this string to be something appropriate// such as the name of your company or organization.SetRegistryKey(_T("Local AppWizard-Generated Applications"));LoadStdProfileSettings(0); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. CSingleDocTemplate*pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS(CSkyblue_RectDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame windowRUNTIME_CLASS(CSkyblue_RectView));AddDocTemplate(pDocTemplate);// Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);// Dispatch commands specified on the command lineif (!ProcessShellCommand(cmdInfo))return FALSE;// The one and only window has been initialized, so show and update it.m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow();return TRUE;}/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg();// Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected:virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support //}}AFX_VIRTUAL// Implementation protected://{{AFX_MSG(CAboutDlg)// No message handlers //}}AFX_MSG DECLARE_MESSAGE_MAP()}; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) {//{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAP END_MESSAGE_MAP() // App command to run the dialog void CSkyblue_RectApp::OnAppAbout() {CAboutDlg aboutDlg;aboutDlg.DoModal();} /////////////////////////////////////////////////////////////////////////////// CSkyblue_RectApp message handlers// OptionDlg.cpp : implementation file//#include "stdafx.h"#include "skyblue_Rect.h"#include "OptionDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// COptionDlg dialogCOptionDlg::COptionDlg(int m_iArea, int m_iLevel, int m_iBlockStyle,BOOL m_bMusic, BOOL m_bDrawGrid, CWnd* pParent /*=NULL*/): CDialog(COptionDlg::IDD, pParent){ m_oldArea = m_iArea; m_oldLevel = m_iLevel; m_oldBlockSytle = m_iBlockStyle; m_oldMusic = m_bMusic; m_oldDrawGrid = m_bDrawGrid; //{{AFX_DATA_INIT(COptionDlg) m_bMusic = FALSE;m_bDrawGrid = FALSE; //}}AFX_DATA_INIT}void COptionDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(COptionDlg) DDX_Check(pDX, IDC_CHECK_GRID, m_bDrawGrid);DDX_Check(pDX, IDC_CHECK_MUSIC, m_bMusic); //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(COptionDlg, CDialog) //{{AFX_MSG_MAP(COptionDlg)ON_WM_CREATE()// NOTE: the ClassWizard will add message map macros here //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // COptionDlg message handlers int COptionDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CDialog::OnCreate(lpCreateStruct) == -1) return -1;return 0;}BOOL COptionDlg::OnInitDialog(){CDialog::OnInitDialog();//参传来的参数赋初值CComboBox *m_comboArea;CComboBox *m_comboLevel;CComboBox *m_comboBlockStyle;CButton *m_btnDrawGrid;CButton *m_btnMusic;m_comboArea = (CComboBox *)GetDlgItem(IDC_COMBO_AREA);m_comboArea -> SetCurSel( m_oldArea );m_comboLevel = (CComboBox *)GetDlgItem(IDC_COMBO_LEVEL); m_comboLevel -> SetCurSel( m_oldLevel );m_comboBlockStyle = (CComboBox *)GetDlgItem(IDC_COMBO_BLOCK_SYTLE); m_comboBlockStyle -> SetCurSel( m_oldBlockSytle );m_btnDrawGrid = (CButton *)GetDlgItem(IDC_CHECK_GRID);m_btnDrawGrid -> SetCheck(m_oldDrawGrid);m_btnMusic = (CButton *)GetDlgItem(IDC_CHECK_MUSIC);m_btnMusic -> SetCheck(m_oldMusic);return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE}void COptionDlg::OnOK(){CComboBox *m_comboArea;CComboBox *m_comboLevel;CComboBox *m_comboBlockStyle;m_comboArea = (CComboBox *)GetDlgItem(IDC_COMBO_AREA); m_comboLevel = (CComboBox *)GetDlgItem(IDC_COMBO_LEVEL); m_comboBlockStyle = (CComboBox *)GetDlgItem(IDC_COMBO_BLOCK_SYTLE); m_iArea = m_comboArea -> GetCurSel();if (m_iArea<0 || m_iArea>3)m_iArea = 0;m_iLevel = m_comboLevel -> GetCurSel();if (m_iLevel<0 || m_iLevel>5)m_iLevel = 2;m_iBlockStyle = m_comboBlockStyle -> GetCurSel();if (m_iBlockStyle<0 || m_iBlockStyle>5)m_iBlockStyle = 0;CDialog::OnOK();}// skyblue_Rect.cpp : Defines the class behaviors for the application.//#include "stdafx.h"#include "skyblue_Rect.h"#include "MainFrm.h"#include "skyblue_RectDoc.h"#include "skyblue_RectView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif ///////////////////////////////////////////////////////////////////////////// // CSkyblue_RectAppBEGIN_MESSAGE_MAP(CSkyblue_RectApp, CWinApp)//{{AFX_MSG_MAP(CSkyblue_RectApp)ON_COMMAND(ID_APP_ABOUT, OnAppAbout)// NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDITwhat you see in these blocks of generated code!//}}AFX_MSG_MAP// Standard file based document commandsON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)// Standard print setup commandON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CSkyblue_RectApp construction CSkyblue_RectApp::CSkyblue_RectApp() {// TODO: add construction code here,// Place all significant initialization in InitInstance }///////////////////////////////////////////////////////////////////////////// // The one and only CSkyblue_RectApp object CSkyblue_RectApp theApp;///////////////////////////////////////////////////////////////////////////// //CSkyblue_RectApp initialization BOOL CSkyblue_RectApp::InitInstance() {AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size// of your final executable, you should remove from the following// the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL#elseEnable3dControlsStatic(); // Call this when linking to MFC statically #endif// Change the registry key under which our settings are stored.// TODO: You should modify this string to be something appropriate// such as the name of your company or organization.SetRegistryKey(_T("Local AppWizard-Generated Applications"));LoadStdProfileSettings(0); // Load standard INI file options (including MRU) //Register the application's document templates. Document templates // serve as theconnection between documents, frame windows and views. CSingleDocTemplate*pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CSkyblue_RectDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame windowRUNTIME_CLASS(CSkyblue_RectView));AddDocTemplate(pDocTemplate);// Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);// Dispatch commands specified on the command lineif (!ProcessShellCommand(cmdInfo))return FALSE;// The one and only window has been initialized, so show and update it.m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow();return TRUE;}/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementationprotected://{{AFX_MSG(CAboutDlg)// No message handlers//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP} BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAP END_MESSAGE_MAP() // App command to run the dialog voidCSkyblue_RectApp::OnAppAbout() {CAboutDlg aboutDlg;aboutDlg.DoModal();} ///////////////////////////////////////////////////////////////////////////// // CSkyblue_RectApp message handlers// skyblue_RectDoc.cpp : implementation of the CSkyblue_RectDoc class//#include "stdafx.h"#include "skyblue_Rect.h"#include "skyblue_RectDoc.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif ///////////////////////////////////////////////////////////////////////////// // CSkyblue_RectDoc IMPLEMENT_DYNCREATE(CSkyblue_RectDoc, CDocument)BEGIN_MESSAGE_MAP(CSkyblue_RectDoc, CDocument) //{{AFX_MSG_MAP(CSkyblue_RectDoc) // NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CSkyblue_RectDoc construction/destructionCSkyblue_RectDoc::CSkyblue_RectDoc(){// TODO: add one-time construction code here} CSkyblue_RectDoc::~CSkyblue_RectDoc(){}BOOL CSkyblue_RectDoc::OnNewDocument(){if (!CDocument::OnNewDocument()) return FALSE;// TODO: add reinitialization code here// (SDI documents will reuse this document)return TRUE;} /////////////////////////////////////////////////////////////////////////////// CSkyblue_RectDoc serializationvoid CSkyblue_RectDoc::Serialize(CArchive& ar){if (ar.IsStoring()){// TODO: add storing code here}else{// TODO: add loading code here}} /////////////////////////////////////////////////////////////////////////////// CSkyblue_RectDoc diagnostics#ifdef _DEBUGvoid CSkyblue_RectDoc::AssertValid() const{ CDocument::AssertValid();}void CSkyblue_RectDoc::Dump(CDumpContext& dc) const{ CDocument::Dump(dc);}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CSkyblue_RectDoc commands// skyblue_RectView.cpp : implementation of the CSkyblue_RectView class //#include "stdafx.h"#include "skyblue_Rect.h"#include "skyblue_RectDoc.h"#include "skyblue_RectView.h"#include "OptionDlg.h"//音乐播放#include "mmsystem.h"#pragma comment(lib,"Winmm.lib")#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CSkyblue_RectViewIMPLEMENT_DYNCREATE(CSkyblue_RectView, CView)BEGIN_MESSAGE_MAP(CSkyblue_RectView, CView)//{{AFX_MSG_MAP(CSkyblue_RectView)ON_COMMAND(ID_GAME_EXIT, OnGameExit)ON_COMMAND(ID_HELP_ABOUT, OnHelpAbout)//}}AFX_MSG_MAP// Standard printing commandsON_WM_KEYDOWN()ON_WM_TIMER()ON_COMMAND(ID_GAME_START, OnGameStart)ON_COMMAND(ID_GAME_END, OnGameEnd)ON_COMMAND(ID_GAME_OPTION, OnGameOption) ON_UPDATE_COMMAND_UI(ID_GAME_START,OnUpdateGameStart) ON_UPDATE_COMMAND_UI(ID_GAME_OPTION, OnUpdateGameOption)ON_UPDATE_COMMAND_UI(ID_GAME_END, OnUpdateGameEnd) ON_UPDATE_COMMAND_UI(ID_GAME_EXIT, OnUpdateGameExit) ON_UPDATE_COMMAND_UI(ID_HELP_ABOUT, OnUpdateHelpAbout)ON_UPDATE_COMMAND_UI(ID_HELP_HELP, OnUpdateHelpHelp) ON_WM_CREATE()ON_COMMAND(ID_HELP_HELP, OnHelpHelp)ON_UPDATE_COMMAND_UI(ID_OPTION_AREA1, OnUpdateOptionArea1)ON_UPDATE_COMMAND_UI(ID_OPTION_AREA2, OnUpdateOptionArea2)ON_UPDATE_COMMAND_UI(ID_OPTION_AREA3, OnUpdateOptionArea3)ON_UPDATE_COMMAND_UI(ID_OPTION_AREA4, OnUpdateOptionArea4)ON_COMMAND(ID_OPTION_AREA1, OnOptionArea1)ON_COMMAND(ID_OPTION_AREA2, OnOptionArea2)ON_COMMAND(ID_OPTION_AREA3, OnOptionArea3)ON_COMMAND(ID_OPTION_AREA4, OnOptionArea4)ON_UPDATE_COMMAND_UI(ID_OPTION_LEVEL1, OnUpdateOptionLevel1)ON_UPDATE_COMMAND_UI(ID_OPTION_LEVEL2, OnUpdateOptionLevel2)ON_UPDATE_COMMAND_UI(ID_OPTION_LEVEL3, OnUpdateOptionLevel3)ON_UPDATE_COMMAND_UI(ID_OPTION_LEVEL4, OnUpdateOptionLevel4)ON_UPDATE_COMMAND_UI(ID_OPTION_LEVEL5, OnUpdateOptionLevel5)ON_UPDATE_COMMAND_UI(ID_OPTION_LEVEL6, OnUpdateOptionLevel6)ON_COMMAND(ID_OPTION_LEVEL1, OnOptionLevel1)ON_COMMAND(ID_OPTION_LEVEL2, OnOptionLevel2)ON_COMMAND(ID_OPTION_LEVEL3, OnOptionLevel3)ON_COMMAND(ID_OPTION_LEVEL4, OnOptionLevel4)ON_COMMAND(ID_OPTION_LEVEL5, OnOptionLevel5)ON_COMMAND(ID_OPTION_LEVEL6, OnOptionLevel6)ON_UPDATE_COMMAND_UI(ID_OPTION_GRID, OnUpdateOptionGrid)ON_COMMAND(ID_OPTION_GRID, OnOptionGrid)ON_UPDATE_COMMAND_UI(ID_OPTION_MUSIC, OnUpdateOptionMusic)ON_COMMAND(ID_OPTION_MUSIC, OnOptionMusic)ON_UPDATE_COMMAND_UI(ID_GAME_PAUSH, OnUpdateGamePaush)ON_COMMAND(ID_GAME_PAUSH, OnGamePaush)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CSkyblue_RectView construction/destructionCSkyblue_RectView::CSkyblue_RectView(){//第一次开始游戏m_bFistPlay = TRUE;//缺省为不是游戏暂停状态m_bGamePaush = FALSE;//缺省为不插放背景音乐m_bMusic = FALSE;//缺省为画网格线m_bDrawGrid = TRUE;//总分值清零m_iPerformance = 0;//测试值:为12 行,10列m_iRow = 12;m_iCol = 10;//左上角X,Y 坐标m_iStartX = 10;m_iStartY = 10;//缺省级别为 3 级m_iLevel = 2;//第一种样式m_iBlockSytle = 0;//缺省方块大小为m_iLarge 个象素m_iLarge = 30;//缺省游戏是结束的m_bGameEnd = TRUE;int i,j;//赋初值for (i=0;i<100;i++)for (j=0;j<100;j++)*/InterFace[6][0] = 0; InterFace[6][1] = 3;InterFace[61][0] = 1; InterFace[61][1] = 2;InterFace[62][0] = 2; InterFace[62][1] = 3; InterFace[61][2] = 3; InterFace[63][2] = 3;GameStatus[i][j]=0;// 各种形状方块的接触面数据,参见设计书的接触面表格, // 如果某种形状的方块没有4 个接触面,则后面的数据填-1 for (i=0;i<74;i++)for(j=0;j<4;j++)InterFace[i][j]= -1;/*1*/InterFace[1][0] = 3;InterFace[11][0] = 0; InterFace[11][1] = 1; InterFace[11][2] = 2;= 3;/*2-- */InterFace[2][0] = 1;/*3-*//* InterFace[11][3]InterFace[2][1] = 3;InterFace[3][0] = 0;InterFace[31][0] = 2;InterFace[32][0] = 0;InterFace[33][0] = 0; /* 4 --*/InterFace[4][0] = 1;InterFace[41][0] = 0; /* 5 --*/InterFace[5][0] = 1;InterFace[51][0] = 0; /* 6 -- InterFace[3][1] = 2; InterFace[3][2]= 3;InterFace[31][1] = 3;InterFace[32][1] = 2;InterFace[33][1] = 3;InterFace[4][1] =3;InterFace[41][1] =InterFace[5][1] =3;InterFace[51][1] =InterFace[32][2] = 3InterFace[41][2] = 3InterFace[51][2] = 37*/InterFace[7][0] = 2; InterFace[7][1] = 3;InterFace[71][0] = 1; InterFace[71][1] = 2; InterFace[71][2] = 3;InterFace[72][0] = 0; InterFace[72][1] = 3;InterFace[73][0] = 0; InterFace[73][1] = 1; InterFace[73][2] = 3;}CSkyblue_RectView::~CSkyblue_RectView(){}BOOL CSkyblue_RectView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////////////////// CSkyblue_RectView drawing//创建一些设备int CSkyblue_RectView::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CView::OnCreate(lpCreateStruct) == -1)return -1;m_inextStatus = Random(7);return 0;}void CSkyblue_RectView::OnDraw(CDC* pDC){DcEnvInitial();DrawGame(&m_memDC); pDC->BitBlt(0,0,m_nWidth,m_nHeight,&m_memDC,0,0,SRCCOPY);}////void CSkyblue_RectView::DcEnvInitial(void){if(m_bFistPlay){m_bFistPlay = FALSE; //用默认的参数,获取当前屏幕设备环境CDC *pWindowDC =GetDC(); //1.用于映射屏幕的内存设备环境//获取游戏窗口的大小用于下面设置内存位图的尺寸CRect windowRect;GetClientRect(&windowRect);m_nWidth = windowRect.Width(); m_nHeight = windowRect.Height(); //内存设备环境与屏幕设备环境关联(兼容) m_memDC.CreateCompatibleDC(pWindowDC); //内存位图与与屏幕关联(兼容),大小为游戏窗口的尺寸m_memBmp.CreateCompatibleBitmap(pWindowDC,m_nWidth,m_nHeight);//内存设备环境与内存位图关联,以便通过m_memDC在内存位图上作画m_memDC.SelectObject(&m_memBmp);//2.存储方块位图的内存资源//内存设备环境与屏幕设备环境关联(兼容)m_memRectDC.CreateCompatibleDC(pWindowDC);//相当于将外部位图rect.bmp动态载入m_hMemRectBmp中m_hMemRectBmp=(HBITMAP)LoadImage(NULL,"rect.bmp",IMAGE_BITMAP,150,30,L R_LOADFROMFILE);〃内存设备环境与内存位图关联,以便通过m_memDC在内存位图上作画SelectObject(m_memRectDC.m_hDC, m_hMemRectBmp);//黑色的黑笔m_pBlackPen = new CPen(PS_SOLID,1,BLACK);//画刷m_pGrayBrush = new CBrush(RGB(66,66,66)); m_pBlackBrush = new CBrush(BLACK);}}void CSkyblue_RectView::DCEnvClear(void){//设备环境m_memDC.DeleteDC(); m_memRectDC.DeleteDC();//位图资源DeleteObject(m_memBmp);DeleteObject(m_hMemRectBmp); delete(m_pBlackPen); delete(m_pGrayBrush);delete(m_pBlackBrush);}void CSkyblue_RectView::DrawGame(CDC *pDC){int i,j;pDC -> SelectObject(m_pBlackBrush);CRect rect;GetClientRect(&rect);pDC -> Rectangle(rect);pDC -> SelectObject(m_pGrayBrush);pDC -> Rectangle(m_iStartY ,m_iStartX, m_iStartY + 301, m_iStartX + 360);pDC->SelectObject(m_pBlackPen);//画网格线if (m_bDrawGrid){//画横线for (i=0;i<m_iRow;i++){ pDC->MoveTo(m_iStartY, m_iStartX + i*m_iLarge); pDC->LineTo(m_iStartY+300, m_iStartX +i*m_iLarge);}//画竖线for (i=0;i<m_iCol;i++){ pDC->MoveTo(m_iStartY+i*m_iLarge, m_iStartX); pDC->LineTo(m_iStartY+i*m_iLarge, m_iStartX+360);}}int x,y,nW,nH;//小方块的绘制for (i=0;i<m_iRow;i++)for (j=0;j<m_iCol;j++){ if (GameStatus[i][j]==MAP_STATE_NOT_EMPTY) {//在游戏区域中状态为被占用状态的区域绘制小方块x = m_iStartY+j*m_iLarge +2;y = m_iStartX+i*m_iLarge +2; nW = m_iLarge-4; nH = m_iLarge-4;pDC->BitBlt(x,y,nW,nH,&m_memRectDC,m_iBlockSytle*30,0,SRCCOPY); } }if (!m_bGameEnd){pDC -> SetBkColor(BLACK);pDC -> SetTextColor(WHITE);pDC -> TextOut(m_iStartY+320, m_iStartX+220, " 游戏区域大小:"); pDC -> TextOut(m_iStartY+320, m_iStartX+240,m_strArea);pDC -> TextOut(m_iStartY+320, m_iStartX+280, " 游戏级别:");pDC -> TextOut(m_iStartY+320, m_iStartX+300,m_strLevel);} //显示总分if (!m_bGameEnd){CString lsStr;IsStr.Format(” 总分为:%d 分",m」Peformanee);pDC -> SetBkColor(BLACK);pDC -> SetTextCoIor(WHITE);pDC -> TextOut(m_iStartY+320, m_iStartX+180,IsStr);}if (!m_bGameEnd){pDC -> SetBkCoIor(BLACK);pDC -> SetTextCoIor(WHITE);pDC -> TextOut(m_iStartY+320, m_iSta rtX, "下一个方块:");int x,y,nW,nH;for (UINT k=0;k<4;k++){i = NextStatus[k][0];j = NextStatus[k][1];x = m_iStartY+j*30 +2+320;y = m_iStartX+i*30 +2+30;nW = m_iLarge-4;nH = m_iLarge-4;pDC->BitBIt(x,y,nW,nH,&m_memReetDC,m_iBIoekSytIe*30,0,SRCCOPY); } }}void CSkybIue_ReetView::OnTimer(UINT nIDEvent){int i,j,k;if (m_isBottom){ //1.产生下一个随机下坠物m_ieurrentStatus = m_inextStatus;m_inextStatus = Random(7); //得到下一次的方块样式// if (m_inextStatus==0) m_inextStatus++;//2 .修改新的“下一下坠物”ReetStatusToNextStatus( m_inextStatus );// CReet reet(m_iStartY+320, m_iStartX, m_iStartY+440, m_iStartX+160);// InvaIidateReet(&reet);// InvaIidate(FALSE); //3.将旧的“下一下坠物”用作当前使用m_eurrentReet = m_ieurrentStatus;//根据当前下坠物的形状去初始化激活状态下的下坠物坐标ReetStatusToAetiveStatus( m_ieurrentStatus );//将当前动态数组中的数据反映到大数组中AetiveStatusToGameStatus(); m_isBottom = FALSE;//4.判断当前方块是否已到底IsBottom();//5.判断游戏是否已结束: 碰了底,且第 1 行有小方块if (m_isBottom) for (i=0;i<m_iCol;i++) if (GameStatus[0][i]) {KillTimer(1);AfxMessageBox(‘ 游戏已结束!");for (j=0;j<m_iRow;j++)for (k=0;k<m_iCol;k++)GameStatus[j][k]=0;Invalidate(FALSE);m_bGameEnd = TRUE;break;}}else{RectDown();}CView::OnTimer(nIDEvent);}int CSkyblue_RectView::Random(int MaxNumber){srand( (unsigned)time( NULL ) );//产生随机数int random = rand() % MaxNumber;// 保证非0if(random == 0 ) random++;return random;}void CSkyblue_RectView::ActiveStatusToGameStatus(){int x1,x2,x3,x4,y1,y2,y3,y4;。