运用c语言数组知识实现简单的扫雷小游戏,游戏可以自己设定棋盘大小,其中以“*”代表雷,以“$”代表旗子
话不多说直接上代码
game.h
定义函数,主要的函数定义在这里
#define _CRT_SECURE_NO_WARNINGS 1;
#define ROW 10
#define COL 10
#include<stdlib.h>
#include<time.h>
void InitBoard(char board[ROW][COL],int row,int col);
void DispalyBoard(char board[ROW][COL], int row, int col);
void Mine(char board[ROW][COL], int row, int col,int x, int y);
char FakeClick(char board[ROW][COL], int x, int y);
void circle(char board[ROW][COL], int x, int y);
void FakeDisplay(char board[ROW][COL], char board2[ROW][COL]);
void Flag(char board[ROW][COL],int row,int col);
int judge(char board[ROW][COL], char board2[ROW][COL]);
int judge2(char board[ROW][COL], char board2[ROW][COL], int x, int y);
int ergodic(char board[ROW][COL]);
test.c
运行程序在这里进行运行,首先选择游戏玩或不玩,之后运用坐标的方式来代替鼠标点击棋盘中的方格,在输入坐标时如果选择了y就代表着要进行插旗,如若直接输入坐标则是正常点击,游戏规则与玩法和扫雷几乎一样
#define _CRT_SECURE_NO_WARNINGS 1;
#include<stdio.h>
#include"game.h"
#define ROW 10
#define COL 10
index()
{
printf("*************************\n");
printf("* 1.play game *\n");
printf("* 0. exit *\n");
printf("*************************\n");
}
game()
{
int i = 0;
int j = 0;
int a = 0;
char b;
char board[ROW][COL];
char board2[ROW][COL];
InitBoard(board,ROW,COL);
InitBoard(board2, ROW, COL);
DispalyBoard(board2, ROW, COL);
printf("\n");
printf("这是一个%dX%d的棋盘,请不要越界!\n",ROW-2,COL-2);
while (1)
{
printf("请输入要点击的坐标:");
scanf("%d,%d", &i, &j);
if (0 < i <= 18 && 0 < j <= 18)
{
if (a < 1)
{
Mine(board, ROW, COL, i + 1, j + 1);
a++;
}
printf("\n");
circle(board, i + 1, j + 1);
FakeDisplay(board, board2);
DispalyBoard(board, ROW, COL);
printf("\n");
DispalyBoard(board2, ROW, COL);
printf("请问要插旗子吗(y/n)\n");
scanf("%c", &b);
if (b == 'y')
{
printf("请输入棋子的坐标:");
scanf("%d,%d", &i, &j);
Flag(board2, i + 1, j + 1);
DispalyBoard(board2, ROW, COL);
}
}
else if (b == 'n')
{
continue;
}
if (judge2(board, board2, i, j) == 1)
{
printf("失败了,嘤嘤嘤(っ °Д °;)っ\n");
break;
}
if (a == (ROW-2)*(COL-2)-(ROW/2))
{
judge(board, board2);
printf("你成功了,耶耶耶┗|`O′|┛ 嗷~~");
break;
}
}
}
int main()
{
int a = 0;
srand((unsigned)time(NULL));
do
{
index();
printf("请输入要选择的选项\n");
scanf("%d", &a);
switch (a)
{
case 1:
game();
break;
case 0:
printf("退出\n");
break;
default:
printf("没有此选项,请重新选择\n");
break;
}
} while (a);
return 0;
}
game.c
最主要的代码就是实现点击之后雷的个数显示,和运用数组迁移实现点击棋盘的显示,并且由于对初学者比较友好所以部分代码写的比较繁琐
#define _CRT_SECURE_NO_WARNINGS 1;
#include"game.h"
#include<stdio.h>
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 1; i < row-1; i++)
{
for (j = 1; j < col-1; j++)
{
board[i][j] = ' ';
}
}
for (j = 0; j < row; j++)
{
board[row-1][j] = '#';
}
for (j = 0; j < row; j++)
{
board[0][j] = '#';
}
for (j = 1; j < row-1; j++)
{
board[j][0] = '#';
}
for (j = 1; j < row - 1; j++)
{
board[j][row-1] = '#';
}
}
void DispalyBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c |", board[i][j]);
}
printf("\n");
printf("————————————————————\n");
}
}
void Mine(char board[ROW][COL], int row, int col,int x,int y)
{
int i = 0;
int j = 0;
for (i = 0; i < ROW/2; i++)
{
int X = rand() % (row);
int Y = rand() % (col);
if (board[X][Y] != '*' && X != x-1 && Y != y-1 && board[X][Y]!='#'&& 0<X<row-1 && 0<Y<col-1)
{
board[X][Y] = '*';
}
else
{
i--;
continue;
}
}
}
char FakeClick(char board2[ROW][COL], int x, int y)
{
int j = 0;
if (board2[x - 2][y - 1] == '*')
{
j++;
}
if (board2[x][y-1] == '*')
{
j++;
}
if (board2[x-2][y] == '*')
{
j++;
}
if (board2[x-1][y] == '*')
{
j++;
}
if (board2[x][y] == '*')
{
j++;
}
if (board2[x-2][y-2] == '*')
{
j++;
}
if (board2[x - 1][y - 2] == '*')
{
j++;
}
if (board2[x][y - 2] == '*')
{
j++;
}
char i = j + '0';
return i;
}
void circle(char board2[ROW][COL], int x, int y)
{
int d = x;
int c = x;
int b = x;
int j = 0;
int e = y;
if (board2[x - 2][y - 1] != '*' && board2[x - 2][y - 1] != '#')
{
board2[x - 2][y - 1] = FakeClick(board2, x - 1, y);
}
if (board2[x][y - 1] != '*' && board2[x][y - 1] != '#')
{
board2[x][y - 1] = FakeClick(board2, x + 1, y);
}
if (board2[x - 1][y - 1] != '*' && board2[x - 1][y - 1] != '#')
{
board2[x - 1][y - 1] = FakeClick(board2, x, y);
}
for (j = 0; j < 3; j++)
{
if (board2[x - 2][y - 2] != '*' && board2[x - 2][y - 2] != '#')
{
board2[x - 2][y - 2] = FakeClick(board2, x - 1, y - 1);
}
x++;
}
for (j = 0; j < 3; j++)
{
if (board2[c - 2][y] != '*' && board2[c - 2][y] != '#')
{
board2[c - 2][y] = FakeClick(board2, c - 1, y + 1);
}
else
{
continue;
}
c++;
}
}
void FakeDisplay(char board[ROW][COL],char board2[ROW][COL])
{
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (board[i][j] != '*' && 0<i<ROW-1 && 0<j<COL-1)
{
board2[i][j] = board[i][j];
}
else
{
continue;
}
}
}
}
void Flag(char board[ROW][COL],int row,int col)
{
char a = board[row - 1][col - 1];
while (1)
{
if (board[row - 1][col - 1] == ' ')
{
board[row - 1][col - 1] = '$';
break;
}
else
printf("坐标输入错误,请重新输入\n");
}
}
int judge(char board[ROW][COL], char board2[ROW][COL])
{
int i = 0;
int j = 0;
int a = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < ROW; j++)
{
if (board[i][j] != '*' )
{
if (board2[i][j] !=' ')
{
a++;
}
}
}
}
return a;
}
int judge2(char board[ROW][COL], char board2[ROW][COL],int x,int y)
{
int i = 0;
int j = 0;
int a = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < ROW; j++)
{
if (board[i][j] == '*' && board2[i][j]!='$')
{
if (i == x && j == y)
{
a = 1;
}
}
}
}
return a;
}
int ergodic(char board[ROW][COL])
{
int i = 0;
int j = 0;
int a = 1;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < ROW; j++)
{
if (board[i][j] != ' ')
{
a++;
}
}
}
return a;
}
运用的几乎全是数组的知识,非常适合初学者做着玩来提高理解,虽然简单,但是也废了博主不少时间,也有一点小bug(多多包涵)
下面则为游戏开始棋盘的输出方式
输入坐标显示,并且随机显示5颗雷(雷的个数可以自己恒定)
运用数组挪移即可不显示雷
插入旗子,只需输入y,在输入旗子的坐标即可
如果点击的坐标是雷,游戏结束
同理,如果所有旗子覆盖了雷,并且其他位置全部被点开,则游戏胜利