扫雷的代码要写多个函数,所以这里用分文件的形式来呈现:
如图所示,我建立了三个 文件,分别是.h文件,函数.c文件,以及主文件。
以及在game.c与main.c文件中都引用自定义头文件game.h。
随后在game.h声明好每个要使用的量,以及函数
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#define TNT 10
#define Y 9
#define X 9
#define Lx X+2
#define Ly Y+2
void menu();
void init_table(int x, int y, char what, char a[Ly][Lx]);
void mine(int num, char table[Ly][Lx]);
char find(int x, int y, char in_table[Ly][Lx]);
void show(char table[Ly][Lx]);
void game(char show_table[Ly][Lx], char in_table[Ly][Lx]);
这里的define中,TNT代表地雷的量,Y为行,X为列。init_table为初始化地雷桌面函数,mine为埋雷函数,find为查找八方的地雷数,show为展示地雷桌面,game为开始游戏函数
menu为菜单函数
让我们来看看主函数main.c文件部分:
#include "game.h" int main() { begin: srand((unsigned int)time(NULL)); int input; menu(); char show_table[Ly][Lx]; char in_table[Ly][Lx]; scanf("%d", &input); if (input == 1) { init_table(Lx, Ly, '0', in_table); init_table(Lx, Ly, '*', show_table); show(show_table); mine(TNT, in_table); game(show_table,in_table); //show(in_table); //show(show_table); printf("还要玩吗?\n"); goto begin; } else { printf("成功退出游戏"); } }
因为我们要玩的是9X9的地雷桌面,则我们要定义11X11的地雷桌面,以保证我们在访问桌面边缘四周的地雷是不会数组越界。
所以定义char show_table[Ly][Lx];
char in_table[Ly][Lx];注意是字符类型的数组。
用srand((unsigned int)time(NULL))来保证生成的是真随机数,具体在mine函数运用
一下展示各个函数内容(game.c):
1.menu函数:
void menu() { printf("********************************************************\n"); printf("********************************************************\n"); printf("*********************1进入游戏**************************\n"); printf("*********************0退出游戏**************************\n"); printf("********************************************************\n"); printf("********************************************************\n"); }
没啥好说的。
运行结果:
init_table函数:
void init_table(int x, int y, char what,char a[Ly][Lx]) { for ( int i = 0; i < y; i++) { for (int j = 0; j < x; j++) { a[i][j] = what; } } }
用输入的what字符遍历二维数组。
show函数:
void show(char table[Ly][Lx]) { int i, j; for (i = 0; i <= X; i++) { printf("%d ", i); } printf("\n"); for (i = 1; i <= Y; i++) { printf("%d ", i); for (j = 1; j <= X; j++) { printf("%c ", table[i][j]); } printf("\n"); } }
展示此时的炸弹桌面或游戏桌面;
具体效果为:
注意展示展示的是9X9的桌面,以及要展示坐标轴
find函数:
char find(int x, int y, char in_table[Ly][Lx]) { int i = y; int j = x; char sum = '0'; for (i - y - 1; i <= y + 1; i++) { for (j = x - 1; j <= x + 1; j++) { sum += in_table[i][j] - '0'; } } return sum; }
这里要注意一点,因为:
’1‘-’0‘=1
’2‘-’1‘=1
相反 1+’0‘=’1‘
‘1’+1 = ‘0’
我们让八面的字符全部相加,每加一项,就 -‘0’将其变为数字,最后与‘0’相加,得到八面的炸弹数量,且为char类型的字符。
game函数:
void game(char show_table[Ly][Lx], char in_table[Ly][Lx]) { int win = 0; while (win < X * Y - TNT) { int x, y; hh: printf("****************************\n"); printf("请输入要查找的坐标(x,y)\n"); printf("****************************\n"); scanf("%d %d", &x, &y); if (x >= 1 && x <= X && y >= 1 && y <= Y) { if (in_table[y][x] == '1') { printf("恭喜你这SB踩到炸弹啦\n " "Game over!!!!\n"); printf("****************************\n"); show(in_table); printf("****************************\n"); break; } else { printf("****************************\n"); char c = find(x, y, in_table); show_table[y][x] = c; show(show_table); win++; printf("****************************\n"); } if (win == X * Y - TNT) printf("恭喜胜利!!!"); } else { printf("输错啦!再输一遍\n"); goto hh; } }
最终的game函数呈现,这里用了goto,解决输入无效坐标的问题
我们现在来玩一次扫雷吧!
按1进入游戏
输入1 1
好哇(1,1)旁边有一个炸弹
再输入 1 2看看
好,踩到炸弹。
这里可以再输入1再玩一次。
OK到这里,你已经完全学会扫雷代码,接下来可以和你的小伙伴们分享啦!!