摘要:設(shè)計(jì)實(shí)現(xiàn)掃雷游戲大致思路創(chuàng)建文件想法實(shí)現(xiàn)設(shè)計(jì)一個(gè)函數(shù),實(shí)現(xiàn)建議菜單循環(huán)和分支選擇游戲選項(xiàng)創(chuàng)造一個(gè)掃雷版面版面的大小最后是要可控的如何存放雷和版面的信息呢考慮排查雷時(shí)候的思路,我們要判斷該位置周圍個(gè)格子里面是否有雷初始化
掃雷游戲是我們能實(shí)現(xiàn)的較簡(jiǎn)單的游戲之一,在考慮不使用圖形界面的前提下,我們嘗試僅使用數(shù)組來(lái)實(shí)現(xiàn)掃雷游戲的基礎(chǔ)功能
想要制作一個(gè)掃雷游戲我們先得熟悉掃雷游戲的規(guī)則,我們可以先試試幾把掃雷感受掃雷游戲所要實(shí)現(xiàn)的功能
還是老樣子先創(chuàng)建3個(gè)文件
文件名 | 功能作用 |
---|---|
game.c | 掃雷所需函數(shù)實(shí)現(xiàn) |
game.h | 聲明用頭文件,實(shí)現(xiàn)每個(gè)函數(shù)的聲明,用來(lái)引用 |
test.c | 測(cè)試運(yùn)行文件,主函數(shù)在這里 |
void menu(){ printf("******************/n"); printf("*** 1.play ***/n"); printf("*** 0.exit ***/n"); printf("******************/n");}
do while
循環(huán)和switch
分支選擇游戲選項(xiàng) int input = 0; do { menu(); printf("請(qǐng)選擇:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出/n"); default:printf("選擇錯(cuò)誤,重新選擇"); break; } } while (input);//1為真0為假非0都為真
利用二維數(shù)組
char
類型二維數(shù)組,一個(gè)放置布置好雷的信息,還有一個(gè)放置排查出的信息解決方法就是創(chuàng)建一個(gè)更大一個(gè)維度(9*9->11*11
)的數(shù)組,為了嚴(yán)格對(duì)應(yīng),所以最好創(chuàng)建兩個(gè)一樣大的數(shù)組
game.h
宏定義行與列數(shù)
#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2
test.c
初始化雷的信息存儲(chǔ)
//雷的信息存儲(chǔ) char mine[ROWS][COLS] = { 0 };//布置好雷的信息 char show[ROWS][COLS] = { 0 };//排查好雷的信息 printf("掃雷/n");//通過(guò)初始化函數(shù)實(shí)現(xiàn)初始化 InitBoard(mine, ROWS, COLS, "0");//初始化mine數(shù)組為全"0" InitBoard(show, ROWS, COLS, "*");//初始化show數(shù)組為全"*"
InitBoard
game.h
初始化雷盤(pán)
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
game.c
實(shí)現(xiàn)InitBoard
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set){ int i = 0, j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = set; //set巧妙讓既可以顯示*又可以0 } }}
DisplayBoard
game.h
void DisplayBoard(char board[ROWS][COLS], int row, int col);
game.c
void DisplayBoard(char board[ROWS][COLS], int row, int col){ int i = 0, j = 0; for (i = 0; i <= col; i++)//打印列號(hào) { printf("%d ", i); } printf("/n"); for (i = 1; i <= row; i++)//因?yàn)閭髁薘OWS少兩個(gè) { printf("%d ", i);//行號(hào) for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("/n"); }}
game.h
#define EASY_COUNT 10void SetMine(char board[ROWS][COLS], int row, int col);//row和col是要打印或者改變的元素?cái)?shù)要操作的是9
test.c
播撒隨機(jī)種子不用放到函數(shù)里面,只要放到主函數(shù)里面然后,播撒一次,每次循環(huán)游戲就可以實(shí)現(xiàn)隨機(jī)數(shù)
srand((unsigned int)time(NULL));
game.c
雷要隨機(jī)布置,所以要用rand
和srand
,是雷的話就在信息數(shù)組里面對(duì)應(yīng)的格子放上1,此外放0
void SetMine(char board[ROWS][COLS], int row, int col){ int count = EASY_COUNT;//布置雷的數(shù)字,本質(zhì)是一個(gè)難度分級(jí)的選擇,也用宏定義 while (count) { int x = rand()% row+1;//1-9 int y = rand() % col + 1;//1-9 mod9=>0-8 need add 1 if (board[x][y] == "0") { board[x][y] = "1"; count--;//直到0退出 } }}
game.h
void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c
在正常的while
循環(huán)之下分情況用if
實(shí)現(xiàn)分支
void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){ int x = 0, y = 0; int win = 0; //9 * 9情況下 if (x >= 1 && x <= row&&y >= 1 && y <= col) { //坐標(biāo)合法前提下 //1.踩雷2.不是雷 if (mine[x][y] == "1")//1.踩雷 { printf("很遺憾,你被炸死了/n"); DisplayBoard(mine, row, col);//死了之后調(diào)一下給打印出來(lái)看一看 break; } else//2.不是雷 { //計(jì)算周圍有幾個(gè)雷 int count = get_mine_count(mine,x,y); show[x][y] = count + "0"; DisplayBoard(show, row, col); win++; } } else { printf("輸入坐標(biāo)非法,無(wú)法排雷,請(qǐng)重新輸入!/n"); } }}
game.c
//思考準(zhǔn)備把周圍數(shù)字加起來(lái)看有幾個(gè)雷//注意每個(gè)存的字符都是字符而ASCII"1" - "0"正好是數(shù)字1int get_mine_count(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";}
這就是我們要用0和1來(lái)表示雷的原因,同時(shí)也能實(shí)現(xiàn)告訴你周圍有幾個(gè)雷,這樣就比較巧妙
這時(shí)候我們發(fā)現(xiàn)雖然可以正常排雷,但是我們不可以做到勝利的判斷,所以我們要在排查雷前面加一個(gè)循環(huán),就像這樣
while (win < row * col - EASY_COUNT) { printf("請(qǐng)輸入排查雷的坐標(biāo)/n"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { //坐標(biāo)合法 //1.踩雷2.不是雷 if (mine[x][y] == "1") { printf("很遺憾,你被炸死了/n"); DisplayBoard(mine, row, col); break; } else//不是雷 { //計(jì)算周圍有幾個(gè)雷 int count = get_mine_count(mine, x, y); show[x][y] = count + "0"; DisplayBoard(show, row, col); win++; } } else { printf("坐標(biāo)非法請(qǐng)重新輸入!/n"); } } if (win == row * col - EASY_COUNT) { printf("恭喜你,排雷成功/n"); DisplayBoard(mine, row, col); }}
最后修改一下主函數(shù)就可以了
game.h
#define _CRT_SECURE_NO_WARNINGS 1#include #define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define EASY_COUNT 10void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);void DisplayBoard(char board[ROWS][COLS], int row, int col);void SetMine(char board[ROWS][COLS], int row, int col);//row和col是要打印或者改變的元素?cái)?shù)要操作的是9void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void InitBoard(char board[ROWS][COLS], int rows, int cols, char set){ int i = 0, j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = set;//set 巧妙讓既可以顯示*又可以0 } }}void DisplayBoard(char board[ROWS][COLS], int row, int col){ int i = 0, j = 0; for (i = 0; i <= col; i++)//打印列號(hào) { printf("%d ", i); } printf("/n"); for (i = 1; i <= row; i++)//因?yàn)閭髁薘OWS少兩個(gè) { printf("%d ", i);//行號(hào) for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("/n"); }}void SetMine(char board[ROWS][COLS], int row, int col){ int count = EASY_COUNT; while (count) { int x = rand() % row + 1;//1-9 int y = rand() % col + 1;//1-9 mod9=>0-8 need add 1 if (board[x][y] == "0") { board[x][y] = "1"; count--;//直到0退出 } }}void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){ int x = 0, y = 0; int win = 0; //9 * 9 while (win < row * col - EASY_COUNT) { printf("請(qǐng)輸入排查雷的坐標(biāo)/n"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { //坐標(biāo)合法 //1.踩雷2.不是雷 if (mine[x][y] == "1") { printf("很遺憾,你被炸死了/n"); DisplayBoard(mine, row, col); break; } else//不是雷 { //計(jì)算周圍有幾個(gè)雷 int count = get_mine_count(mine, x, y); show[x][y] = count + "0"; DisplayBoard(show, row, col); win++; } } else { printf("坐標(biāo)非法請(qǐng)重新輸入!/n"); } } if (win == row * col - EASY_COUNT) { printf("恭喜你,排雷成功/n"); DisplayBoard(mine, row, col); }}//思考準(zhǔn)備把周圍數(shù)字加起來(lái)看有幾個(gè)雷//注意每個(gè)存的字符都是字符而ASCII"1" - "0"正好是數(shù)字1int get_mine_count(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";}
test.c
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu(){ printf("******************/n"); printf(
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/123069.html
摘要:寫(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í)間將 ...
摘要:函數(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ī)則,也更好...
摘要:目錄前言前言前期的準(zhǔn)備前期的準(zhǔn)備游戲代碼的具體實(shí)現(xiàn)游戲代碼的具體實(shí)現(xiàn)完整版的掃雷小游戲代碼完整版的掃雷小游戲代碼總結(jié)總結(jié)前言掃雷是一款大眾類的益智小游戲,于年發(fā)行。 目錄 前言 前期的準(zhǔn)備 游戲代碼的具體實(shí)現(xiàn) 1、text.c 2、game.h 3、game.c 完整版的掃雷小游戲代碼: 1...
摘要:玩家選擇開(kāi)始游戲后,出現(xiàn)雷盤(pán),并且隨機(jī)布置雷。雷盤(pán)的數(shù)組大小為,方便計(jì)算掃雷時(shí)周圍雷的數(shù)量,并防止數(shù)組越界。放置布置的雷的信息放置排查出雷的信息初始化雷盤(pán)初始化展示界面打印展示界面效果如下布置雷隨機(jī)在數(shù)組中讓十個(gè)變成作為雷。 目錄 前言 一、游戲思路 二、游戲框架 1.菜單界面 1.菜單:...
摘要:上一篇講了三子棋,今天我們來(lái)講掃雷原理都是一樣的通常我們寫(xiě)代碼的時(shí)候,寫(xiě)之前都要整理分析好邏輯,要做到分段分塊來(lái)寫(xiě),以便于代碼閱讀和后期維護(hù)這里我將代碼分為三個(gè)文件頭文件通常用來(lái)完成函數(shù)聲明頭文件的引用宏定義變量用于游戲功能函數(shù)的實(shí)現(xiàn)作為 上一篇講了三子棋,今天我們來(lái)講掃雷原理都是一樣的; ...
閱讀 2979·2021-11-11 16:55
閱讀 1007·2021-09-28 09:36
閱讀 3868·2021-09-22 15:22
閱讀 2310·2021-09-06 15:12
閱讀 1836·2021-08-19 10:55
閱讀 2936·2019-08-30 12:52
閱讀 563·2019-08-29 14:03
閱讀 1277·2019-08-29 12:27