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