小阿永又来啦
上篇博客教了大家写井字棋。这次我们教经典扫雷用数组函数实现代码。 话不多说直接开敲!!
面对任何游戏代码,不要慌,上来先写出思路。思路才是重点!
我们先看成果图:
纵观成果图:
我们可以看出它其实是一个9*9的二维数组图,没玩之前是一个二维数组图,开始玩以后又是另一个数组图,左上角的10表示有10个雷,没踩中雷的话他显示周围有几个雷。踩中的话就会退出游戏。或者是把雷都排完就赢了。
分析完思路,接下来开始操作:还是强调一定要书写规范。
game.h用来声明我们的函数,game.c用来实现函数内容,test.c是我们的测试函数主体
游戏应该有自己的菜单方便玩家选择游戏还是退出游戏,给初学者做个建议菜单
void menu()//菜单
{
printf("****************\n");
printf("*****1.开始*****\n");
printf("*****0.退出*****\n");
printf("****************\n");
}
输入1就开始游戏,输入0就结束游戏退出。所以我们test项目应该这样写
#include"game.h"
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();//菜单
printf("请选择:>\n");
scanf("%d", &input);
switch (input)
{
case 1:game();
break;
case 0: printf("退出游戏\n");
break;
default:printf("输入错误,重新输入\n");
}
} while (input);
return 0;
}
然后写开始游戏后是怎么样的,现在开始封装game()函数
{
1.创建棋盘
2.初始化棋盘
3.打印棋盘
4.布置雷
5.排查雷
}
所以我们先在头文件中把用到的函数声明,然后去game.c里面实现这些函数
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define sz 10
void menu();//打印菜单
void game();//游戏主函数
void init_board(char board[ROWS][COLS],int row,int col,char ch);//初始化棋盘
void print_board(char board[ROWS][COLS],int row, int col);//打印棋盘
void set_board(char board[ROWS][COLS],int row,int col);//布置雷
void find_board(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col); //排雷
初始化棋盘
void init_board(char board[ROWS][COLS], int row, int col, char ch)//初始化棋盘
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ch;
}
}
}
打印棋盘
void print_board(char board[ROWS][COLS], int row, int col)//打印棋盘
{
for (int i = 0; i <= col; i++)
{
printf(" %d ", i);
}
printf("\n");
for (int i = 1; i <= row; i++)
{
printf(" %d ", i);
for (int j = 1; j <= col; j++)
{
printf(" %c ", board[i][j]);
}
printf("\n");
}
}
布置雷
void set_board(char board[ROWS][COLS], int row, int col)//布置雷
{
int x = 0;
int y = 0;
int count = sz;
while (count)
{
x = rand() % row + 1;
y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
检测周围雷的信息
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
return (mine[x][y - 1] + mine[x][y + 1] + mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0');
}
排查雷
void find_board(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0, y = 0, win = 0;
while (win<row*col-sz)
{
printf("请输入坐标:>\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y]!='1')
{
int count = get_mine_count(mine,x,y);
show[x][y] = count+'0';
print_board(show, ROW, COL);
win++;
}
else
{
printf("你被炸死了\n");
print_board(mine, ROW, COL);
break;
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
if (win == row * col - sz)
{
printf("恭喜你排雷成功\n");
print_board(mine, ROW, COL);
}
}
game函数主体
void game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化棋盘
init_board(mine,ROWS,COLS,'0');
init_board(show, ROWS, COLS, '*');
//print_board(mine,ROW,COL);
//print_board(show, ROW, COL);
set_board(mine, ROW, COL);
print_board(mine, ROW, COL);
find_board(mine,show,ROW,COL);
}