扫雷小游戏(C语言实现)
【摘要】 写在前面我们已经写过了三子棋小游戏肯定没玩过瘾,我们再写个扫雷小游戏吧!@TOC 认识游戏相信大家对扫雷都不陌生!每台电脑必备的小游戏! 游戏规则就是在规定的时间将埋藏的地雷全部找到,即游戏胜利!胜利条件:你需要在不点错雷的情况下尽可能快的将所有的雷都标记出来,如果你点错,就得重新开始,所以扫雷也有一定的运气成分。简单说就是将所有不是雷的地方全部标记出来,剩下地雷,游戏胜利,如果标记点到了...
写在前面
我们已经写过了三子棋小游戏肯定没玩过瘾,我们再写个扫雷小游戏吧!
@TOC
认识游戏
相信大家对扫雷都不陌生!每台电脑必备的小游戏!
游戏规则
就是在规定的时间将埋藏的地雷全部找到,即游戏胜利!
胜利条件:你需要在不点错雷的情况下尽可能快的将所有的雷都标记出来,如果你点错,就得重新开始,所以扫雷也有一定的运气成分。
简单说
就是将所有不是雷的地方全部标记出来,剩下地雷,游戏胜利,如果标记点到了地雷,游戏失败!
如何找到不是地雷标记出来呢?
每点开一个小格子,如果是雷,就游戏结束,如果不是就会出现数字,出现的数字表示,周围一圈雷的个数!
2
表示周围一圈的地雷数为2
个。
根据这些数字即可将地雷全部排除走向胜利!
游戏框架
游戏框架和三子棋一样!
//游戏框架
int input = 0;
do
{
menu();//菜单
scanf("%d", &input); //选择
switch (input)
{
case 1:game();
break;
case 0:printf("退出游戏\n");
break;
default:printf("输入错误,请重新输入\n");
break;
}
} while (input);
我们写小游戏的框架基本上都是这样!
游戏实现
游戏的实现是我们这个游戏的重点内容!
我们如何才能将游戏实现呢?
先从原理入手!
-
埋雷
如何买雷呢?
我们所玩的扫雷都是由许多小格子组成的矩阵!
所以我们可以利用二维数组埋地雷! -
显示该点周围雷的个数
周围雷数的计算,就是判断改点周围是非为雷,并且计算个数显示给玩家! -
判断游戏状态
点到地雷说明游戏结束,将所有地雷找到,游戏胜利。
实现思想
用一个二维数组埋雷
另一个二维数组显示给玩家
当我们将雷弄成AxA
的雷阵藏雷,会发现如果我们进行周围雷数的查找是会发生数组越界,所以我们可以创建(A+2)x(A+2)
的雷阵,然后埋雷在AxA
中!
void game()
{
//初始化布雷数组—— > 初始化棋盘数组—— >
//设置地雷—— > 显示棋盘—— > 玩家扫雷
//埋雷
char mine[ROWS][COLS] = { 0 }; //雷区图
char show[ROWS][COLS] = { 0 }; //玩家图
//初始化棋盘
InitBoard(mine, ROWS, COLS,'0');
InitBoard(show, ROWS, COLS, '*');
//设置地雷
SetMine(mine, ROW, COL,MineCount);
PrintBoard(show, ROW, COL);
//玩家扫雷
int count = ROW*COL-MineCount;
while (CheckMine(mine,show, ROW, COL))
{
count--;
PrintBoard(show, ROW, COL);
if (count == 0)
{
printf("恭喜你,游戏胜利\n");
PrintBoard(mine, ROW, COL);
break;
}
}
}
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col, char x)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = x;
}
}
return ;
}
//打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
//打印列号
for (i = 0; i <= col; i++)
printf(" %d ", i);
printf("\n");
for (i = 0; i < row; i++)
{
printf(" %d ", i+1);
int j = 0;
for (j = 0; j <col; j++)
{
printf(" %c ", board[i][j]);
}
printf("\n");
}
return;
}
//埋雷
void SetMine(char board[ROW][COL], int row, int col, int count)
{
while (count)
{
int i = rand() % row;
int j = rand() % col;
if (board[i][j] == '0')
{
board[i][j] = '1';
count--;
}
}
}
核心代码
//查雷
int CheckMine(char mine[ROW][COL],char show[ROW][COL], int row, int col)
{
printf("请输入你要扫雷的坐标:>");
while (1)
{
int i = 0, j = 0;
scanf("%d%d", &i, &j);
if (i >=1 && i <= row && j >=1 && j <= col)
{
if (mine[i-1][j-1] != '1')
{
int count=IsMineCount(mine,i-1,j-1);
show[i-1][j-1] = count+'0';
return 1;
}
else
{
printf("很遗憾,你被炸死了\n");
PrintBoard(mine, ROW, COL);
return 0;
}
}
}
}
int IsMineCount(char mine[ROW][COL], int x, int y)
{
int count = 0;
int i= 0;
for (i = x - 1; i <= x + 1; i++)
{
int j = 0;
for (j = y - 1; j <=y + 1; j++)
{
if (mine[i][j] == '1')
{
count++;
}
}
}
return count;
}
效果展示
全部代码
test.c
文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("******************************\n");
printf("********** 1.play ******\n");
printf("********** 0.exit ******\n");
printf("******************************\n");
printf("Input(1/0):>");
}
void game()
{
//初始化布雷数组—— > 初始化棋盘数组—— > 设置地雷
//—— > 显示棋盘—— > 玩家扫雷
//埋雷
char mine[ROWS][COLS] = { 0 }; //雷区图
char show[ROWS][COLS] = { 0 }; //玩家图
//初始化棋盘
InitBoard(mine, ROWS, COLS,'0');
InitBoard(show, ROWS, COLS, '*');
//设置地雷
SetMine(mine, ROW, COL,MineCount);
PrintBoard(show, ROW, COL);
//玩家扫雷
int count = ROW*COL-MineCount;
while (CheckMine(mine,show, ROW, COL))
{
count--;
PrintBoard(show, ROW, COL);
if (count == 0)
{
printf("恭喜你,游戏胜利\n");
break;
}
}
}
game.h
文件
#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 MineCount 6
void InitBoard(char board[ROWS][COLS],int row,int col,char x);
void SetMine(char board[ROWS][COLS], int row, int col,int count);
void PrintBoard(char board[ROW][COL], int row, int col);
int CheckMine (char mine[ROWS][COLS], char show[ROW][COL], int row, int col);
int IsMineCount(char mine[ROWS][COLS],int i, int j);
game.c
文件
#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col, char x)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = x;
}
}
return ;
}
void SetMine(char board[ROW][COL], int row, int col, int count)
{
while (count)
{
int i = rand() % row;
int j = rand() % col;
if (board[i][j] == '0')
{
board[i][j] = '1';
count--;
}
}
}
void PrintBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
//打印列号
for (i = 0; i <= col; i++)
printf(" %d ", i);
printf("\n");
for (i = 0; i < row; i++)
{
printf(" %d ", i+1);
int j = 0;
for (j = 0; j <col; j++)
{
printf(" %c ", board[i][j]);
}
printf("\n");
}
return;
}
int CheckMine(char mine[ROW][COL],char show[ROW][COL], int row, int col)
{
printf("请输入你要扫雷的坐标:>");
while (1)
{
int i = 0, j = 0;
scanf("%d%d", &i, &j);
if (i >=1 && i <= row && j >=1 && j <= col)
{
if (mine[i-1][j-1] != '1')
{
int count=IsMineCount(mine,i-1,j-1);
show[i-1][j-1] = count+'0';
return 1;
}
else
{
printf("很遗憾,你被炸死了\n");
return 0;
}
}
}
}
int IsMineCount(char mine[ROW][COL], int x, int y)
{
int count = 0;
int i= 0;
for (i = x - 1; i <= x + 1; i++)
{
int j = 0;
for (j = y - 1; j <=y + 1; j++)
{
if (mine[i][j] == '1')
{
count++;
}
}
}
return count;
}
持续更新.....
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)