您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么使用C語言代碼實現掃雷小游戲”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么使用C語言代碼實現掃雷小游戲”吧!
掃雷小游戲主要是利用字符數組、循環語句和函數實現。
設計思路:雷盤大小為9*9,但是為了后續能更好的統計出雷的個數在定義數組的時候定義大小為11*11,先定義兩個字符數組,一個用來記錄雷的位置,另一個用來展現給玩家,初始化雷盤,將兩個字符數組分別全部賦值為字符0和字符*,打印棋盤,隨機設置雷所在位置,根據玩家輸入的坐標排查上下左右8個格子中的雷,并判斷輸入坐標處是否有雷。
玩法:玩家選擇開始游戲之后,輸入坐標,如果坐標處有雷,輸入坐標處標記為$,并打印出來游戲結束重新選擇;如果坐標處沒有雷,統計出附近8個格子中雷的個數并在輸入坐標處展現出來;如果輸入坐標已經被排查過了,則提示已排查過。
為了更好的演示,將雷的個數設置為79個,同時將顯示出雷的位置的雷盤也展現出來。
具體效果如下:
#include <stdio.h> #include <time.h> #include <stdlib.h> #define ROW 9//展現出來的行 #define COL 9//展現出來的列 #define ROWS ROW+2//全部的行 #define COLS COL+2//全部的列 #define MINE 79//雷的個數 void Init_board(char board[ROWS][COLS], int rows, int cols, char set) { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = set; } } } //打印雷盤 void Print_board(char board[ROWS][COLS], int row, int col) { int i = 0; int j = 0; for (j = 0; j <= col; j++) { printf("%d ", j);//打印出來列號 } printf("\n"); for (i = 1; i <= row; i++) { printf("%d ",i);//打印出來行號 for (j = 1; j <= row; j++) { printf("%c ", board[i][j]); } printf("\n"); } } void Set_mine(char mine[ROWS][COLS], int row, int col) { int count = MINE; while (count) { int x = rand() % row + 1; int y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } int Get_mine(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'); } void Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int win = 0;//走了多少步 while(win<row*col-MINE) { printf("請輸入坐標>:"); scanf("%d%d",&x,&y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (show[x][y] == '*') { if (mine[x][y] == '1') { printf("你被炸死了,通關失敗!\n"); show[x][y] = '$';//炸死時用符號$代表所輸入的坐標 Print_board(show, row, col); break; } else { int count = Get_mine(mine, x, y) + '0'; show[x][y] = count; Print_board(show, row, col); win++; } } else { printf("輸入的坐標已被排查過,請重新輸入!\n"); } } else { printf("輸入的坐標非法,請重新輸入!\n"); } } if (win == row * col - MINE) { printf("恭喜你,成功通關!\n"); Print_board(show, row, col); } } void game() { //定義兩個數組,mine用來記錄雷的位置,show展現給玩家 char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; //初始化雷盤 //全部初始化為字符0和字符* Init_board(mine, ROWS, COLS,'0'); Init_board(show, ROWS, COLS, '*'); //打印雷盤 //Print_board(mine, ROW, COL); Print_board(show, ROW, COL); //布置雷 Set_mine(mine, ROW, COL); Print_board(mine, ROW, COL); //排雷 Find_mine(mine, show, ROW, COL); } void menu() { printf("************************\n"); printf("**** 1.開始游戲 ****\n"); printf("**** 0.結束游戲 ****\n"); printf("************************\n"); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("請選擇>:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("游戲結束!\n"); break; default: printf("選擇錯誤,請重新選擇!\n"); break; } } while (input); }
//初始化雷盤 void Init_board(char board[ROWS][COLS], int rows, int cols, char set) { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = set; } } }
char set是用來接收傳過來的字符。
//打印雷盤 void Print_board(char board[ROWS][COLS], int row, int col) { int i = 0; int j = 0; for (j = 0; j <= col; j++) { printf("%d ", j);//打印出來列號 } printf("\n"); for (i = 1; i <= row; i++) { printf("%d ", i);//打印出來行號 for (j = 1; j <= row; j++) { printf("%c ", board[i][j]); } printf("\n"); } }
打印雷盤時將其所在的序列號也打印了出來。
void Set_mine(char mine[ROWS][COLS], int row, int col) { int count = MINE; while (count) { int x = rand() % row + 1; int y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } }
通過用rand函數和srand函數生成隨機坐標布置雷的位置,一共布置count個雷。
int Get_mine(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'); } void Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int win = 0;//走了多少步 while (win < row * col - MINE) { printf("請輸入坐標>:"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (show[x][y] == '*') { if (mine[x][y] == '1') { printf("你被炸死了,通關失敗!\n"); show[x][y] = '$';//炸死時用符號$代表所輸入的坐標 Print_board(show, row, col); break; } else { int count = Get_mine(mine, x, y) + '0'; show[x][y] = count; Print_board(show, row, col); win++; } } else { printf("輸入的坐標已被排查過,請重新輸入!\n"); } } else { printf("輸入的坐標非法,請重新輸入!\n"); } } if (win == row * col - MINE) { printf("恭喜你,成功通關!\n"); Print_board(show, row, col); } }
Get_mine函數用來計算輸入坐標附近的雷的個數,通過附近字符1相加之后減去8個字符0計算出來,減去字符0是因為字符1和字符0的ASCII碼值相差1,利用這個規則將字符轉化為數字。Find_mine函數通過輸入的坐標,判斷坐標處是否為雷或展現出附近雷的個數亦或者結束游戲。
void game() { //定義兩個數組,mine用來記錄雷的位置,show展現給玩家 char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; //初始化雷盤 //全部初始化為字符0和字符* Init_board(mine, ROWS, COLS, '0'); Init_board(show, ROWS, COLS, '*'); //打印雷盤 //Print_board(mine, ROW, COL); Print_board(show, ROW, COL); //布置雷 Set_mine(mine, ROW, COL); Print_board(mine, ROW, COL); //排雷 Find_mine(mine, show, ROW, COL); }
void menu() { printf("************************\n"); printf("**** 1.開始游戲 ****\n"); printf("**** 0.結束游戲 ****\n"); printf("************************\n"); }
#include <stdio.h> #include <time.h> #include <stdlib.h> #define ROW 9//展現出來的行 #define COL 9//展現出來的列 #define ROWS ROW+2//全部的行 #define COLS COL+2//全部的列 #define MINE 79//雷的個數 int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("請選擇>:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("游戲結束!\n"); break; default: printf("選擇錯誤,請重新選擇!\n"); break; } } while (input); }
到此,相信大家對“怎么使用C語言代碼實現掃雷小游戲”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。