当前位置:网站首页>扫雷小游戏——C语言
扫雷小游戏——C语言
2022-07-31 04:23:00 【硌手的小虫子@】
目录
一、游戏规则:
二、运行逻辑:
三、基本步骤:
四、总代码:
一、游戏规则:
扫雷游戏是根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即失败。
二、运行逻辑:
1、创建和打印游戏菜单。
2、创建两个棋盘数组,一个是布置雷的棋盘数组,一个是排查雷的棋盘数组。
3、初始化两个棋盘,把布置雷的棋盘全部初始为' 0 ' ,把排查雷的棋盘全部初始化为' * ' 。
4、打印棋盘。
5、布置雷,雷的个数可以在头文件中通过宏定义设置。
6、排查雷,在布置雷的数组里排查,如果是雷则打印被炸死,并退出游戏。如果不是雷,则统计雷的个数,是0则展开空白,不是0则将雷的个数传给排查雷的那个数组。
7、判断输赢,如果空格的总的个数于行和列的乘积减去布雷的个数,则表示排雷成功。
三、基本步骤:
1、显示菜单界面:
void menu()
{
printf("************ 1. play **********\n");
printf("************ 0. exit **********\n");
}2、设计两个数组存放信息:
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };3、初始化棋盘:
void init_board(char board[ROWS][COLS], int rows, int cols, char set)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}4、布置雷:
void set_mine(char mine[ROWS][COLS], int row, int col)
{
//布置10个雷
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
5、打印棋盘:
void display_board(char board[ROWS][COLS], int row, int col)
{
//列号
for (int j = 0; j <= col; j++)
{
printf("%d ", j);
}
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");
}
}6、排雷并判断雷是否排查完:
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
}
//排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win < row * col - EASY_COUNT)
{
printf("请输入要排查雷的坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//坐标被排查过
if (show[x][y] == '*')
{
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
display_board(mine, ROW, COL);
break;
}
else
{
int count = get_mine_count(mine, x, y);
show[x][y] = count + '0';
display_board(show, ROW, COL);
win++;
}
}
else
{
printf("该坐标已经被排查过了\n");
}
}
else
{
printf("该坐标已经被排查过了\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
display_board(mine, ROW, COL);
}
}
四、总代码:
使用多文件实现,一个头文件game.h,两个源文件game.c和test.c。
1、game.h:
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 30
//初始化棋盘
void init_board(char board[ROWS][COLS], int rows, int cols, char set);
//打印棋盘
void display_board(char board[ROWS][COLS], int row, int col);
//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col);
//排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);2、game.c:
#include"game.h"
//初始化棋盘
void init_board(char board[ROWS][COLS], int rows, int cols, char set)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
//打印棋盘
void display_board(char board[ROWS][COLS], int row, int col)
{
//列号
for (int j = 0; j <= col; j++)
{
printf("%d ", j);
}
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_mine(char mine[ROWS][COLS], int row, int col)
{
//布置10个雷
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
}
//排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win < row * col - EASY_COUNT)
{
printf("请输入要排查雷的坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//坐标被排查过
if (show[x][y] == '*')
{
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
display_board(mine, ROW, COL);
break;
}
else
{
int count = get_mine_count(mine, x, y);
show[x][y] = count + '0';
display_board(show, ROW, COL);
win++;
}
}
else
{
printf("该坐标已经被排查过了\n");
}
}
else
{
printf("该坐标已经被排查过了\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
display_board(mine, ROW, COL);
}
}
3、test.c:
#include"game.h"
void menu()
{
printf("************ 1. play **********\n");
printf("************ 0. exit **********\n");
}
void game()
{
//设计2个数组存放信息
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化棋盘
//mine初始化为全‘0’
//show初始化为全‘*’
init_board(mine, ROWS, COLS, '0');
init_board(show, ROWS, COLS, '*');
//布置雷
set_mine(mine, ROW, COL);
//排雷
display_board(show, ROW, COL);
find_mine(mine, show, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
边栏推荐
- [Swift]自定义点击APP图标弹出的快捷方式
- (8) Math class, Arrays class, System class, Biglnteger and BigDecimal classes, date class
- MySQL to revise the root password
- Redis counts new and retained users
- MySQL基础操作
- BUG消灭者!!实用调试技巧超全整理
- interprocess communication
- 【论文阅读】Mastering the game of Go with deep neural networks and tree search
- $parent/$children 与 ref
- C语言从入门到如土——数据的存储
猜你喜欢

Understanding and Using Unity2D Custom Scriptable Tiles (4) - Start to build a custom tile based on the Tile class (below)

ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that corresponds to your

VScode+ESP32 quickly install ESP-IDF plugin

开源社区三十年 | 2022开放原子全球开源峰会开源社区三十年专题活动圆满召开
![[Paper reading] Mastering the game of Go with deep neural networks and tree search](/img/4f/899da202e13bd561bbfdbaeebe4d2e.jpg)
[Paper reading] Mastering the game of Go with deep neural networks and tree search

【论文阅读】Mastering the game of Go with deep neural networks and tree search

(四)递归、可变参数、访问修饰符、理解 main 方法、代码块

【C语言进阶】文件操作(一)

两个地址池r2负责管地址池r1负责管dhcp中继

马斯克对话“虚拟版”马斯克,脑机交互技术离我们有多远
随机推荐
BUG destroyer!!Practical debugging skills are super comprehensive
MySQL模糊查询可以使用INSTR替代LIKE
Knowledge Distillation 7: Detailed Explanation of Knowledge Distillation Code
Two address pools r2 are responsible for managing the address pool r1 is responsible for managing dhcp relays
(tree) Last Common Ancestor (LCA)
ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法
Redis 使用LIST做最新评论缓存
Redis 使用 sorted set 做最新评论缓存
Pytest e-commerce project combat (on)
Safety 20220718
Safety 20220722
A brief introduction to the showDatePicker method of the basic components of Flutter
interprocess communication
Redis 统计用户新增和留存
MySQL fuzzy query can use INSTR instead of LIKE
MySQL数据库必会的增删查改操作(CRUD)
Postgresql 15 source code analysis (5) - pg_control
type_traits metaprogramming library learning
行业落地呈现新进展 | 2022开放原子全球开源峰会OpenAtom OpenHarmony分论坛圆满召开
Notes on the establishment of the company's official website (6): The public security record of the domain name is carried out and the record number is displayed at the bottom of the web page