文档详情

chapter扫雷做法详解.ppt

发布:2017-09-09约1.75万字共70页下载文档
文本预览下载声明
Windows 程序设计 西安邮电学院 系统结构教研室 指导老师:范琳 扫雷游戏做法详解 分析游戏界面 如何制作剩余雷数框 如何制作时间框 装入各种资源文件 如何制作中心控制按钮 用矩阵来表示游戏区? 初始化 处理所有的消息 算法中的精华——迭代算法 游戏介绍: 游戏区16×16的矩阵中,随机播撒40个地雷。 对于每个方格,如果没有雷,则计算它周围8个相邻方格中雷的个数,填入自己方格内。 左键按下,使得方块或复位按钮处于被按下的状态。 左键弹起,能使的方块翻开。点击到雷,游戏结束。 鼠标左键按下且移动,使得途经的方块处于被按下的状态,移开后,方块恢复正常状态。 右键1次点击,能使的方块标记为有雷,2次点击,使的方块标记为“?”,3次点击,清除标记。正确标记完所有雷,游戏成功。 左右双键同时点击,如果方块相邻8个位置中的标记数=方块显示的数字,则相邻8个方块中未被标记的方块都被翻开。 分析游戏界面 扫雷游戏做法详解 分析游戏界面 如何制作剩余雷数框 如何制作时间框 装入各种资源文件 如何制作中心控制按钮 用矩阵来表示游戏区? 初始化 处理所有的消息 算法中的精华——迭代算法 如何制作剩余雷数框? 在一个16×16大小的游戏区中,雷数初始化为40。需要一个全局变量:int mines_left=40; 雷数显示的位置在哪里呢?定义一个rect,便于我们输出数据和刷新。 RECT mines_left_rc={0,0,0,0}; case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; mines_left_rc.left = 30; mines_left_rc.top = (50-15)/2; mines_left_rc.right = mines_left_rc.left+3*cxChar; mines_left_rc.bottom = mines_left_rc.top+cyChar; 显示雷数值 显示这样一个值,可以有多种方法,方法一: char szTemp[10]; ZeroMemory(szTemp,10); TextOut(hdc, mines_left_rc.left, mines_left_rc.top, szTemp,wsprintf (szTemp, TEXT (%d), mines_left)); 方法二: char szTemp[10]; ZeroMemory(szTemp,10); ltoa(mines_left,szTemp,10); TextOut(hdc, mines_left_rc.left, mines_left_rc.top, szTemp,strlen(szTemp)); 方法三: char szTemp[10]; ZeroMemory(szTemp,10); szTemp[0]= mines_left/10 +48; szTemp[1]=mines_left%10+ 48; TextOut(hdc, mines_left_rc.left, mines_left_rc.top, szTemp, strlen(szTemp)); 每次有方块被标记为有雷时,mines_left--; 并且刷新time_rc即可: InvalidateRect(main_hwnd,time_rc,TRUE); 如何制作时间框 时间的显示与剩余雷数的显示类似,也需要一个全局变量来表示时间。 int time_count=0; 同时定义一个rect,便于我们输出时间与更新: RECT time_rc={0,0,0,0}; case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; time_rc.left = cxClient-40; time_rc.top = (50-15)/2; time_rc.right = time_rc.left+4*cxChar; time_rc.bottom = time_rc.top+cyChar; 在游戏开始时设置一个计时器: SetTimer(hwnd,TIMER_SEC,1000,NULL); 每个时间消息来时,都做以下工作: case WM_TIMER: if(游戏还在进行) { time_count++; 使得时间框无效,即刷新时间框。 } break; 当重新开始新一轮的游戏时,使得 time_count=0; 扫雷游戏做法详解 分析游戏界面 如
显示全部
相似文档