首页 > 其他分享 >C语言实现扫雷游戏

C语言实现扫雷游戏

时间:2023-01-20 21:00:40浏览次数:40  
标签:ROWS 游戏 int COLS C语言 char mineboard 扫雷 printf

前言

如何利用代码实现一个扫雷游戏呢?在我们玩过的扫雷游戏里,打开游戏后看到的是一个nxn的棋盘,我们需要点击棋盘的某一位置,在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

在实际创建扫雷游戏时,我们需要构造两个棋盘,一个棋盘是隐形的,它储存的是雷的信息,另一个棋盘是面向玩家的,它显示的是最新的棋盘信息

我们点击棋盘的某一位置时,该位置会显示以它为中心的九宫格的类的数目,考虑到边缘的格子没有九宫格,我们在设置好的棋盘应在加上2行2列,但这2行2列是隐形的

一、游戏界面实现

1.游戏选择界面


void meau()

{

printf(" 扫雷游戏 \n");

printf(" 1.开始游戏 \n");

printf(" 0.退出游戏 \n");

}

2.游戏控制开关

int main()

{

srand((unsigned int)time(NULL));

int input = 0;

do{

meau();

printf("请选择\n");

scanf("%d", &input);

switch (input)

{

case 1:game();

break;

case 0:printf("游戏结束\n");

break;

default:printf("输入错误,请重新选择\n");

break;


}

} while (input);


return 0;

}

二、游戏功能实现

1.初始化棋盘

void Initboard(char board[ROWS][COLS], int rows, int cols, char set)
//扫雷游戏存在两个棋盘,因此加入参数ret对不同棋盘进行不同初始化
{

int i = 0;

int j = 0;

for (i = 0; i < rows; i++)

{

for (j = 0; j < cols; j++)

{

board[i][j] = set;

}

}

}

2.显示棋盘内容

void Display(char board[ROWS][COLS], int row, int col)

{

int i = 0;

int j = 0;

for (i = 0; i <= row; i++)

{

printf(" %d", i);

}

printf("\n");

for (i = 1; i <= row; i++)

{

printf(" %d", i);

for (j = 1; j <= col; j++)

{

printf(" %c", board[i][j]);

}

printf("\n");


}

}

3.在隐形的棋盘里布置雷

void Setthunder(char mineboard[ROWS][COLS], int row, int col)

{

int x = 0;

int y = 0;

int count = COUNTOFTHUNDER;//宏定义雷的个数赋值给count
while (count)//雷全部布置完成跳出循环

{

x = rand() % ROW + 1;

y = rand() % COL + 1;

if (mineboard[x][y] == '0')

{

mineboard[x][y] = '1';

count--;

}

}

}

4.在棋盘寻找雷

void Findthunder(char mineboard[ROWS][COLS], char thunderboard[ROWS][COLS], int row, int col)
//mineboard棋盘为隐藏棋盘,thunderboard为玩家看见的棋盘
{

int x = 0;

int y = 0;

int win = 0; //已被排查出来的不是雷的位置数目

int count = 0;

while (win <ROW*COL - COUNTOFTHUNDER)
//除雷外其余位置全被排除完后跳出循环
{

printf("请输入排雷坐标\n");

scanf("%d %d", &x, &y);

if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
//使得雷的坐标合法化
{

if (mineboard[x][y] == '1')

{

printf("gameover\n");

break;

}

else

{



count=Showthunder(mineboard, x, y);

thunderboard[x][y] = count + '0';

printf("%d\n", count);

Display(thunderboard, ROW, COL);

win++;

}

}

else

{

printf("范围非法,请重新输入\n");

}


}

if (win == ROW*COL - COUNTOFTHUNDER)

{

printf("you win!\n");

}

}

5.显示雷的信息

int  Showthunder(char mineboard[ROWS][COLS], int x, int y)
//棋盘内容为字符,函数返回类型为int
//'3'-'0'=3
//mineboard为隐藏棋盘,如果是雷,该位置的隐藏信息为1
{

return mineboard[x - 1][y] +

mineboard[x - 1][y - 1] +

mineboard[x - 1][y + 1] +

mineboard[x][y - 1] +

mineboard[x][y + 1] +

mineboard[x + 1][y - 1] +

mineboard[x + 1][y] +

mineboard[x + 1][y + 1] - 8 * '0';


}

三、代码实现

1.game.h

​#define  _CRT_SECURE_NO_WARNINGS  
#include<stdio.h>

#include<stdlib.h>

#include<time.h>

#define COUNTOFTHUNDER 10

#define ROW 9

#define COL 9

#define ROWS ROW+2

#define COLS COL+2

void Initboard(char board[ROWS][COLS], int rows, int cols, char set);

void Display(char board[ROWS][COLS], int row, int col);

void Setthunder(char mineboard[ROWS][COLS], int row, int col);

void Findthunder(char mineboard[ROWS][COLS], char thunderboard[ROWS][COLS], int row, int col);

int Showthunder(char Showthunder[ROWS][COLS], int row, int col);

2.game.c

#include"game.h"

void Initboard(char board[ROWS][COLS], int rows, int cols, char set)

{

int i = 0;

int j = 0;

for (i = 0; i < rows; i++)

{

for (j = 0; j < cols; j++)

{

board[i][j] = set;

}

}

}

void Display(char board[ROWS][COLS], int row, int col)

{

int i = 0;

int j = 0;

for (i = 0; i <= row; i++)

{

printf(" %d", i);

}

printf("\n");

for (i = 1; i <= row; i++)

{

printf(" %d", i);

for (j = 1; j <= col; j++)

{

printf(" %c", board[i][j]);

}

printf("\n");


}

}

void Setthunder(char mineboard[ROWS][COLS], int row, int col)

{

int x = 0;

int y = 0;

int count = COUNTOFTHUNDER;

while (count)

{

x = rand() % ROW + 1;

y = rand() % COL + 1;

if (mineboard[x][y] == '0')

{

mineboard[x][y] = '1';

count--;

}

}

}

void Findthunder(char mineboard[ROWS][COLS], char thunderboard[ROWS][COLS], int row, int col)

{

int x = 0;

int y = 0;

int win = 0;

int count = 0;

while (win <ROW*COL - COUNTOFTHUNDER)

{

printf("请输入排雷坐标\n");

scanf("%d %d", &x, &y);

if (x >= 1 && x <= ROW && y >= 1 && y <= COL)

{

if (mineboard[x][y] == '1')

{

printf("gameover\n");

break;

}

else

{



count=Showthunder(mineboard, x, y);

thunderboard[x][y] = count + '0';

printf("%d\n", count);

Display(thunderboard, ROW, COL);

win++;

}

}

else

{

printf("范围非法,请重新输入\n");

}


}

if (win == ROW*COL - COUNTOFTHUNDER)

{

printf("you win!\n");

}

}

int Showthunder(char mineboard[ROWS][COLS], int x, int y)

{

return mineboard[x - 1][y] +

mineboard[x - 1][y - 1] +

mineboard[x - 1][y + 1] +

mineboard[x][y - 1] +

mineboard[x][y + 1] +

mineboard[x + 1][y - 1] +

mineboard[x + 1][y] +

mineboard[x + 1][y + 1] - 8 * '0';


}

3.test.c

#include"game.h"

void meau()

{

printf(" 扫雷游戏 \n");

printf(" 1.开始游戏 \n");

printf(" 0.退出游戏 \n");

}

void game()

{

char mineboard[ROWS][COLS] = { 0 };

char thunderboard[ROWS][COLS] = { 0 };

Initboard(mineboard, ROWS, COLS, '0');

Initboard(thunderboard, ROWS, COLS, '*');

Display(mineboard, ROW, COL);

Display(thunderboard, ROW, COL);

Setthunder(mineboard, ROW, COL);

Findthunder(mineboard, thunderboard, ROW, COL);

Showthunder(thunderboard, ROWS, COLS);




}

int main()

{

srand((unsigned int)time(NULL));

int input = 0;

do{

meau();

printf("请选择\n");

scanf("%d", &input);

switch (input)

{

case 1:game();

break;

case 0:printf("游戏结束\n");

break;

default:printf("输入错误,请重新选择\n");

break;


}

} while (input);


return 0;

}

标签:ROWS,游戏,int,COLS,C语言,char,mineboard,扫雷,printf
From: https://blog.51cto.com/u_15466618/6020810

相关文章

  • C语言实现三子棋游戏
    什么是三子棋游戏?三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,棋盘被占满前率先将自己的三个棋子......
  • 第 1 天|基于 AI 进行游戏开发:5 天创建一个农场游戏!
    欢迎使用AI进行游戏开发!在本系列中,我们将使用各种AI工具,在5天内创建一个功能完备的农场游戏。到本系列结束时,你将了解到如何将多种AI工具整合到游戏开发流程中。......
  • [数据结构] 栈 (C语言)
    栈栈的概念栈(stack)是一种特殊的线性表存储结构,其一端可以进行插入和弹出的操作,而另一端是封死的。可以把栈想象成是一个柱状的容器。就比如一个乒乓球筒,我们只能在筒的......
  • C语言概述
    一.C语言程序初识,先介绍一个简单的C语言程序:#include<stdio.h>intarr[100000];//声明一个较大的整型数组,尽量放在函数外部/*原因是:函数内部申请的局部变量空间,来自于......
  • C语言自加问题与整形提升
    提问:   在程序里,++a和+a在sizeof里,明显++a没有进行运算而+a进行运算并整形提升,这是为什么?解答: 这跟提升没有关系,这是运算优先级问题++a,运算优先级最高,所以是先进......
  • 如何使用C语言实现汉诺塔
    现有3个柱子A、B、C,有n个圆盘在A柱上,要实现n个圆盘要从A柱从大到小移动到C柱。思路:先将n-1个圆盘移动到B柱上,然后将最后一个圆盘移动到C柱上,最后将B柱上的n-1个圆盘移动到C......
  • c语言 打印数字金字塔
    提问: c语言。打印数字金字塔。for循环中为什么是j<i+1呢?以及如何判断这里的控制变量到底是与n有关还是与循环变量i有关呢?需要详细的解答 #include<stdio.h>voidpi......
  • c语言实现扫雷
    前言:上一篇博客我们写了三子棋小游戏,紧着这我们趁热打铁,继续巩固知识点,再来写一个更有意思的扫雷吧,想必扫雷大家都玩过,我就不做介绍了。概述:我们一样将代码分为三部分来写,主......
  • C语言运算符&优先级
    运算符优先级这一块即使你用了很久C语言,如果不刻意记忆,也是容易搞混的.C语言的运算符非常多,一共有50多种,可以分成若干类。算术运算符算术运算符专门用于算术......
  • C语言学院教学信息管理系统[2023-01-19]
    C语言学院教学信息管理系统[2023-01-19]30、某学院教学信息管理系统功能:1、每一条记录包括一位教师的职工号、姓名、职称、性别、3门主讲课程(课程名称、开课学期、课......