C語言代碼實(shí)現(xiàn)掃雷游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下
該游戲我們也是利用數(shù)組完成,設(shè)置倆個(gè)數(shù)組一個(gè)mine數(shù)組,一個(gè)show數(shù)組。
mine數(shù)組存放雷,show數(shù)組顯示棋盤并且顯示該位置是否有雷或者顯示該位置周圍有幾個(gè)雷。
數(shù)組大小有講究,我們宏定義變量 ROW COL 為9 定義ROWS COLS為11,我們顯示的是9X9的棋盤,也是將雷設(shè)置在9X9的位置內(nèi),但是我們?cè)O(shè)置數(shù)組是設(shè)置11X11,因?yàn)檫@樣方便我們遍歷9X9棋盤四邊位置上某位置四周雷的數(shù)目,不然的話會(huì)發(fā)生越界錯(cuò)誤。
對(duì)于雷的符號(hào),我們?cè)O(shè)置空位置為 0,有雷的位置為1,這樣易于我們統(tǒng)計(jì)某一位置周圍有多少雷的數(shù)目。
重點(diǎn)在于掃雷函數(shù),玩家輸入x y位置,我們判斷該位置是否有雷,否的話判斷該位置周圍有多少雷并在存于show數(shù)組display給玩家。并且我們輸入一個(gè)位置當(dāng)該位置不是雷的時(shí)候,計(jì)數(shù)器count++;若果該計(jì)數(shù)器count==col*row-EAXY_COUNT;我們就判斷玩家贏。
#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 10
//函數(shù)聲明
void ChushiBoard(char board[ROWS][COLS],int rows,int cols,char set);
void Dayinboard(char board[ROWS][COLS], int row, int col);
void BuzhiBoard(char mine[ROWS][COLS], int row, int col);
void CaoleiBoard(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
void menu()
{
printf("*****************************************\n");
printf("*****************************************\n");
printf("**** 輸入1開始游戲 輸入0退出游戲 *****\n");
printf("*****************************************\n");
printf("*****************************************\n\n\n");
}
void game()
{
char mine[ROWS][COLS];//存放雷
char show[ROWS][COLS];//顯示排查出來的雷
//初始化
ChushiBoard(mine, ROWS, COLS,'0');//'0'
ChushiBoard(show, ROWS, COLS,'*');//'*'
//布置雷
BuzhiBoard(mine,ROW,COL);
//Dayinboard(mine, ROW, COL);
//打印棋盤
Dayinboard(show, ROW, COL);
//掃雷
CaoleiBoard(mine,show,ROW,COL);
}
void test()
{
int input = 0;
do
{
menu();
printf("請(qǐng)輸入:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n\n");
break;
default:
printf("輸入錯(cuò)誤,重新輸入\n\n");
break;
}
} while (input);
}
int main()
{
test();
system("pause");
return 0;
}
void ChushiBoard(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 Dayinboard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("------------------------------\n");
for (i = 0; i <= col; 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");
}
printf("------------------------------\n");
}
void BuzhiBoard(char mine[ROWS][COLS], int row, int col)
{
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--;
}
}
}
static int GetMineCount(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 CaoleiBoard(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("請(qǐng)輸入要排查的坐標(biāo)(格式:X空格X回車):>");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
{
if (mine[x][y] == '1')
{
printf(" 很遺憾,你被炸死了!??!\n");
Dayinboard(mine, row, col);
break;
}
else
{
int count = GetMineCount(mine,x,y);
show[x][y] = count+'0';
Dayinboard(show, row, col);
win++;
}
}
else
{
printf("輸入的坐標(biāo)非法\n");
}
}
if (win == row*col - EASY_COUNT)
{
printf(" 恭喜你,你排雷成功了?。。n");
}
}
運(yùn)行結(jié)果:



以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c++報(bào)錯(cuò)問題解決方案lvalue required as left opera
這篇文章主要介紹了c++報(bào)錯(cuò):lvalue required as left operand of assignment,出現(xiàn)此錯(cuò)誤原因,是因?yàn)?,等?hào)左邊是不可被修改的表達(dá)式或常量,而表達(dá)式或常量不能作為左值,需要的朋友可以參考下2023-01-01
利用C語言實(shí)現(xiàn)簡(jiǎn)單三子棋游戲
這篇文章主要為大家詳細(xì)介紹了利用C語言實(shí)現(xiàn)簡(jiǎn)單三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
linux下c語言中隱藏進(jìn)程命令行參數(shù)(例如輸入密碼等高危操作)
啟動(dòng)程序很多時(shí)候用命令行參數(shù)可以很方便,做到簡(jiǎn)化一些配置,但是輸入用戶名密碼等操作,如果通過進(jìn)程查看工具直接看到密碼就太不安全了,這里就為大家分享一下方法2021-01-01
c/c++靜態(tài)庫之間相互調(diào)用的實(shí)戰(zhàn)案例
C++調(diào)用C的函數(shù)比較簡(jiǎn)單,直接使用extern "C" {}告訴編譯器用C的規(guī)則去編譯C代碼就可以了,下面這篇文章主要給大家介紹了關(guān)于c/c++靜態(tài)庫之間相互調(diào)用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
一文解析C語言中動(dòng)態(tài)內(nèi)存管理
這篇文章主要為大家詳細(xì)介紹了C語言中動(dòng)態(tài)內(nèi)存管理的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
C++?Cartographer源碼中關(guān)于傳感器的數(shù)據(jù)傳遞實(shí)現(xiàn)
這篇文章主要介紹了C++?Cartographer源碼中關(guān)于傳感器的數(shù)據(jù)傳遞實(shí)現(xiàn),前面已經(jīng)談到了Cartographer中添加軌跡的方法和傳感器的數(shù)據(jù)流動(dòng)走向。發(fā)現(xiàn)在此調(diào)用了LaunchSubscribers這個(gè)函數(shù)來訂閱相關(guān)傳感器數(shù)據(jù)2023-03-03

