c语言扫雷游戏代码_C语言游戏详解---扫雷游戏
掃雷游戲大家應該都不陌生,一個掃雷游戲要滿足的基本要求是:
1. 第一次掃的位置不能是雷
2. 每展開一個位置要顯示該位置周圍雷的個數
3. 若該位置周圍沒雷,要把周圍展開
該游戲的界面是10X10的,有10個雷,大家可根據自己的需求參考去改
該游戲的大體思路是:
1. 首先你肯定想到要設置一個數組放雷,有雷為1,無雷為0,玩家每點開一個位置然后根據坐標判斷改位置周圍雷的個數,然后你要怎樣把你點的這個位置雷的個數顯示出來呢?
是在放雷的那個數組里顯示嗎?當然不是啦,放雷的那個數組每個格都是可見的,肯定不能給玩家看,再說那樣會改變放雷數組里的變量(你算出該位置周圍的雷的個數肯定要賦值給該位置,而雷數組里只能是1或0。
所以我們要再設置一個數組給玩家顯示該位置周圍雷的個數。
如下所示:
char Mine[ROW+2][COL+2] = { 0 };//放雷數組char Board[ROW+2][COL+2] = { 0 };//玩家顯示數組//數組的大小為啥要加2?我這個游戲是10X10的界面,也就是ROW和COL都是10,那為什么我在設置數組大小時要設成12X12的呢?
因為我們每點開一個位置要計算它周圍雷的個數,除了 第一行 和 最后一行 還有 第一列 和 最后一列 這四種情況外,其它位置周圍都有8個格,難道我們每輸入一個位置都要判斷它是在中間還是在那四種情況中的哪一種?不不不,這樣太麻煩了。
我們把數組設置成12X12的,讓它周圍那一圈雷的個數都是0,這樣不管計算中間位置還是邊上的位置它周圍雷的個數都可以使用同一個算法計算(把周圍8個位置加起來)
如圖所示,只用在紅色區域內布雷,顯示的時候不顯示最邊上的那兩列兩行。所以橫、縱坐標的范圍都是是1至10,這樣也符合人的正常習慣(因為數組是從橫、縱坐標都是0開始的)
2. 然后把數組初始化后,就要放雷了,我這只放了10個雷,利用隨機數產生雷的位置
//rang()%10產生的隨機數是0至9,加1后是1至10 i = rand() % 10 + 1; j = rand() % 10 + 1;3. 把雷設好了,該考慮玩家怎樣掃雷了,玩家第一次掃不能被炸死,所以第一次掃的位置如果是雷,就要把這個雷移到一個沒有雷的位置上
if (count == 1){ if (Mine[x][y] == '1'){Mine[x][y] = '0';while (1){if (Mine[rand() % 10 + 1][rand() % 10 + 1] == '0'){Mine[rand() % 10 + 1][rand() % 10 + 1] = '1';printf("更新后的雷盤的界面n");Display(Mine, ROW + 2, COL + 2);break;}}}4. 如果該玩家點的該位置周圍沒雷就要展開周圍一片,所以要判斷該位置周圍雷的個數是否等于0,若等于0則調用展開周圍的一片的函數
如果你對編程感興趣或者想往編程方向發展,可以關注微信公眾號【筑夢編程】,大家一起交流討論!小編也會每天定時更新既有趣又有用的編程知識!
5. 最后就是如何判斷玩家如何贏呢?
因為玩家不能點有雷的位置,所以玩家界面有雷的位置是“*”,所以只要判斷改界面有10個“*”,那玩家就贏了
以上就是設計該游戲的大體思路
該游戲要用到以下函數:saolei.h
#ifndef __SAOLEI_H__ //防止頭文件被重復引用后,當預處理是在主函數里頭文件被多次替換而耗時,當使用這條語句后,可避免頭文件的重復引用#define __SAOLEI_H__#define ROW 10#define COL 10//菜單void menu();//游戲void game();//雷的初始化void Init_Mine(char Mine[ROW+2][COL+2], int row, int col);//雷盤的初始化void Init_Board(char Board[ROW+2][COL+2], int row, int col);//設置雷void Set_Mine(char Mine[ROW+2][COL+2], int row, int col);//計算每個空周圍雷的個數int Calcu_Mine(char Mine[ROW+2][COL+2], int x, int y);//展示雷盤void Display(char board[ROW+2][COL+2], int row, int col);//玩家掃雷int Player(char Mine[ROW+2][COL+2], char Board[ROW+2][COL+2], int row, int col,int count);//判斷是否贏int Is_Win(char Board[ROW+2][COL+2], int row, int col);//當前格和周圍的幾個格是不是0,若是則展開void If_Blank(char Mine[ROW + 2][COL + 2], char Board[ROW + 2][COL + 2], int x, int y);#endif//__SAOLEI_H__以下是這些函數的實現:saolei.c
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include"saolei.h"void menu(){printf("****************n");printf("*****1.play*****n");printf("*****0.exit*****n");printf("****************n");}//雷盤的初始化void Init_Mine(char Mine[ROW+2][COL+2], int row, int col){int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){Mine[i][j] = '0';}}}//玩家界面的初始化void Init_Board(char Board[ROW+2][COL+2], int row, int col){int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){Board[i][j] = '*';}}}//放雷void Set_Mine(char Mine[ROW+2][COL+2], int row, int col){int i = 0;int j = 0;int count = 10;//通過循環放10個雷while (count--){i = rand() % 10 + 1;//rang()%10產生的隨機數是0至9,加1后是1至10j = rand() % 10 + 1;if (Mine[i][j] = '0')//隨機產生的這個位置如果沒雷,就把這個位置放上雷{Mine[i][j] = '1';}//如果這個位置有雷,這個位置就不能放了,要換個位置放//因為要產生10個雷,是通過count來計數的,因為剛剛count減了1,但又沒放雷//所以此時要給count加1else{count++;}}}//計算該位置周圍有多少雷//整形數字與字符數字的ASC碼差了48,0是0,‘0’是48//所以一個字符數字轉換成整形數字,用該字符減去48或者‘0’int Calcu_Mine(char Mine[ROW+2][COL+2], int x, int y){return (Mine[x - 1][y - 1] - '0' + Mine[x - 1][y] - '0'+ Mine[x - 1][y + 1] - '0' + Mine[x][y - 1] - '0'+ Mine[x][y + 1] - '0' + Mine[x + 1][y - 1]- '0'+ Mine[x + 1][y] - '0'+ Mine[x + 1][y + 1]- '0');}//該位置周圍展開void If_Blank(char Mine[ROW + 2][COL + 2], char Board[ROW + 2][COL + 2], int x, int y){Board[x - 1][y - 1] = Calcu_Mine(Mine, x - 1, y - 1) + '0';Board[x - 1][y] = Calcu_Mine(Mine, x - 1, y) + '0';Board[x - 1][y + 1] = Calcu_Mine(Mine, x - 1, y + 1) + '0';Board[x][y - 1] = Calcu_Mine(Mine, x, y - 1) + '0';Board[x][y + 1] = Calcu_Mine(Mine, x, y + 1) + '0';Board[x + 1][y - 1] = Calcu_Mine(Mine, x + 1, y - 1) + '0';Board[x + 1][y] = Calcu_Mine(Mine, x + 1, y) + '0';Board[x + 1][y + 1] = Calcu_Mine(Mine, x + 1, y + 1) + '0';}//玩家下棋int Player(char Mine[ROW+2][COL+2], char Board[ROW+2][COL+2], int row, int col,int count){ int x = 0;int y = 0;printf("請輸入坐標 > n");while (1){scanf("%d %d", &x, &y);if (x < 1 || x >= row || y < 1 || y >= col){printf("坐標輸入錯誤,請重新輸入>n");}else{//第一次不被炸死,如果是雷,把位置換到沒雷的地方了if (count == 1){if (Mine[x][y] == '1'){Mine[x][y] = '0';while (1){if (Mine[rand() % 10 + 1][rand() % 10 + 1] == '0'){Mine[rand() % 10 + 1][rand() % 10 + 1] = '1';printf("更新后的雷盤的界面n");Display(Mine, ROW + 2, COL + 2);break;}}}}if (Board[x][y] != '*'){printf("此處已經被掃過,請重新輸入位置>n");}elsebreak;}}if (Mine[x ][y] == '1'){Board[x][y] = '1';Display(Board, ROW + 2, COL + 2);printf("哈哈哈哈,你踩到雷了,GAME OVER!!!n");return 0;}else{Board[x][y] = Calcu_Mine(Mine, x, y) + '0';if (Calcu_Mine(Mine, x, y) == 0){If_Blank(Mine, Board, x, y);}return 1;}}void Display(char board[ROW+2][COL+2],int row, int col){int i = 0;int j = 0;printf(" 1 2 3 4 5 6 7 8 9 10n");printf("---------------------- n");for (i = 1; i < row-1; i++){printf("%-2d", i);printf("|");for (j = 1; j < col-1; j++){printf("%c", board[i][j]);printf(" ");}printf("n");}printf("---------------------- n");}//當最后玩家界面剩10個*時,玩家勝int Is_Win(char Board[ROW+2][COL+2], int row, int col){int i = 0;int j = 0;int count = 0;for (i = 0; i < row; i++){for (j = 0; j < col;j++)if (Board[i][j] == '*'){count++;}}if (count == 10){printf("你真棒,雷被你掃完啦!n");return 1;}return 0;}void game(){char Mine[ROW+2][COL+2] = { 0 };char Board[ROW+2][COL+2] = { 0 };Init_Mine(Mine, ROW+2, COL+2);Set_Mine(Mine, ROW+2, COL+2);Display(Mine, ROW+2, COL+2);Init_Board(Board, ROW+2, COL+2);Display(Board, ROW+2, COL+2);int ret = 0;int count = 1;while (1){ret=Player(Mine,Board, ROW+2, COL+2,count++);Display(Board, ROW+2, COL+2);if (ret == 0){break;}if (Is_Win(Board, ROW + 2, COL + 2) == 1){Display(Mine, ROW + 2, COL + 2);break;}}}主函數:main.c
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<time.h>#include<stdlib.h>#include"saolei.h"int main(){int input;srand((unsigned int)time(NULL));do{menu();scanf("%d", &input);switch (input){case 1:game();case 0:printf("退出游戲!n");break;default:printf("輸入錯誤,請重新輸入");break;}} while (input);return 0;}總結
以上是生活随笔為你收集整理的c语言扫雷游戏代码_C语言游戏详解---扫雷游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bootstraptable合并标题_B
- 下一篇: mysql5.7.14操作命令_Mysq