这是下午写的,这次的修改增加了鼠标的事件,需要的是windows的消息机制,WinAPI函数,以下是新添加的定义
struct { int num;//格子当前状态,1表示有雷,0表示无雷或已经显示数字 int roundnum;//统计格子周围的雷数 int flag;//右键按下显示红旗标志,0表示没有,1表示有 }Mine[10][10]; POINT Mouse;//定义鼠标事件 int MouseX, MouseY;//鼠标的x,y坐标 int mineNUM;//统计处理过的格子数 TCHAR randmineNUM[100];//显示数字的字符串
Mine[10][10]是10*10的格子,POINT是鼠标结构的别名,可以看定义是x和y的坐标
typedef struct tagPOINT { LONG x; LONG y; } POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
接着在Game()中添加判断鼠标位置的语句,用来判断是否重新开始
if (WM_LBUTTONDOWN)//鼠标左键按下事件 { GetCursorPos(&Mouse);//获取鼠标当前的坐标,POINT MOUSE定义 MouseX = Mouse.x; MouseY = Mouse.y; if (MouseX > 90 && MouseX<110 && MouseY>5 && MouseY < 25) { FLAG = 1; continue; } } if (_kbhit())//判断有按键退出 { break; }
接着在GameBegin()添加关于鼠标的操作,并且随机产生雷数,以下是完整代码
void GameBegin(void) { int i, j; cleardevice(); if (PLAY != 1) { SetCursorPos(100, 10);//设置鼠标初始位置 MouseX = 100; MouseY = 10; } PLAY = 1; mineNUM = 0; setfillstyle(SOLID_FILL);//此处用法和TC不同 setfillcolor(WHITE); bar(0, 0, 200, 230); //设置背景区域 for (i = 0; i < 10; i++) //绘制每个雷区(小格) { for (j = 0; j < 10; j++) { DrawEmpty(i, j, 0, LIGHTGRAY); } } setcolor(GREEN); //DrawSMile(); rand();//产生随机数 for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { srand((unsigned)time(NULL));//根据时间给随机数不同的种子数 Mine[i][j].num = rand() % 8;//随机数产生范围0-7 if (Mine[i][j].num == 1) { mineNUM++; } else { Mine[i][j].num = 2; } Mine[i][j].flag = 0; } _stprintf_s(randmineNUM, _T("%d"), mineNUM);//将minrNUM转换成字符串类型 setcolor(WHITE); settextstyle(16, 0, _T("0")); outtextxy(2, 2, randmineNUM); mineNUM = 100 - mineNUM; } }
由于调用了许多WinAPI和其他函数,所以要包含以下头文件
#include<stdio.h> #include<graphics.h> #include<windows.h> #include <easyx.h> #include<conio.h> //_kbhit() #include<stdlib.h> //rand(),srand() #include<time.h> //srand((unsigned)time(NULL))
OK,today is enough!
时间: 2024-11-10 22:57:39