比较多功能的扫雷小游戏c语言
时间: 2023-06-23 11:44:15 浏览: 97
c语言小游戏代码-扫雷代码
4星 · 用户满意度95%
以下是一个比较多功能的扫雷小游戏的C语言代码,希望能对你有所帮助:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#define ROW 20
#define COL 20
#define MINE_NUM 40
int GetMineCount(int x, int y, char mine[ROW][COL]);
void InitBoard(char board[ROW][COL], char ch);
void ShowBoard(char board[ROW][COL], char show[ROW][COL], int row, int col);
void SetMine(char mine[ROW][COL]);
void OpenBoard(int x, int y, char board[ROW][COL], char show[ROW][COL], char mine[ROW][COL], int row, int col);
void Game();
void Menu();
void Game()
{
char board[ROW][COL] = { 0 };
char show[ROW][COL] = { 0 };
char mine[ROW][COL] = { 0 };
int x, y, win = 0;
InitBoard(board, '0');
InitBoard(show, '*');
SetMine(mine);
ShowBoard(board, show, ROW, COL);
while (1)
{
printf("请输入坐标(x,y):");
scanf_s("%d,%d", &x, &y);
if (x < 1 || x > ROW || y < 1 || y > COL)
{
printf("坐标输入不合法!\n");
continue;
}
if (show[x - 1][y - 1] == ' ')
{
printf("该位置已经被打开过了,请重新输入!\n");
continue;
}
if (mine[x - 1][y - 1] == '1')
{
printf("很遗憾,你踩雷了!\n");
show[x - 1][y - 1] = 'X';
ShowBoard(board, show, ROW, COL);
printf("按任意键返回主菜单...");
_getch();
Menu();
}
else
{
OpenBoard(x - 1, y - 1, board, show, mine, ROW, COL);
ShowBoard(board, show, ROW, COL);
win++;
if (win == ROW * COL - MINE_NUM)
{
printf("恭喜你,扫雷成功!\n");
ShowBoard(board, mine, ROW, COL);
printf("按任意键返回主菜单...");
_getch();
Menu();
}
}
}
}
void Menu()
{
int choice;
system("cls");
printf("********** 扫雷菜单 **********\n");
printf("* 1.开始游戏 *\n");
printf("* 0.退出游戏 *\n");
printf("********************************\n");
printf("请选择:");
scanf_s("%d", &choice);
switch (choice)
{
case 1:
Game();
break;
case 0:
printf("谢谢使用!\n");
exit(0);
default:
printf("输入错误,请重新输入!\n");
_getch();
Menu();
}
}
void InitBoard(char board[ROW][COL], char ch)
{
int i, j;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
board[i][j] = ch;
}
}
}
void ShowBoard(char board[ROW][COL], char show[ROW][COL], int row, int col)
{
int i, j;
system("cls");
printf(" ");
for (i = 1; i <= col; i++)
{
printf("%2d", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%2d", i);
for (j = 1; j <= col; j++)
{
if (show[i - 1][j - 1] == ' ')
{
printf(" ");
}
else
{
printf("%2c", show[i - 1][j - 1]);
}
}
printf("\n");
}
}
void SetMine(char mine[ROW][COL])
{
int i, j, count = 0;
srand(time(NULL));
while (count < MINE_NUM)
{
i = rand() % ROW;
j = rand() % COL;
if (mine[i][j] == '0')
{
mine[i][j] = '1';
count++;
}
}
}
int GetMineCount(int x, int y, char mine[ROW][COL])
{
int count = 0, i, j;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if (i >= 0 && i < ROW && j >= 0 && j < COL)
{
if (mine[i][j] == '1')
{
count++;
}
}
}
}
return count;
}
void OpenBoard(int x, int y, char board[ROW][COL], char show[ROW][COL], char mine[ROW][COL], int row, int col)
{
int count = GetMineCount(x, y, mine);
if (count > 0)
{
show[x][y] = count + '0';
board[x][y] = count + '0';
}
else
{
show[x][y] = ' ';
board[x][y] = ' ';
int i, j;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if (i >= 0 && i < ROW && j >= 0 && j < COL && show[i][j] == '*')
{
OpenBoard(i, j, board, show, mine, row, col);
}
}
}
}
}
int main()
{
Menu();
return 0;
}
```
该代码实现了一个比较多功能的扫雷小游戏,包括初始化棋盘、随机布雷、计算周围雷数、打开空白格子等功能。其中,使用了二维数组来表示棋盘和雷区,利用随机数生成雷区,使用递归实现打开空白格子的逻辑。游戏菜单使用了循环和递归结合的方式,可以实现多次游戏和返回主菜单。同时,该代码还使用了头文件conio.h中的_getch()函数,可以在控制台中读取用户输入的按键,增强了游戏的交互性。
阅读全文