摘要:相信大家都玩過(guò)掃雷游戲,在學(xué)習(xí)了二維數(shù)組之后,我也用語(yǔ)言寫(xiě)了一個(gè)簡(jiǎn)單的掃雷游戲規(guī)則如下通過(guò)對(duì)宏和宏來(lái)設(shè)置游戲的棋盤(pán)大小如果想玩的掃雷則需設(shè)置和為通過(guò)對(duì)宏來(lái)設(shè)置局中雷的個(gè)數(shù)雷的個(gè)數(shù)需要對(duì)用戶輸入要掃描的坐標(biāo),如果有雷則雷爆炸游戲結(jié)束,如
相信大家都玩過(guò)掃雷游戲,在學(xué)習(xí)了二維數(shù)組之后,我也用c語(yǔ)言寫(xiě)了一個(gè)簡(jiǎn)單的掃雷游戲規(guī)則如下:
1.通過(guò)對(duì)宏Row和宏List來(lái)設(shè)置游戲的棋盤(pán)大?。ㄈ绻胪?0x10的掃雷則需設(shè)置Row和List為12);
2.通過(guò)對(duì) 宏BoomNumber 來(lái)設(shè)置局中雷的個(gè)數(shù)(雷的個(gè)數(shù)需要<=(Row-2)*(List-2));
3.對(duì) 用戶輸入要掃描的坐標(biāo),如果有雷則雷爆炸游戲結(jié)束,如果沒(méi)有雷則統(tǒng)計(jì)出該坐標(biāo)周?chē)睦椎膫€(gè)數(shù),一直循環(huán)此操作,直到棋盤(pán)中未掃描的地方全是雷為止則掃雷成功。
#pragma warning (disable:4996)#pragma once#include#include#include#define Row 12#define List 12#define BoomNumber 20#define Boom "1"http://1為有雷#define nice "0"extern void Game();extern void SetMine(char MineBoard, int row, int list);extern void Select(char MineBoard, int row, int list);extern void Menu();extern void CountBoom(char MineBoard[][List], int row, int list, int x, int y);
這便是掃雷游戲的頭文件,里面聲明的函數(shù)和定義的宏會(huì)在下文中一一解釋
問(wèn)題的關(guān)鍵在于:
1.如何給棋盤(pán)隨機(jī)埋入BoomNumber個(gè)雷
2.用戶選擇掃雷的坐標(biāo)后系統(tǒng)發(fā)現(xiàn)此處沒(méi)有雷如何統(tǒng)計(jì)出周?chē)椎膫€(gè)數(shù)并且讓用戶看到
考慮到只有在雷爆炸后用戶才需要知道系統(tǒng)埋雷的位置,其余時(shí)間不需要讓用戶看見(jiàn)埋雷的位置,為了方便我們需要設(shè)置兩個(gè)棋盤(pán),一個(gè)用來(lái)埋雷另外一個(gè)則展示給用戶,棋盤(pán)有橫有縱,所以我們考慮用 兩個(gè)類(lèi)型相同的二維數(shù)組埋雷的棋盤(pán)為MineBoard[Row][List]展示給用戶的則為ShowBoard[Row][List],考慮到內(nèi)存的問(wèn)題我們?cè)O(shè)置這兩個(gè)數(shù)組都為char類(lèi)型;
棋盤(pán)的問(wèn)題解決了,那么在用戶第一次選擇坐標(biāo)之前我們還需要1.埋雷;2.把ShowBoard數(shù)組展示出來(lái),因?yàn)樾枰S機(jī)埋下BoomNumber個(gè)雷所以我們使用隨機(jī)數(shù)的方法,讓系統(tǒng)隨機(jī)產(chǎn)生坐標(biāo)而且不能有重復(fù)的坐標(biāo),在生成的坐標(biāo)位置埋入Boom,其余位置則為nice(沒(méi)有雷),因?yàn)槁窭资巧贁?shù)操作我們先初始化MineBoard數(shù)組里的元素全為nice;
void SetMine(char MineBoard[][List], int row, int list){ for (int i = 0;i < row;i++) { for (int j = 0;j < list;j++) { MineBoard[i][j] =nice; } }//無(wú)雷為nice int num = 0; int _x; int _y; while (num < BoomNumber) { _x = 1 + rand()%(Row-2); _y = 1 + rand()%(Row-2); if (MineBoard[_x][_y] != Boom) { MineBoard[_x][_y] = Boom; num++; } }}
埋雷完成后則給用戶展示ShowBoard
void ShowBoards(char ShowBoard[][List], int row, int list){ printf(" "); for (int x = 1;x < list - 1;x++) { printf(" %2d ",x); } printf("/n"); for (int i = 1;i < row-1;i++) { printf(" %2d",i); for (int j = 1;j < list-1;j++) { printf(" %c |",ShowBoard[i][j]); } printf("/n"); printf(" "); for (int k = 0;k < row - 2;k++) { printf("----"); } printf("/n"); }}
此時(shí)用戶選擇要掃描的坐標(biāo)若該坐標(biāo)沒(méi)有雷則統(tǒng)計(jì)其周?chē)椎膫€(gè)數(shù),要是有雷則中雷游戲結(jié)束
考慮到用戶輸入的坐標(biāo)可能已經(jīng)被掃描或者用戶輸入的坐標(biāo)不在(1.1)~(Row-2,Row-2)這個(gè)范圍內(nèi)我們就要提醒用戶輸入的坐標(biāo)以及被掃描或者輸入的坐標(biāo)不合法,直到用戶為掃描的坐標(biāo)全為Boom為止
void Select(char ShowBoard[Row][List], char MineBoard[][List], int row, int list){ int step = 0; int x = 0; int y = 0; while (step < ((row - 2) * (list - 2) - BoomNumber)) { printf("請(qǐng)輸入你要排雷的坐標(biāo):(x,y)/n"); scanf("%d,%d", &x, &y); if (x > 0 && x < (List-1) && y>0 && y < (List-1)) { if (ShowBoard[x][y] == 42) { if (MineBoard[x][y] == nice) { CountBoom(ShowBoard, MineBoard, Row, List,x,y); system("cls"); ShowBoards(ShowBoard, Row, List); step++; if (step == ((row - 2) * (list - 2) - BoomNumber)) { printf("掃雷成功!/n"); Menu(); } } else if(MineBoard[x][y] == Boom) { system("cls"); printf("你已經(jīng)被炸死了!游戲結(jié)束/n"); ShowMineBoard(MineBoard, Row, List); } } else { printf("此處已經(jīng)被掃描,請(qǐng)輸入合法的坐標(biāo)/n"); } } else { printf("請(qǐng)輸入合法的坐標(biāo)/n"); } }}
統(tǒng)計(jì)用戶選擇的坐標(biāo)的周?chē)椎膫€(gè)數(shù)并讓這個(gè)數(shù)字展示在ShowBoard上,我用到了sprintf函數(shù)來(lái)把數(shù)字轉(zhuǎn)換成字符(因?yàn)槲覀兌xShowBoard數(shù)組為char類(lèi)型)統(tǒng)計(jì)雷的個(gè)數(shù)時(shí)因?yàn)镸ineBoard數(shù)組也是char類(lèi)型在把(x,y)周?chē)?個(gè)位置的雷的個(gè)數(shù)加起來(lái)時(shí)用到的是Boom的ascii碼值,又因?yàn)橛欣诪椤?’(ascii碼值為49)沒(méi)有雷為‘0’(ascii碼值為48)所以在運(yùn)算后需要減去8個(gè)‘0’的ASCII碼值,再返回去看定義這兩個(gè)棋盤(pán)時(shí)我們只需要10x10的棋盤(pán)卻定義了12x12的棋盤(pán)這是為了方便統(tǒng)計(jì)邊緣棋盤(pán)周?chē)椎膫€(gè)數(shù)
void CountBoom(char ShowBoard[Row][List],char MineBoard[][List], int row, int list, int x, int y){ int a = MineBoard[x][y + 1]/ + MineBoard[x + 1][y + 1] + MineBoard[x - 1][y + 1] / + MineBoard[x][y - 1] + MineBoard[x + 1][y - 1] / + MineBoard[x - 1][y - 1] + MineBoard[x - 1][y] / + MineBoard[x + 1][y] - 384; char arr[32];//設(shè)置一個(gè)較大的數(shù)組防止溢出 sprintf(arr, "%d", a);//把數(shù)字轉(zhuǎn)成字符 ShowBoard[x][y] = arr[0];}
至此掃雷游戲的主要邏輯已經(jīng)梳理完畢
#include"FindMine.h"void Menu(){ printf("*****1.開(kāi)始游戲*****/n"); printf("*****2.退出游戲*****/n"); printf("請(qǐng)選擇:/n"); int a = 0; scanf("%d", &a); system("cls"); if (a == 1) { Game(); } else if (a == 2) { exit(0); } else { printf("輸入有誤,請(qǐng)重新選擇/n"); Menu(); }}void Game(){ char ShowBoard[Row][List]; for (int i = 0;i < Row;i++) { for (int j = 0;j < List;j++) { ShowBoard[i][j] = "*"; } } char MineBoard[Row][List]; SetMine(MineBoard, Row, List); ShowBoards(ShowBoard, Row, List); Select(ShowBoard, MineBoard, Row, List);}int main(){ srand((unsigned int)time(NULL)); Menu(); return 0;}
這些為用戶可見(jiàn)的函數(shù)
#include"FindMine.h"void ShowBoards(char ShowBoard[][List], int row, int list){ printf(" "); for (int x = 1;x < list - 1;x++) { printf(" %2d ",x); } printf("/n"); for (int i = 1;i < row-1;i++) { printf(" %2d",i); for (int j = 1;j < list-1;j++) { printf(" %c |",ShowBoard[i][j]); } printf("/n"); printf(" "); for (int k = 0;k < row - 2;k++) { printf("----"); } printf("/n"); }}void ShowMineBoard(char MineBoard[][List], int row, int list){ for (int i = 1;i < row-1;i++) { for (int j = 1;j < list-1;j++) { printf("%c", MineBoard[i][j]); } printf("/n"); } Menu();}void CountBoom(char ShowBoard[Row][List],char MineBoard[][List], int row, int list, int x, int y){ int a = MineBoard[x][y + 1]/ + MineBoard[x + 1][y + 1] + MineBoard[x - 1][y + 1] / + MineBoard[x][y - 1] + MineBoard[x + 1][y - 1] / + MineBoard[x - 1][y - 1] + MineBoard[x - 1][y] / + MineBoard[x + 1][y] - 384; char arr[32];//設(shè)置一個(gè)較大的數(shù)組防止溢出 sprintf(arr, "%d", a);//把數(shù)字轉(zhuǎn)成字符 ShowBoard[x][y] = arr[0];}void Select(char ShowBoard[Row][List], char MineBoard[][List], int row, int list){ int step = 0; int x = 0; int y = 0; while (step < ((row - 2) * (list - 2) - BoomNumber)) { printf("請(qǐng)輸入你要排雷的坐標(biāo):(x,y)/n"); scanf("%d,%d", &x, &y); if (x > 0 && x < (List-1) && y>0 && y < (List-1)) { if (ShowBoard[x][y] == 42) { if (MineBoard[x][y] == nice) { CountBoom(ShowBoard, MineBoard, Row, List,x,y); system("cls"); ShowBoards(ShowBoard, Row, List); step++; if (step == ((row - 2) * (list - 2) - BoomNumber)) { printf("掃雷成功!/n"); Menu(); } } else if(MineBoard[x][y] == Boom) { system("cls"); printf("你已經(jīng)被炸死了!游戲結(jié)束/n"); ShowMineBoard(MineBoard, Row, List); } } else { printf("此處已經(jīng)被掃描,請(qǐng)輸入合法的坐標(biāo)/n"); } } else { printf("請(qǐng)輸入合法的坐標(biāo)/n"); } }}void SetMine(char MineBoard[][List], int row, int list){ for (int i = 0;i < row;i++) { for (int j = 0;j < list;j++) { MineBoard[i][j] =nice; } }//無(wú)雷為nice int num = 0; int _x; int _y; while (num < BoomNumber) { _x = 1 + rand()%(Row-2); _y = 1 + rand()%(Row-2); if (MineBoard[_x][_y] != Boom) { MineBoard[_x][_y] = Boom; num++; } }}
以上則為Game函數(shù)中需要調(diào)用的函數(shù)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/125656.html
摘要:每成功排一次雷,我們都要展示雷盤(pán)當(dāng)場(chǎng)上剩下的格子數(shù)等于雷數(shù)時(shí),游戲勝利,玩家踩雷時(shí),游戲結(jié)束,所以我們這是一個(gè)判斷輸贏的函數(shù)。 前言:寫(xiě)完三子棋后,慢慢地熟悉了這種...
摘要:上一期咱們用語(yǔ)言實(shí)現(xiàn)了三子棋的小游戲語(yǔ)言實(shí)現(xiàn)三子棋今天我們?cè)賮?lái)寫(xiě)個(gè)掃雷的游戲,說(shuō)起掃雷,相信大家都不陌生,可能許多朋友還是玩掃雷的高手。 ? ? ?上一期咱們用C語(yǔ)言實(shí)現(xiàn)了三子棋的小游戲? C語(yǔ)言實(shí)現(xiàn)三子棋? ? ? ?今天我們?cè)賮?lái)寫(xiě)個(gè)掃雷的游戲,說(shuō)起掃雷,相信大家都不陌生,可能許多朋友還是...
摘要:函數(shù)游戲菜單請(qǐng)選擇掃雷游戲退出游戲選擇錯(cuò)誤解析函數(shù)內(nèi)部利用時(shí)間戳,形成隨機(jī)數(shù),主要目的是實(shí)現(xiàn)游戲中地雷的隨機(jī)埋放。 前言 本篇文章使用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單小游戲---掃雷。(文章最后有完整代碼鏈接) 想必大多數(shù)人都玩過(guò)或者了解過(guò)掃雷的游戲規(guī)則,但是在這里,我們?cè)谝黄鹬販匾幌聮呃椎挠螒蛞?guī)則,也更好...
摘要:寫(xiě)在前面我們已經(jīng)寫(xiě)過(guò)了三子棋小游戲肯定沒(méi)玩過(guò)癮,我們?cè)賹?xiě)個(gè)掃雷小游戲吧目錄寫(xiě)在前面認(rèn)識(shí)游戲游戲規(guī)則游戲框架游戲?qū)崿F(xiàn)效果展示全部代碼文件文件文件認(rèn)識(shí)游戲相信大家對(duì)掃雷都不陌生每臺(tái)電腦必備的小游戲游戲規(guī)則就是在規(guī)定的時(shí)間將 ...
閱讀 3800·2023-01-11 11:02
閱讀 4306·2023-01-11 11:02
閱讀 3128·2023-01-11 11:02
閱讀 5237·2023-01-11 11:02
閱讀 4801·2023-01-11 11:02
閱讀 5574·2023-01-11 11:02
閱讀 5379·2023-01-11 11:02
閱讀 4080·2023-01-11 11:02