用C语言实现一个9X9的扫雷
test.c 测试部分
game.c 游戏实现部分
game.h 游戏声明部分
菜单部分
游戏部分
游戏部分包括创建一个扫雷的区域,在其中埋雷,玩家进行扫雷,判断扫雷是否成功
这里我i们定义行列,便于以后将其修改为其他格式的扫雷
创建扫雷区域
因为我们扫雷如果扫到的不是类雷会返回该点周围雷的个数,如果扫到的区域位于扫雷区域的边界,我们返回容易出出现越界访问,所以这里我们定义一个比扫雷区域大一圈的是最优的,比如这里我们需要实现的是9X9的区域,那么我们定义一个11X11的区域是最佳的,这里我们也定义行列,便于日后修改
扫雷我们将雷所在位置设为1,不是雷设置为0,但是我们还需要展现给玩家每步所扫出来的结果,所以这里我们需要定义两个二位数组,一个存储雷的位置,另一个展现给玩家看
打印区域
我们需要将区域展现给玩家看,让玩家进行游戏
埋雷
RAY是雷的个数,这里定义便于以后修改
排雷
这里我们需要加一个循环条件,当排雷次数达到总共可以排的次数减去雷的个数,即退出循环,否则继续排雷,添加一个变量win,当win==ROW*COL-RAY,即退出循环
求周围雷综合和的函数getray
一个排查点的周围雷的个数如图,此排查点雷的个数为2,根据他们的坐标我们可以写出函数,得到雷的个数
得到雷的个数后我们需要将show数组中这一位改成这个值,我们可知
' 1 ' =1+ ' 0 '
所以可以写出count+’ 0 ‘
完整代码
game.h
#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define RAY 10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void init(char arr[ROWS][COLS], char ch);
void initboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
void printboard(char arr[ROWS][COLS], int rows, int cols);
void burry(char arr[ROWS][COLS], int rows, int cols);
void playboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
int getray(char mine[ROWS][COLS], int x, int y);
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu();
void game();
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
void menu()
{
printf("****************\n");
printf("*** 1.play ***\n");
printf("*** 0.exit ***\n");
printf("****************\n");
}
void game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化区域
initboard(mine, show, ROWS, COLS);
//打印区域
printboard(show, ROWS, COLS);
//埋雷
burry(mine, ROWS, COLS);
//排雷
playboard(mine,show, ROWS, COLS);
}
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void init(char arr[ROWS][COLS], char ch)
{
int i = 0, j = 0;
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
{
arr[i][j] = ch;
}
}
}
void initboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
init(mine, '0');
init(show, '*');
}
void printboard(char arr[ROWS][COLS], int rows, int cols)
{
printf("******扫雷*******\n");
int i = 0, j = 0;
for (i = 0; i <= cols - 2; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= rows-2; i++)
{
printf("%d ", i);
for (j = 1; j <= cols-2; j++)
{
printf("%c ", arr[i][j]);
}
printf("\n");
}
}
void burry(char arr[ROWS][COLS], int rows, int cols)
{
int count = RAY;
while (count)
{
int x = rand() % ROW + 1;
int y = rand() % COL + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
count--;
}
}
}
void playboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
int x = 0, y = 0;
int win = 0;
while (win<ROW*COL-RAY)
{
printf("请输入要排查的坐标>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= rows - 2 && y >= 1 && y <= cols - 2)
{
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
printboard(mine, ROWS, COLS);
break;
}
else
{
int count1 = getray(mine,x,y);
show[x][y] = count1 + '0';
printboard(show, ROWS, COLS);
win++;
}
}
else
{
printf("坐标有误,请重新输入\n");
}
}
if (win == ROW * COL - RAY)
{
printf("恭喜你,排雷成功\n");
printboard(mine, ROWS, COLS);
}
}
int getray(char mine[ROWS][COLS], int x, int y)
{
int i = 0;
int j = 0;
int count = 0;
for (i = -1; i <= 1; i++)
{
for (j = -1; j <= 1; j++)
{
if ('1' == mine[x + i][y + j])
count++;
}
}
return count;
}
升级优化版(展开)
代码
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void init(char arr[ROWS][COLS], char ch)
{
int i = 0, j = 0;
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
{
arr[i][j] = ch;
}
}
}
void initboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
init(mine, '0');
init(show, '*');
}
void printboard(char arr[ROWS][COLS], int rows, int cols)
{
printf("********扫雷*********\n");
int i = 0, j = 0;
for (i = 0; i <= cols - 2; i++)
{
printf(" %d |", i);
}
printf("\n----------------------------------------");
printf("\n");
for (i = 1; i <= rows-2; i++)
{
printf(" %d |", i);
for (j = 1; j <= cols-2; j++)
{
printf(" %c |", arr[i][j]);
}
printf("\n");
for (j = 0; j <= cols - 2; j++)
{
printf("----");
}
printf("\n");
}
}
void burry(char arr[ROWS][COLS], int rows, int cols)
{
int count = RAY;
while (count)
{
int x = rand() % ROW + 1;
int y = rand() % COL + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
count--;
}
}
}
void playboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
int x = 0, y = 0;
int win = 0;
while (win<ROW*COL-RAY)
{
printf("请输入要排查的坐标>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= rows - 2 && y >= 1 && y <= cols - 2)
{
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
printboard(mine, ROWS, COLS);
break;
}
else
{
open(mine, show, x, y);
printboard(show, ROWS, COLS);
win++;
}
}
else
{
printf("坐标有误,请重新输入\n");
}
}
if (win == ROW * COL - RAY)
{
printf("恭喜你,排雷成功\n");
printboard(mine, ROWS, COLS);
}
}
int getray(char mine[ROWS][COLS], int x, int y)
{
int i = 0;
int j = 0;
int count = 0;
for (i = -1; i <= 1; i++)
{
for (j = -1; j <= 1; j++)
{
if ('1' == mine[x + i][y + j])
count++;
}
}
return count;
}
void open(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
if (x >= 1 && x <= ROWS - 2 && y >= 1 && y <= COLS - 2)
{
int count = getray(mine, x, y);
if (count == 0)
{
show[x][y] = ' ';
int i = 0, j = 0;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if (show[i][j] == '*' && (i != x || j != y))
{
open(mine, show, i, j);
}
}
}
}
else
{
show[x][y] = count + '0';
}
}
}
#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define RAY 10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void init(char arr[ROWS][COLS], char ch);
void initboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
void printboard(char arr[ROWS][COLS], int rows, int cols);
void burry(char arr[ROWS][COLS], int rows, int cols);
void playboard(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
int getray(char mine[ROWS][COLS], int x, int y);
void open(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu();
void game();
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
void menu()
{
printf("****************\n");
printf("*** 1.play ***\n");
printf("*** 0.exit ***\n");
printf("****************\n");
}
void game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化区域
initboard(mine, show, ROWS, COLS);
//打印区域
printboard(show, ROWS, COLS);
//埋雷
burry(mine, ROWS, COLS);
//排雷
playboard(mine,show, ROWS, COLS);
}