使用C语言编写扫雷游戏
1.多文件
多文件包含自己写的头文件,和两个源文件。
2.大概思路。
作为新手编写扫雷游戏,只能利用数组,循环编写一个不太完善的扫雷游戏,下边是我写扫雷游戏的大致思路。
1、首先需要画一个棋盘,需要创建两个二维字符类型数组且大小相同,一个显示给用户,一个隐藏起来。
2、在隐藏的棋盘里边需要设置雷的个数,我设计的棋盘大小是10*10的,有100 个元素,其中雷的个数是20个。
雷用字符‘1’,表示,
3、进行扫雷,输入自己的坐标,并进行判断。
如果输入坐标在隐藏的数组里对应的不是雷,我们需要统计它周围的雷的个数,并赋给显示给用户的棋盘对应的坐标上。
如果输入坐标不在棋盘上,或者该位置已经被扫过,就重新输入。
如果输入坐标在隐藏的数组里对应的是雷,直接退出游戏,你被炸死了。
4、编写统计雷个数的函数。
1.各自文件对应的代码
自己写的头文件<M_Game.h >代码如下(示例):
#pragma once
#include<stdio.h>
#include<string.h>
#include<time.h>
#pragma warning(disable:4996)
#define NUMS 20
#define ROW 12
#define COL 12
void menu();
int GetMines(char mine_board[][COL], int row, int col, int x, int y);
void ShowBoard(char mine_board[][COL], int row, int col);
void SetMine(char mine_board[][COL], int row, int col);
2、M_Game.c文件代码
<M_Game.c>代码如下:
```c
#include"M_Game.h"
void menu()
{
printf("*****************************\n");
printf("***********1.play************\n");
printf("***********0.exit************\n");
printf("*****************************\n");
}
void SetMine(char mine_board[][COL], int row, int col)
{
int count = NUMS;
while (count)
{
int x = rand() % 10 + 1;
int y = rand() % 10 + 1;
if (mine_board[x][y] = '0')
{
mine_board[x][y] = '1';
count--;
}
}
}
int GetMines(char mine_board[][COL], int row, int col, int x, int y)
{
return mine_board[x - 1][y - 1] + mine_board[x - 1][y]\
+ mine_board[x - 1][y + 1] + mine_board[x][y - 1]\
+ mine_board[x][y + 1]+ mine_board[x + 1][y - 1] \
+ mine_board[x + 1][y] + mine_board[x + 1][y + 1]-8*'0';
}
void ShowBoard(char show_board[][COL], int row, int col)
{
printf(" ");
for (int i = 1; i < row - 1; i++)
{
printf(" %d",i);
}
printf("\n—————————————————————\n");
for (int i = 1; i < row - 1; i++)
{
printf("%2d|", i);
for (int j = 1; j < col - 1; j++)
{
printf(" %c |", show_board[i][j]);
}
printf(" \n—————————————————————\n");
}
}
void M_Game()
{
char show_board[ROW][COL];
char mine_board[ROW][COL];
memset(show_board, '*', sizeof(show_board));
memset(mine_board, '0', sizeof(mine_board));
srand((unsigned long)time(NULL));
SetMine(mine_board,ROW,COL);
int count = (ROW - 2) * (COL - 2) - NUMS;
int x = 0;
int y = 0;
do
{
ShowBoard(show_board, ROW, COL);
printf("请选择你扫的位置:\n");
scanf("%d %d",&x,&y);
if (x < 1 || x>10 || y < 1 || y>10)
{
printf("你输入的位置越界了,请重输!!!\n");
continue;
}
else if (show_board[x][y] != '*')
{
printf("这个位置已经被排除,请重新输入!!!\n");
continue;
}
else if (mine_board[x][y] == '1')
{
break;
}
else
{
int ret = GetMines(mine_board,ROW,COL,x,y);
show_board[x][y] = ret+'0';
count--;
}
} while (count > 0);
if (count > 0)
{
printf("你被炸死了!!\n");
}
else
{
printf("你赢了!\n");
}
ShowBoard(show_board,ROW,COL);
ShowBoard(mine_board, ROW, COL);
}
3.main.c文件代码如下
```c
#include"M_Game.h"
int main()
{
int quit = 0;
int input = 0;
while (!quit)
{
menu();
printf("请选择<1|0>:\n");
scanf("%d", &input);
switch (input)
{case 1:
M_Game();
break;
case 0:
quit = 1;
break;
default:
printf("输入错误,请重输!!!\n");
break;
}
}
}