制作簡易掃雷程序分析
筆記:掃雷筆記
工程:簡易掃雷
文章目錄
- 制作簡易掃雷程序分析
- 一、檔案構成
- 1. test.c
- 2. game.c
- 3. game.h
- 二、實作步驟分析
- 1. 游戲選單
- 2. 準備棋盤
- 3. 列印掃雷棋盤
- 4. 玩家查雷,判斷是否踩雷
- 三、test.c檔案
本篇具體談論思路和程序
一、檔案構成
1. test.c
用來設計游戲主功能的基本框架,包含選單,游戲棋盤,玩家操作,電腦操作
不包含具體如何實作此功能
2. game.c
用于游戲功能的實作,框架中功能是如何具體實作,基本為函式
3. game.h
包含實作 game.h 和 test.c 中陳述句所需要參考的庫函式或者自定義函式
二、實作步驟分析
1. 游戲選單
剛進入游戲界面,需要選擇是開始游戲還是退出游戲,想要游戲可以反復游玩,它必須是個回圈,選擇環節我們使用switch陳述句進行選擇,while回圈退出的判斷為玩家選擇
代碼:
void menu() { printf("********** 1:開始游戲 *********"); printf("********** 0:退出游戲 *********"); printf("請輸入您的選擇:"); } void game() { } int main() { int input = 0; do { menu();//列印選單 scanf("%d\n", &input);//玩家選擇 switch (input) { case 1: game();//進入游戲 case 0: break;//退出游戲 default: printf("請輸入正確數字!\n"); //輸入其他字符 break; } } while (input == 0); return 0; }
2. 準備棋盤
以 9x9 格式的棋盤為例,我們需要放置9個雷,位置隨機
考慮因素:
因為需要計算周圍有多少個雷,以防陣列越界,四條邊都必須+1,所以棋盤的大小是11x11的二維陣列
將有多少雷的數字替換后,下一次如果要計算旁邊的位置周圍有多少個雷時候,會有上次計算周圍雷個數數字,所以是否有雷的棋盤和計算周圍有多少雷的棋盤不能在同一個棋盤
先準備兩個只有單一符號的棋盤,這樣兩個棋盤都可以用該函式
代碼:
void prepare_pan(char pan[ROWS][COLS], int row, int col, char set)//初始化棋盤 { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { pan[i][j] = set;//先全部設定成單一符號,后面再設定雷 } } }
然后我們需要再設定雷
代碼:
void set_boom(char pan[ROWS][COLS], int row, int col) { int i = 0; for (i = 0; i < BOOM; i++) { int x = rand() % row + 1; int y = rand() % col + 1;//設定亂數1-9 if (pan[x][y] != '1') { pan[x][y] = '1';//雷設定為字符1 } else { continue; } } }
3. 列印掃雷棋盤
考慮到我們需要的棋盤是以符號形式列印的,所以需要以一個二維陣列的形式存盤棋盤,
又因為給玩家看的棋盤是玩家選擇位置之后,在該位置顯示周圍有多少個雷,四條邊都必須+1,所以棋盤的大小是11x11的二維陣列
棋盤可以將邊緣設定為1 2 3……方便玩家選擇位置
void print_pan(char pan[ROWS][COLS], int row, int col) //列印棋盤 { int i = 0; int j = 0; for (i = 0; i <= row; i++) { if (i == 0)//第一行 { for (j = 0; j <= col; j++) { printf("%d ", j); } } else { for (j = 0; j <= col; j++) { if (j == 0)//第一列 { printf("%d ", i); } else { printf("%c ", pan[i][j]); } } } printf("\n"); } }
4. 玩家查雷,判斷是否踩雷
以玩家輸入的坐標,四周計算雷的個數
先判斷該位置是否是雷,如果是雷則玩家輸了
如果不是雷,則進行計數,該計數應以字符的形式列印,數字字符減去字符零等于該數字,以這個為原理計算
統計玩家查看位置次數,查看次數加上雷的個數等于可以選擇的個數
void win(char local[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int count = 0; while (1) { printf("請輸入您需要查看的坐標:"); scanf("%d%d", &x, &y); if (x >= 1 && x <= 9 && y >= 1 && y <= 9)//判斷坐標合法 { if (local[x][y] == '1') { print_pan(show, ROW, COL); printf("很遺憾,你踩到雷了,游戲結束!\n"); printf("-----------------------------------\n"); break; } else { char ret = judge(local, x, y);//該坐標周圍幾個雷 show[x][y] = ret + '0'; print_pan(show, ROW, COL);//展示給玩家看該位置周圍有幾個雷 printf("-----------------------------------\n"); count++;//計算數字,把不是雷的地方都走完了才算勝利 } } else { printf("坐標不存在,請輸入正確坐標!\n"); } if (count == (row * col - BOOM)) { printf("恭喜你勝利了!"); break; } } }
三、test.c檔案
用來完成整個程式的測驗
#define _CRT_SECURE_NO_WARNINGS #include "game.h" void menu() { printf("********** 1:開始游戲 *********\n"); printf("********** 0:退出游戲 *********\n"); printf("請輸入您的選擇:"); } void game() { char local[ROWS][COLS] = { 0 };//放雷棋盤的陣列 char show[ROWS][COLS] = { 0 };//展示給玩家的陣列 prepare_pan(show, ROWS, COLS, '*'); prepare_pan(local, ROWS, COLS, '0');//單一符號的棋盤 set_boom(local, ROW, COL);//設定炸彈 print_pan(show, ROW, COL);//展示給玩家看的初始棋盤 printf("--------------------------------\n"); win(local, show, ROW, COL);//判斷輸贏 } int main() { int input = 0; do { menu();//列印選單 srand((unsigned)time(NULL));//亂數生成,后面用 scanf("%d", &input);//玩家選擇 switch (input) { case 1: game(); break;//進入游戲 case 0: break;//退出游戲 default: printf("請輸入正確數字!\n"); //輸入其他字符 break; } } while (input != 0); return 0; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/339697.html
標籤:其他
上一篇:2021大學生筆記本電腦購買指南
下一篇:Unity 獲取Unix時間戳
