模拟扫雷游戏,代码如下:
#ifndef __GAME_H__
#define __GAME_H__
#define EASY_COUNT 10 //雷数
#define R 9 //行
#define C 9 //列
#define ROWS R + 2
#define COLS C + 2
#include<stdio.h>
void Choose_Menu(int a[ROWS][COLS]); //选择菜单界面
void Game_Initialize(int a[ROWS][COLS], int row, int col); //初始化
void Set_Mine(int a[ROWS][COLS], int row, int col); //布置雷
void Move_Mine(int a[ROWS][COLS], int row, int col, int x, int y); //移动雷 如果第一次输入的坐标就是雷,则将此处的雷移动至别处,游戏继续。
void Game_Menu_Print(const int a[ROWS][COLS], int row, int col); //游戏中界面输出
void Game_Result_Print(const int a[ROWS][COLS], int row, int col);//游戏结束输出
void Find_Mine(int a[ROWS][COLS], int row, int col); //进行排雷的过程
void Get_Mine(int a[ROWS][COLS], int row, int col); //计算雷数
void Play_Game(int a[ROWS][COLS],int row, int col); //游戏开始调用的总函数
#endif //__GAME_H__,
#include<bits/stdc++.h>
void Choose_Menu(int a[ROWS][COLS])
{
int i = 1;
while (i)
{
printf("\t\t\t******************************************************\n");
printf("\t\t\t******************************************************\n");
printf("\t\t\t************* 请选择进行的操作: *************\n");
printf("\t\t\t*************1.开始游戏 0.退出游戏 *************\n");
printf("\t\t\t******************************************************\n");
printf("\t\t\t******************************************************\n");
printf("\t\t\t输入:>_");
scanf("%d", &i);
switch (i)
{
case 1: Play_Game(a, R, C); break;
case 0: printf("退出成功,请按任意键结束!\n"); break;
default:printf("输入错误,请重新输入!\n"); break;
}
}
}
void Game_Initialize(int a[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
a[i][j] = -2;
}
}
}
void Set_Mine(int a[ROWS][COLS], int row, int col, int count)
{
int x = 0;
int y = 0;
srand((unsigned int)time(NULL));
while (count)
{
x = rand() % row + 1;
y = rand() % col + 1;
if (a[x][y] == -2)
{
a[x][y] = -1;
count--;
}
}
}
void Move_Mine(int a[ROWS][COLS], int row, int col, int x, int y)
{
int x0 = 0;
int y0 = 0;
srand((unsigned int)time(NULL));
while (1)
{
x0 = rand() % row + 1;
y0 = rand() % col + 1;
if ((x0 != x || y0 != y) && a[x0][y0] != -1)
{
a[x0][y0] = -1;
break;
}
}
}
void Game_Menu_Print(const int a[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
printf("\n\t\t\tGame_Menu:\n\n");
//输出坐标
printf("\t\t\t\t");
for (i = 1; i <= col; i++)
{
if(i < 10)
printf(" %d ", i);
else printf("%d ", i);
}
printf("\n\n");
//输出棋局
for (i = 1; i <= row; i++)
{
printf("\t\t\t %d ",i);
for (j = 1; j <=col; j++)
{
if (a[i][j] == -2 || a[i][j] == -1)
printf(" * ");
else if(a[i][j] == 0)
printf(" ");
else printf(" %d ", a[i][j]);
}
printf(" %d\n", i);
}
//输出坐标
printf("\n\t\t\t\t");
for (i = 1; i <= col; i++)
{
if (i < 10)
printf(" %d ", i);
else printf("%d ", i);
}
printf("\n\n");
}
void Game_Result_Print(const int a[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
printf("\n\t\t\tGame_Result:\n\n");
//输出坐标
printf("\t\t\t\t");
for (i = 1; i <= col; i++)
{
if (i < 10)
printf(" %d ", i);
else printf("%d ", i);
}
printf("\n\n");
//输出棋局
for (i = 1; i <= row; i++)
{
printf("\t\t\t %d ", i);
for (j = 1; j <= col; j++)
{
if (a[i][j] == -2)
{
printf(" * ");
}
else if (a[i][j] == -1)
{
printf(" @ ");
}
else if (a[i][j] == 0)
{
printf(" ");
}
else printf(" %d ", a[i][j]);
}
printf(" %d\n", i);
}
//输出坐标
printf("\n\t\t\t\t");
for (i = 1; i <= col; i++)
{
if (i < 10)
printf(" %d ", i);
else printf("%d ", i);
}
printf("\n\n");
}
void Get_Mine(int a[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
if ((a[row - 1][col - 1] == -1) + (a[row - 1][col] == -1) + (a[row - 1][col + 1] == -1) + (a[row][col - 1] == -1) + (a[row][col + 1] == -1) + (a[row + 1][col - 1] == -1) + (a[row + 1][col] == -1) + (a[row + 1][col + 1] == -1) != 0)
{
a[row][col] = (a[row - 1][col - 1] == -1) + (a[row - 1][col] == -1) + (a[row - 1][col + 1] == -1) + (a[row][col - 1] == -1) + (a[row][col + 1] == -1) + (a[row + 1][col - 1] == -1) + (a[row + 1][col] == -1) + (a[row + 1][col + 1] == -1);
}
else
{
//只有在棋盘内才递归
if (row >= 1 && row <= R && col >= 1 && col <= C)
{
a[row][col] = ((a[row - 1][col - 1] == -1) + (a[row - 1][col] == -1) + (a[row - 1][col + 1] == -1) + (a[row][col - 1] == -1) + (a[row][col + 1] == -1) + (a[row + 1][col - 1] == -1) + (a[row + 1][col] == -1) + (a[row + 1][col + 1] == -1));
//向上
if (a[row - 1][col] < 0)
Get_Mine(a, row - 1, col);
//向右
if (a[row][col + 1] < 0)
Get_Mine(a, row, col + 1);
//向下
if (a[row + 1][col] < 0)
Get_Mine(a, row + 1, col);
//向左
if (a[row][col - 1] < 0)
Get_Mine(a, row, col - 1);
}
}
}
void Find_Mine(int a[ROWS][COLS], int row, int col)
{
int x = 0, y = 0;
int win = 0;
while (win < row * col - EASY_COUNT)
{
//输入坐标
Game_Menu_Print(a, row, col);
printf("请输入要排查的坐标:");
scanf("%d %d", &x, &y);
//判断有效性
if (x >= 1 && x <= row && y >= 1 && y <= col) //输入正确
{
//
if (a[x][y] == -1)
{
if (win == 0)
{
Move_Mine(a, row, col, x, y);
Get_Mine(a, x, y);
win++;
}
else
{
printf("\nGAME OVER!!!\n\n");
break;
}
}
else
{
if (a[x][y] != -2)
{
printf("坐标输入有误,请重新输入!\n");
continue;
}
Get_Mine(a, x, y);
win++;
}
}
else
{
printf("坐标输入有误,请重新输入!\n");
}
}
if (win == row * col - EASY_COUNT)
printf("\nYou Win!\n\n");
}
void Play_Game(int a[ROWS][COLS], int row, int col)
{
Game_Initialize(a, ROWS, COLS);
Set_Mine(a, row, col,EASY_COUNT);
Find_Mine(a, row, col);
Game_Result_Print(a, row, col);
}
int main()
{
int arr[ROWS][COLS] = { 0 };
Choose_Menu(arr);
return 0;
}