《小游戏编程实例》由会员分享,可在线阅读,更多相关《小游戏编程实例(22页珍藏版)》请在金锄头文库上搜索。
1、Win-Tc (C 语言) 小游戏编程实例扫雷游戏的游戏界面采用 3D 窗体显示,用鼠标操作实现整个游戏过程。图、3D 窗体扫雷游戏界面图、游戏中打开非雷方块 游戏规则 游戏开始时, 系统会在布雷区小方块中随机设置游戏级别中规则的雷体个数。 布好雷后 系统会在非雷方块中填上表示其周围个方块中有多少雷体的数字, (如图所示) 。 玩家用 鼠标左键点开布雷区方块后开始计时, 玩家可根据非雷方块中数字正确判断打开所有非雷方 块后,游戏胜利结束,系统会自动打开所有雷方块,并显示胜利会话框。在游戏过程中,如 果提前打开雷方块则立即失败,游戏结束(如图所示) 。游戏计时为 999 秒,如果时间到 了系统会
2、自动结束游戏。图 3、提前打开雷方块图 4、打开 Game 按钮子菜单 Game 按钮单击事件 鼠标左键单击 Game 按钮会打开如图所示的子程序选择会话框, 玩家可选择种功能 中的某一项来实现某种功能。种功能分别如下所示: BEGIN 按钮开局(重新开始) PRIMARY 按钮初级(级别) INTERMEDIATE中级(级别) HIGH 按钮高级(级别) EXIT返回操作系统(退出应用程序) 程序基本流程如下: 开始调用鼠标程序(如果调用失败退出)创建并显示窗体布雷(初始化设置)游戏(玩家操作(打开非雷方块、提前打开雷方块游戏结束、Game 事件(重新开 始) )判断胜利(胜利(显示胜利会话
3、框) 、Game 事件(重新开始) )Close 按钮事 件(退出应用程序返回操作系统) 扫雷游戏程序源码清单如下: #include #include #include #include #definePRIMARY1/*初级标识符*/ #definePRIMARYCOLUMN9/*初级布雷区列数*/ #definePRIMARYROW9/*初级布雷区行数*/ #definePRIMARYMINE10 /*初级布雷区雷的数目*/ #defineINTERMEDIATE2/*中级标识符*/ #defineINTERMEDIATECOLUMN 16 /*中级布雷区列数*/ #defineINTE
4、RMEDIATEROW16 /*中级布雷区行数*/ #defineINTERMEDIATEMINE40 /*中级布雷区雷的数目*/ #defineHIGH3/*高级标识符*/ #defineHIGHCOLUMN30 /*高级布雷区列数*/ #defineHIGHROW16 /*高级布雷区行数*/ #defineHIGHMINE99 /*高级布雷区雷的数目*/ #defineGAMEOVER1/*游戏结束标识符*/*定义鼠标数据类型*/ typedef struct MOUSE int mx; /*鼠标 x 坐标值*/ int my; /*鼠标 y 坐标值*/ int mkey;/*鼠标按钮状态
5、*/ char fillcolor1616;/*鼠标覆盖下的颜色*/ Mouseh; /*定义按钮数据类型*/ typedef struct BUTTON intleft; inttop; intright; intdown; char *caption;/*按钮标题标识*/ char table100;/*按钮目录标题标识*/ intfillcolor;/*按钮面颜色标识*/ intfontcolor;/*按钮面字体颜色标识*/ BUTTON;/*定义窗口数据类型*/ typedef struct WINDOW intleft; inttop; intwidth; intheight; in
6、tbackcolor;/*窗体背景颜色*/ char *caption;/*窗体标题*/ BUTTON close;/*窗体关闭按钮*/ BUTTON game;/*游戏按钮*/ BUTTON help;/*帮助按钮*/ BUTTON settime;/*显示时间按钮*/ BUTTON minenumber;/*显示游戏区间雷体数目按钮*/ Hwnd; /*定义布雷区数据类型*/ typedef struct MINEFIELD intleft; inttop; intright; intdown; intstatus; /*是否有雷的标识状态符*/ intopenst; /*雷区是否打开的标
7、识符*/ intminenumbers;/*雷区周围有多少雷的标识符*/ MINEFIELD; /*-=-=-=-=-=-=-= 全局变量 -=-=-=-=-=-=-=-=-*/ /*鼠标屏幕绘码*/ char MouseMask=0x00,0x00,0x40,0x00,0x60,0x00,0x70,0x00, 0x78,0x00,0x7c,0x00,0x7e,0x00,0x7f,0x00, 0x7f,0x80,0x7f,0xc0,0x6c,0x00,0x46,0x00, 0x06,0x00,0x03,0x00,0x01,0x80,0x00,0x00 ; /*鼠标屏幕绘码边框码*/ char
8、MouseMaskE=0xc0,0x00,0xa0,0x00,0x90,0x00,0x88,0x00, 0x84,0x00,0x82,0x00,0x81,0x00,0x80,0x80, 0x80,0x40,0x80,0x20,0x93,0xf0,0xa9,0x00, 0xc9,0x00,0x04,0x80,0x02,0x40,0x01,0xc0 ; int newx=0,newy=0;/*定义鼠标(x,y)坐标状态变量*/ MINEFIELD MineHIGHROWHIGHCOLUMN;/*布雷区域大小数组*/ HwndhWnd;/*窗口句柄*/ Mouseh *hw;/*鼠标句柄*/ int
9、 row;/*雷区行标识*/int column;/*雷区列标识*/ int mine;/*雷区雷数标识*/ int end;/*游戏结束标识*/ int begin;/*游戏开始标识*/ int mtime;/*游戏用时标识*/ int active;/*当前活动窗体标识*/ /*Game 按钮子菜单项目录*/ static char *MENU5=“BEGIN“,“PRIMARY“,“INTERMEDIATE“,“HIGH“,“EXIT“; /*间接递归 Select()函数*/ void SelectLoop(int r,int c); /*= 鼠标模块源码 =*/ /*鼠标初始化函数*
10、/ int MouseInit(int Xmin,int Xmax,int Ymin,int Ymax) int retcode; union REGSregs;regs.x.ax=0; int86(51, retcode=regs.x.ax; if(retcode=0) return 0; regs.x.ax=7; regs.x.cx=Xmin; regs.x.dx=Xmax; int86(51, regs.x.ax=8; regs.x.cx=Ymin; regs.x.dx=Ymax; int86(51, return retcode; /*显示鼠标*/ void ShowMouse(Mou
11、seh *hw,int mousecolor) int i,j,k;for(i=0;ifillcolorij=getpixel(hw-mx+j,hw-my+i); for(j=0;jk)putpixel(hw-mx+i*8+k,hw-my+j,mousecolor); for(j=0;jk) putpixel(hw-mx+i*8+k,hw-my+j,0); /*鼠标屏幕恢复*/ void HideMouse(Mouseh *hw) int i,j;for(i=0;imx+j,hw-my+i,hw-fillcolorij); /*按目录设置按钮*/ void SetButton1(BUTTON
12、bt) setfillstyle(1,bt.fillcolor); bar(bt.left,bt.top,bt.right,bt.down); setcolor(bt.fontcolor); outtextxy(bt.left+6,bt.top+7,bt.table); /*读取鼠标位置和按钮状态*/ void MouseRead(Mouseh *hd) union REGS r1; int dx,dy,ky; struct time t,t1;gettime( do gettime( if(t1.ti_sect.ti_sec) t1.ti_sec=t.ti_sec; if(begin) if
13、(t.ti_sec-t1.ti_sec=1) mtime+=1; sprintf(hWnd.settime.table,“%d“,mtime); SetButton1(hWnd.settime); t1.ti_sec=t.ti_sec;if(mtime=999) begin=0; end=GAMEOVER; break; r1.x.ax=3; int86(51, dx=r1.x.cx; dy=r1.x.dx; hd-mkey=r1.x.bx; if(hd-mkey) break; while(dx=newx HideMouse(hd); hd-mx=r1.x.cx; hd-my=r1.x.dx
14、; newx=hd-mx; newy=hd-my; /*=绘制框体模块源码 =*/ /*绘制阴影在左边的框体*/ void DrawBox1(int left,int top,int right,int down,int fillcolor) setfillstyle(1,fillcolor); bar(left,top,right,down); setcolor(15); line(right,top,right,down); line(left,down,right,down); setcolor(8); line(left,top,left,down); line(left,top,ri
15、ght,top); /*绘制阴影在右边的框体*/ void DrawBox2(int left,int top,int right,int down,int fillcolor) setfillstyle(1,fillcolor); bar(left,top,right,down); setcolor(15); line(left,top,left,down); line(left,top,right,top);setcolor(8); line(right,top,right,down); line(left,down,right,down); /*绘制雷区 3D 框体*/ void DrawBox(int left,int top,int right,int down,int fillcolor) setfillstyle(1,fillcolor); bar(left,top,right,down); setcolor(fillcolor); rectangle(left,top,right,down); setcolor(15); line(left+1,top+1,left+1,down-1); line(left+1,top+1,