31—扫雷(待完善)

31.扫雷游戏

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <graphics.h>
/*#pragma comment(lib,"winmm.lib")*///多媒体头文件
#define MAX_ROW 10
#define MAX_COL 10
#define MINE_COUNT 10
#define PIX 60//像素大小
int a[MAX_ROW][MAX_COL];
int hitnum;
IMAGE img[12];
void InitMap(){
	//初始化地图
	hitnum = 0;
	for (int i = 0; i < MAX_ROW; ++i){
		for (int j = 0; j < MAX_COL; ++j){
			a[MAX_ROW][MAX_COL] = 0;
		}
	}
	srand((unsigned)time(NULL));
	//随机生成十组坐标,并给对应的元素赋值-1(-1代表雷);
	int col, row;
	int n = MINE_COUNT;
	while (n>0){
		col = rand() % MAX_COL;
		row = rand() % MAX_ROW;
		if (a[row][col] == 0){//判断该位置是否被占用
			a[row][col] = -1;
			--n;
		}
	}
	//生成地图
	//遍历数组,每找到一个雷,则给附近8个元素加一
	for (int i = 0; i < MAX_ROW; ++i){
		for (int j = 0; j < MAX_COL; ++j){
			if (a[i][j] == -1){
				//确定雷周围的8个元素位置
				for (int row = i - 1; row <= i + 1; ++row){
					for (int col = j - 1; col <= j + 1; ++col){
						//判断row,col是否越界与a[y][x]是否为雷,然后给对应的元素加1
						if (col >= 0 && col < MAX_COL && row >= 0 && row < MAX_ROW && a[row][col] != -1){
							++a[row][col];
						}
					}
				}
			}
		}
	}
	//TODO 测试地图
	/*for (int i = 0; i < MAX_ROW; ++i){
		for (int j = 0; j < MAX_COL; ++j){
		printf("%d\t", a[i][j]);
		}
		putchar('\n');
		}*/
	//加载图片
	/*for (int i = 0; i < 12; i++){*/
		loadimage(&img[0], _T("Picture/0.jpg"), PIX, PIX);
		loadimage(&img[1], _T("Picture/1.jpg"), PIX, PIX);//图片大小64*64
		loadimage(&img[2], _T("Picture/2.jpg"), PIX, PIX);
		loadimage(&img[3], _T("Picture/3.jpg"), PIX, PIX);
		loadimage(&img[4], _T("Picture/4.jpg"), PIX, PIX);
		loadimage(&img[5], _T("Picture/5.jpg"), PIX, PIX);
		loadimage(&img[6], _T("Picture/6.jpg"), PIX, PIX);
		loadimage(&img[7], _T("Picture/7.jpg"), PIX, PIX);
		loadimage(&img[8], _T("Picture/8.jpg"), PIX, PIX);
		loadimage(&img[9], _T("Picture/9.jpg"), PIX, PIX);
		loadimage(&img[10], _T("Picture/10.jpg"), PIX, PIX);
		loadimage(&img[11], _T("Picture/11.jpg"), PIX, PIX);

}
void DrawMap(){
	for (int i = 0; i < MAX_ROW; ++i){
		for (int j = 0; j < MAX_COL; ++j){
			if (a[i][j]>20){
				putimage(j *  PIX, i *  PIX, &img[10]);
			}
			else{
				switch (a[i][j]){
				case 9://+10
					putimage(j *  PIX, i *  PIX, &img[9]);//贴图的坐标+地址
					break;
				case 10:
					putimage(j *  PIX, i *  PIX, &img[0]);
					break;
				case 11:
					putimage(j *  PIX, i *  PIX, &img[1]);
					break;
				case 12:
					putimage(j *  PIX, i *  PIX, &img[2]);
					break;
				case 13:
					putimage(j *  PIX, i *  PIX, &img[3]);
					break;
				case 14:
					putimage(j *  PIX, i *  PIX, &img[4]);
					break;
				case 15:
					putimage(j *  PIX, i *  PIX, &img[5]);
					break;
				case 16:
					putimage(j *  PIX, i *  PIX, &img[6]);
					break;
				case 17:
					putimage(j *  PIX, i *  PIX, &img[7]);
					break;
				case 18:
					putimage(j *  PIX, i *  PIX, &img[8]);
					break;
				default:
					putimage(j *  PIX, i * PIX, &img[11]);
					break;
				}
			}
		}
	}
}
int Game(){
	MOUSEMSG msg = {0};//定义一个鼠标消息
	msg= GetMouseMsg();//获取鼠标消息
	switch (msg.uMsg){
		//点击鼠标左键翻开,贴上相应的图片
	case WM_LBUTTONDOWN://   Left+button+down
		if (a[msg.y / PIX ][msg.x / PIX ] < 9){
			a[msg.y / PIX ][msg.x / PIX ] += 10;
			++hitnum;
		}
		return a[msg.y / PIX][msg.x / PIX];//返回当前元素的值
		break;
		//将判断为雷的位置加上标记
	case WM_RBUTTONDOWN:// Right+button+down
		if (a[msg.y / PIX][msg.x / PIX] < 9){
			a[msg.y / PIX][msg.x / PIX] += 25;
		}
		//取消标记
		else if (a[msg.y / PIX][msg.x / PIX]>20){
			a[msg.y / PIX][msg.x / PIX] -= 25;
		}
		break;
	}


}
int main(){
	int flag;
	initgraph(PIX * MAX_ROW, PIX*MAX_COL);//打印一个窗口
	HWND hwnd = GetHWnd();//获得窗口句柄
	/*PlaySound()*/
	/*while (1)
	{*/
		InitMap();
		while (1){
			DrawMap();
			flag = Game();
			if (flag == 9){
				DrawMap();
				MessageBox(hwnd, _T("你输了,真菜!"), _T(""), MB_OK);
				break;
			}
			//如果总的数量-点开的数量=雷的数量 就是玩家赢了
			else if (MAX_ROW*MAX_COL - hitnum == MINE_COUNT){
				DrawMap();
				MessageBox(hwnd, _T("恭喜你赢了!"), _T(""), MB_OK);
				break;
			}
		}
		/*if (MessageBox(hwnd, _T("再来一局?"), _T(""), MB_RETRYCANCEL) == IDCANCEL){
			break;*/
		/*}*/
	//}
	system("pause");
	return 0;
}

运行结果:

 

                                                                                                                     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值