用C語言實(shí)現(xiàn)掃雷小游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)掃雷小游戲的具體代碼,供大家參考,具體內(nèi)容如下
1. 規(guī)則
隨便點(diǎn)一個(gè)格子,會(huì)有一塊,上面的數(shù)字就代表數(shù)字周圍八個(gè)格子會(huì)有幾個(gè)雷,是1他周圍就只有1個(gè)雷,2就有兩個(gè)雷······;
最終任務(wù)就是點(diǎn)開所有沒有雷的格子,則取得更好的分?jǐn)?shù),如果點(diǎn)開的格子是雷,則游戲結(jié)束。
2. 編寫思路
2.1 編寫選擇界面
同上個(gè)小游戲一樣,首先編寫選擇界面,輸入1為開始游戲,輸入2則退出游戲。
void Menu()
{
printf("##########################\n");
printf("## 1:Play 2:Exit ##\n");
printf("##########################\n");
printf("請輸入# ");
}
2.2 編寫執(zhí)行程序
執(zhí)行程序需要檢測點(diǎn)開的格子(這里輸入的方式為輸入坐標(biāo))周圍的八個(gè)格子有多少個(gè)雷,并在該格子上顯示雷的個(gè)數(shù)。
int GetMines(char mine[][COL], int row, int col, int x, int y)
{
return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + \
mine[x][y - 1] + mine[x][y + 1] + \
mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0';
}
2.3 編寫設(shè)置雷的個(gè)數(shù)
宏定義雷的個(gè)數(shù)為NUMS(NUMS 20);然后隨機(jī)排布雷的位置。
void SetMines(char mine_board[][COL], int row, int col)
{
int count = NUMS; //設(shè)置雷
while (count){
int x = rand() % 10 + 1;
int y = rand() % 10 + 1;
if (mine_board[x][y] == '0'){
mine_board[x][y] = '1';
count--;
}
}
}
2.4 游戲界面的設(shè)置
以二維數(shù)組的方式設(shè)置游戲界面,這里實(shí)際設(shè)置的界面為12x12的格子界面,在前面宏定義行為12(ROW 12)列為12(COL 12);但是顯示為10x10的界面,為方便用戶輸入坐標(biāo),在行和列的前面分布標(biāo)上數(shù)字。
static void ShowLine(int nums)
{
printf("---");
for (int i = 0; i < nums; i++){
printf("-");
}
printf("\n");
}
void ShowBoard(char show_board[][COL], int row, int col)
{
printf(" ");
for (int i = 1; i < row - 1; i++){ //行的數(shù)字
printf(" %2d", i);
}
printf("\n");
ShowLine(2 * col + col + 4);//這里傳入的參數(shù)是由于‘-'占位原因,可以根據(jù)自己實(shí)際界面調(diào)整;
for (int i = 1; i < row - 1; i++){ //列的數(shù)組
printf("%2d|", i);
for (int j = 1; j < col - 1; j++){
printf(" %c |", show_board[i][j]);
}
printf("\n");
ShowLine(2 * col + col + 4);
}
}
2.5 游戲邏輯的編寫
在編寫游戲邏輯的時(shí)候,首先傳入我們設(shè)置的游戲棋盤;由于棋盤以二維數(shù)組方式設(shè)置,所以在使用前需要初始化,所以我們用memset來快速設(shè)置。
將展示前的棋盤空位都設(shè)置為 *,然后將游戲使用的棋盤空位設(shè)置為 0;
生成隨機(jī)雷的個(gè)數(shù),將其傳入棋盤,設(shè)置雷;剩余空格的個(gè)數(shù)用count來表示;
開始游戲邏輯,輸入棋盤,傳入用戶輸入的坐標(biāo),然后檢測用戶輸入的坐標(biāo)是否越界;越界則提示用戶輸入越界,需要重新輸入;如果沒越界則游戲繼續(xù)進(jìn)行,檢測用戶輸入的坐標(biāo)是否已經(jīng)點(diǎn)開,如果點(diǎn)開則提示用戶重新輸入;然后判斷點(diǎn)開的是不是雷,如果是游戲結(jié)束,如果不是游戲繼續(xù),直到所有空格都點(diǎn)開count=0結(jié)束循環(huán);
如果剩余空格count不為0游戲結(jié)束,則說明踩到雷;否則說明雷全被排完,然后向用戶展示所有雷的分布范圍。
void Game()
{
char show_board[ROW][COL];
char mine_board[ROW][COL];
memset(show_board, '*', sizeof(show_board));
memset(mine_board, '0', sizeof(mine_board));
srand((unsigned long)time(NULL));
SetMines(mine_board, ROW, COL);
int count = (ROW - 2)*(COL - 2) - NUMS;
int x = 0;
int y = 0;
do{
ShowBoard(show_board, ROW, COL);
printf("請輸入位置# ");
scanf("%d %d", &x, &y);
if (x<1 || x>10 || y<1 || y>10){
printf("輸入越界,請重新輸入!\n");
continue;
}
if (show_board[x][y] != '*'){//證明位置被排過了
printf("該位置已被排除,請重新輸入!\n");
continue;
}
if (mine_board[x][y] == '1'){//沒點(diǎn)到雷
break;
}
int num = GetMines(mine_board, ROW, COL, x, y);
show_board[x][y] = num + '0';
count--;
} while (count > 0);
if (count > 0){
printf("you loss!\n");
}
else{
printf("you win!\n");
}
printf("你輸了,下面是雷區(qū)的分布\n");
ShowBoard(mine_board, ROW, COL);
printf("play again? \n");
}
2.6 設(shè)定游戲開始o(jì)r退出
這里設(shè)定如果用戶輸入的為1,則開始游戲;輸入2 則直接退出,如果輸入其他數(shù)字則提升用戶輸入錯(cuò)誤。
int main()
{
int quit = 0;
int select = 0;
while (!quit){
Menu();
scanf("%d", &select);
switch (select){
case 1:
Game();
break;
case 2:
quit = 1;
break;
default:
printf("輸入有誤,請重新輸入\n");
}
}
system("pause");
return 0;
}
3. 匯總代碼
然后將上述代碼整合起來,匯總?cè)缦拢?/p>
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<windows.h>
#pragma warning(disable:4996)
#define ROW 12
#define COL 12
#define NUMS 20
void Menu()
{
printf("##########################\n");
printf("## 1:Play 2:Exit ##\n");
printf("##########################\n");
printf("請輸入# ");
}
void SetMines(char mine_board[][COL], int row, int col)
{
int count = NUMS; //設(shè)置雷
while (count){
int x = rand() % 10 + 1;
int y = rand() % 10 + 1;
if (mine_board[x][y] == '0'){
mine_board[x][y] = '1';
count--;
}
}
}
int GetMines(char mine[][COL], int row, int col, int x, int y)
{
return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + \
mine[x][y - 1] + mine[x][y + 1] + \
mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0';
}
static void ShowLine(int nums)
{
printf("---");
for (int i = 0; i < nums; i++){
printf("-");
}
printf("\n");
}
void ShowBoard(char show_board[][COL], int row, int col)
{
printf(" ");
for (int i = 1; i < row - 1; i++){ //行的數(shù)字
printf(" %2d", i);
}
printf("\n");
ShowLine(2 * col + col + 4);
for (int i = 1; i < row - 1; i++){ //列的數(shù)組
printf("%2d|", i);
for (int j = 1; j < col - 1; j++){
printf(" %c |", show_board[i][j]);
}
printf("\n");
ShowLine(2 * col + col + 4);
}
}
void Game()
{
char show_board[ROW][COL];
char mine_board[ROW][COL];
memset(show_board, '*', sizeof(show_board));
memset(mine_board, '0', sizeof(mine_board));
srand((unsigned long)time(NULL));
SetMines(mine_board, ROW, COL);
int count = (ROW - 2)*(COL - 2) - NUMS;
int x = 0;
int y = 0;
do{
ShowBoard(show_board, ROW, COL);
printf("請輸入位置# ");
scanf("%d %d", &x, &y);
if (x<1 || x>10 || y<1 || y>10){
printf("輸入越界,請重新輸入!\n");
continue;
}
if (show_board[x][y] != '*'){//證明位置被排過了
printf("該位置已被排除,請重新輸入!\n");
continue;
}
if (mine_board[x][y] == '1'){//沒點(diǎn)到雷
break;
}
int num = GetMines(mine_board, ROW, COL, x, y);
show_board[x][y] = num + '0';
count--;
} while (count > 0);
if (count > 0){
printf("you loss!\n");
}
else{
printf("you win!\n");
}
printf("你輸了,下面是雷區(qū)的分布\n");
ShowBoard(mine_board, ROW, COL);
printf("play again? \n");
}
int main()
{
int quit = 0;
int select = 0;
while (!quit){
Menu();
scanf("%d", &select);
switch (select){
case 1:
Game();
break;
case 2:
quit = 1;
break;
default:
printf("輸入有誤,請重新輸入\n");
}
}
system("pause");
return 0;
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于Matlab圖像處理的公路裂縫檢測實(shí)現(xiàn)
隨著公路的大量投運(yùn),公路日常養(yǎng)護(hù)和管理已經(jīng)成為制約公路運(yùn)營水平提高的瓶頸,特別是路面狀態(tài)采集、檢測維護(hù)等工作更是對傳統(tǒng)的公路運(yùn)維模式提出了挑戰(zhàn)。這篇文章主要介紹了如何通過Matlab圖像處理實(shí)現(xiàn)公路裂縫檢測,感興趣的可以了解一下2022-02-02
C語言報(bào)錯(cuò)Use of Uninitialized Variable的原因及解決方案
Use of Uninitialized Variable是C語言中常見且危險(xiǎn)的錯(cuò)誤之一,它通常在程序試圖使用一個(gè)未初始化的變量時(shí)發(fā)生,本文將詳細(xì)介紹Use of Uninitialized Variable的產(chǎn)生原因,提供多種解決方案,并通過實(shí)例代碼演示如何有效避免和解決此類錯(cuò)誤,需要的朋友可以參考下2024-06-06
C++中一維數(shù)組與指針的關(guān)系詳細(xì)總結(jié)
以下是對C++中一維數(shù)組與指針的關(guān)系進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下2013-09-09
VC++實(shí)現(xiàn)的OpenGL線性漸變色繪制操作示例
這篇文章主要介紹了VC++實(shí)現(xiàn)的OpenGL線性漸變色繪制操作,結(jié)合實(shí)例形式分析了VC++基于OpenGL進(jìn)行圖形繪制的相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
C語言數(shù)據(jù)結(jié)構(gòu)深入探索順序表
大家好,今天給大家?guī)淼氖琼樞虮恚矣X得順序表還是有比較難理解的地方的,于是我就把這一塊的內(nèi)容全部整理到了一起,希望能夠給剛剛進(jìn)行學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的人帶來一些幫助,或者是已經(jīng)學(xué)過這塊的朋友們帶來更深的理解,我們現(xiàn)在就開始吧2022-05-05

