您的位置:首页 > 编程语言 > C语言/C++

C语言版扫雷

2016-12-13 22:39 162 查看
用C语言实现扫雷,首先应该有基本的思路,创建两个相同大小的数组,一个用于布雷(初始化为全0,布雷时将雷置为1),另一个给用户展示(初始化为星号,用户输入坐标后统计周围雷的分布并打印雷的个数)。由于需要统计每个坐标周围类的个数,所以将数组创建大一圈,以方便统计。若输了,打印出雷阵告诉玩家雷的分布。

具体实现:

game.h文件
#ifndef __GAME_H__
#define __GAME_H__

#define ROWS 10
#define COLS 10

#define MINE_COUNT 30

void display(char arr[ROWS + 2][COLS + 2] , int rows, int cols); //打印雷阵数组
void set_mine(char mine[ROWS + 2][COLS + 2], int rows, int cols); //布雷
void get_mine_count(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2], int x, int y); //统计每格雷的个数
void get_around_mine_count(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2], int x, int y); //统计周围雷的个数
void first_remove(char mine[ROWS + 2][COLS + 2], int x, int y); //第一个是雷移走

#endif //__GAME_H__game.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include "game.h"

void display(char arr[ROWS + 2][COLS + 2], int rows, int cols) //打印雷阵数组
{
int i = 0;
int j = 0;
printf(" ");
for (i = 1; i <= rows;i++) //打印数组行序号
{
printf("%d ",i);
}
printf("\n");
for (i = 1; i <= rows;i++)
{
printf("%-3d", i); //打印数组列序号
for (j = 1; j <= cols; j++)
{
printf("%c ",arr[i][j]);
}
printf("\n");
}
}
void set_mine(char mine[ROWS + 2][COLS + 2], int rows, int cols) //布雷
{
srand((unsigned int)time(NULL));
int count = MINE_COUNT;
while (count)
{
int x = rand() % 10 + 1;
int y = rand() % 10 + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}

void get_mine_count(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2], int x, int y) //统计每格雷的个数
{
int count = 0; //统计雷的个数
count=((mine[x - 1][y - 1] - '0') +
(mine[x - 1][y] - '0')+
(mine[x - 1][y + 1] - '0')+
(mine[x][y + 1] - '0') +
(mine[x + 1][y + 1] - '0') +
(mine[x + 1][y] - '0') +
(mine[x + 1][y - 1] - '0') +
(mine[x][y - 1] - '0'));

show[x][y] = count + '0'; //数字+字符变成字符存起来
}

void get_around_mine_count(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2], int x, int y) //统计周围雷的个数
{
get_mine_count(mine, show, x, y);
if (mine[x-1][y-1] == '0')
get_mine_count(mine, show, x-1, y-1);
if (mine[x-1][y] == '0')
get_mine_count(mine, show, x-1, y);
if (mine[x-1][y+1] == '0')
get_mine_count(mine, show, x-1, y+1);
if (mine[x][y+1] == '0')
get_mine_count(mine, show, x, y+1);
if (mine[x+1][y+1] == '0')
get_mine_count(mine, show, x+1, y+1);
if (mine[x+1][y] == '0')
get_mine_count(mine, show, x+1, y);
if (mine[x+1][y-1] == '0')
get_mine_count(mine, show, x+1, y-1);
if (mine[x][y-1] == '0')
get_mine_count(mine, show, x, y-1);

}

void first_remove(char mine[ROWS + 2][COLS + 2], int x, int y) //第一个是雷移走
{
if (mine[x][y] == '1')
{
for (int i = 1; i <= ROWS; i++)
{
for (int j = 1; j <= COLS; j++)
{
if (mine[i][j] == '0')
{
mine[i][j] = '1';
mine[x][y] = '0';
break;
}
}
if (mine[x][y] == '0')
{
break;
}
}
}
}

test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include "game.h"

void main_menu() //主界面
{
printf("-------------------\n");
printf("| 1.play |\n");
printf("| 0.exit |\n");
printf("-------------------\n");
}

void game()
{
int win = 0; //点击的次数
int count = 0; //统计雷的个数
int first = 1;
char mine[ROWS + 2][COLS + 2] = { 0 }; //埋雷的数组
char show[ROWS + 2][COLS + 2] = { 0 }; //展示的数组
memset(mine, '0', sizeof(char)* (ROWS+2) *(COLS + 2)); //数组初始化
memset(show, '*', sizeof(char)* (ROWS + 2) *(COLS + 2));

display(show, ROWS, COLS); //打印展示的雷阵
set_mine(mine, ROWS, COLS); //布雷
//display(mine, ROWS, COLS); //调试的时候可以取消注释打印出雷的分布

while (win<ROWS*COLS - MINE_COUNT)
{
int x = 0, y = 0;
printf("请输入坐标:\n");
scanf("%d%d",&x,&y);
if (f
a1e8
irst == 1)
{
first_remove(mine, x, y);
first++;
}
if (mine[x][y] == '1')
{
printf("雷炸了!YOU LOSE !\n");
display(mine, ROWS, COLS);
break;
}
else
{
win++;
get_around_mine_count(mine,show, x, y); //统计周围雷的个数
//get_mine_count(mine,show, x, y);
// show[x][y] = count + '0'; //数字+字符变成字符存起来
display(show, ROWS, COLS);
}
}
if (win >= ROWS*COLS - MINE_COUNT)
{
printf("YOU WIN !!!\n");
}
}

enum Option //枚举
{
EXIT,
PLAY
};
int main()
{
int x = 0;

do
{
main_menu();
printf("输入1继续、0退出:\n");
scanf("%d", &x);
switch (x)
{
case EXIT:
break;
case PLAY:
game();
break;
default:
printf("选择错误,请重输入:\n");
break;
}

} while (x);
return 0;
}

运行结果:





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: