柚子快報激活碼778899分享:c語言簡易掃雷游戲的實現(xiàn)
柚子快報激活碼778899分享:c語言簡易掃雷游戲的實現(xiàn)
c語言簡易掃雷游戲的實現(xiàn)
一、前言?
首先我們要知道,在一個工程中,所有的代碼是不會放在一個.c文件中的藍。這樣不利于程序員之間的協(xié)同合作。我們一般會創(chuàng)建.h和.c文件來放置我們的代碼,把函數(shù)的聲明放在頭文件(.h)中,把函數(shù)的定義放在源文件(.c)中,在使用的時候包含頭文件。
例如:我們要實現(xiàn)一個計算器的代碼(假設(shè)只有加、減、乘、除),我們一般會把計算器的各個功能模塊分配給不同的程序員來進行編寫,各個模塊的程序員完成任務(wù)之后,我們有了#include"add.h"、#include"add.c"、#include"sub.h"、#include"sub.c"、#include"mul.h"、#include"mul.c"、#include"div.h"、#include"div.h"。最后由其他程序員進行組合,這樣可以提高效率,節(jié)省時間?。
如下圖:
二、簡易掃雷代碼的實現(xiàn)?
2.1 掃雷游戲的基本思路?
1.使用控制臺進行掃雷游戲; 2.生成游戲菜單,實現(xiàn)選擇進行和退出游戲; 3.生成9*9的方格; 4.在方格中隨機10個雷; 5.可以排查雷:
選擇位置不是雷,則打印周圍雷的信息選擇位置如果是雷,則游戲結(jié)束把非雷位置找出,挑戰(zhàn)成功,游戲結(jié)束
2.2代碼實現(xiàn)?
1.打印菜單?
這里我們使用do-while進行打印菜單,利用switch進行選擇是否游玩game,并把它們放到對應(yīng)的位置,如圖: 把menu函數(shù)的定義放在game.h中。 此時的運行結(jié)果:
2.初始化掃雷的棋盤?
在9*9的方格中,我們需要的儲存信息,假設(shè)我們把雷視為1,把非雷的位置視為0。在進行游戲時,當(dāng)點擊一次位置(假設(shè)為非雷),棋盤需要顯示周圍雷的信息,如圖: 此時的1(周圍雷數(shù))會與我們一開始定義的1(雷)產(chǎn)生歧義,所以這里采用建立兩個棋盤來分別存儲數(shù)據(jù)來避免這個問題。一個棋盤用來布置雷,另一個棋盤用來顯示雷的信息。
依據(jù)以上的思路,我們需要顯示周圍雷的信息,對于邊緣的雷,會存在越界的情況,我們無法用代碼實現(xiàn)周圍雷的信息。 因此,我們將棋盤擴大來存儲信息,改為11*11。
我們利用二維數(shù)組來生成棋盤,將1和0設(shè)為字符形式來進行存儲,另一棋盤用”*"來進行顯示,巧妙地將數(shù)組統(tǒng)一為字符形式。
3.對棋盤進行打印藍
此時一定要注意打印9*9的棋盤就行!
運行結(jié)果演示:
4.布置雷?
我們需要在9*9的棋盤上隨機布置10個雷,注意是9*9!,因為是進行隨機布置,我們使用rand進行實現(xiàn),rand產(chǎn)生的是偽隨機數(shù),加以時間進行隨機化,不要忘記寫頭文件!
運行結(jié)果演示:
5.排查雷?
我們要排查的雷的信息儲存在mine數(shù)組中,在選擇坐標(biāo)后需要顯示信息,所以此時需要把mine數(shù)組和show數(shù)組的信息放在一個新的函數(shù)中,當(dāng)然所選擇的坐標(biāo)需要在9*9的棋盤中不能越界,對應(yīng)的坐標(biāo)(假設(shè)為下x、y)也需要傳到函數(shù)中。 我們首先寫第一次選擇就被炸死的情況,第一次存活的情況我們再借助另一函數(shù)實現(xiàn),先寫一個基本思路,最后我們進行細化。現(xiàn)在我們還不太了解while中的條件,之后我們再進行修改。 現(xiàn)在我們建立一個新函數(shù)Getminecount來數(shù)我們選擇的坐標(biāo)附近雷的個數(shù)。我們只需要將8個坐標(biāo)的數(shù)值相加再減去‘0’(字符)就行,因為我們一開始在mine數(shù)組中就是選擇以字符形式存儲。
int Getminecount(char mine[ROWS][COLS], int x, int y)
{
return 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]+mine[x-1][y] - 8 * '0';
}
進一步優(yōu)化,顯示所選位置周圍的雷數(shù)。
void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("請輸入排查的坐標(biāo):");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("被炸死了\n");
Showboard(mine, ROW, COL);
break;
}
else
{
int c = Getminecount(mine, x, y);
show[x][y] = c + '0';
Showboard(show, ROW, COL);
}
}
else
{
printf("輸入的坐標(biāo)有誤,請重新輸入!\n");
}
}
}
現(xiàn)在我們需要加上while中的條件,游戲一旦找到71個位置沒有雷,則游戲結(jié)束,成功。我們不妨用win來作為一個計數(shù)的效果,如果掃完雷,win就等于71,成功掃雷。但是此時我們會發(fā)現(xiàn),10這個常量經(jīng)常被重復(fù)使用,上面的count也被定義為了10,為了使用方便,我們在game.h中添加#define EASY_COUNT 10。 分析到這里,有兩種情況跳出循環(huán),一個是break跳出,;另一個是挑戰(zhàn)成功。我們可以使用if語句實現(xiàn)。并展示雷的位置。
void Findmine(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("請輸入排查的坐標(biāo):");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("被炸死了\n");
Showboard(mine, ROW, COL);
break;
}
else
{
win++;
printf("還剩下%d個位置沒有排查\n", ROW * COL - EASY_COUNT - win);
int c = Getminecount(mine, x, y);
show[x][y] = c + '0';
Showboard(show, ROW, COL);
}
}
else
{
printf("輸入的坐標(biāo)有誤,請重新輸入!\n");
}
}
if (win == ROW * COL - EASY_COUNT)
{
printf("恭喜你,掃雷成功!\n");
Showboard(mine, ROW, COL);
}
}
現(xiàn)在我們可以說這個簡易版本的掃雷游戲已經(jīng)結(jié)束了?。ǔ舐暎? 但是呢,掃雷的游戲其實并沒有結(jié)束,掃雷游戲的其他功能我還沒有學(xué)會?,更多內(nèi)容我會進行學(xué)習(xí)更新,一定會補上的!?
柚子快報激活碼778899分享:c語言簡易掃雷游戲的實現(xiàn)
推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。