摘要:相信大家都玩過掃雷游戲,在學習了二維數組之后,我也用語言寫了一個簡單的掃雷游戲規則如下通過對宏和宏來設置游戲的棋盤大小如果想玩的掃雷則需設置和為通過對宏來設置局中雷的個數雷的個數需要對用戶輸入要掃描的坐標,如果有雷則雷爆炸游戲結束,如
相信大家都玩過掃雷游戲,在學習了二維數組之后,我也用c語言寫了一個簡單的掃雷游戲規則如下:
1.通過對宏Row和宏List來設置游戲的棋盤大?。ㄈ绻胪?0x10的掃雷則需設置Row和List為12);
2.通過對 宏BoomNumber 來設置局中雷的個數(雷的個數需要<=(Row-2)*(List-2));
3.對 用戶輸入要掃描的坐標,如果有雷則雷爆炸游戲結束,如果沒有雷則統計出該坐標周圍的雷的個數,一直循環此操作,直到棋盤中未掃描的地方全是雷為止則掃雷成功。
#pragma warning (disable:4996)#pragma once#include#include#include#define Row 12#define List 12#define BoomNumber 20#define Boom "1"http://1為有雷#define nice "0"extern void Game();extern void SetMine(char MineBoard, int row, int list);extern void Select(char MineBoard, int row, int list);extern void Menu();extern void CountBoom(char MineBoard[][List], int row, int list, int x, int y);
這便是掃雷游戲的頭文件,里面聲明的函數和定義的宏會在下文中一一解釋
問題的關鍵在于:
1.如何給棋盤隨機埋入BoomNumber個雷
2.用戶選擇掃雷的坐標后系統發現此處沒有雷如何統計出周圍雷的個數并且讓用戶看到
考慮到只有在雷爆炸后用戶才需要知道系統埋雷的位置,其余時間不需要讓用戶看見埋雷的位置,為了方便我們需要設置兩個棋盤,一個用來埋雷另外一個則展示給用戶,棋盤有橫有縱,所以我們考慮用 兩個類型相同的二維數組埋雷的棋盤為MineBoard[Row][List]展示給用戶的則為ShowBoard[Row][List],考慮到內存的問題我們設置這兩個數組都為char類型;
棋盤的問題解決了,那么在用戶第一次選擇坐標之前我們還需要1.埋雷;2.把ShowBoard數組展示出來,因為需要隨機埋下BoomNumber個雷所以我們使用隨機數的方法,讓系統隨機產生坐標而且不能有重復的坐標,在生成的坐標位置埋入Boom,其余位置則為nice(沒有雷),因為埋雷是少數操作我們先初始化MineBoard數組里的元素全為nice;
void SetMine(char MineBoard[][List], int row, int list){ for (int i = 0;i < row;i++) { for (int j = 0;j < list;j++) { MineBoard[i][j] =nice; } }//無雷為nice int num = 0; int _x; int _y; while (num < BoomNumber) { _x = 1 + rand()%(Row-2); _y = 1 + rand()%(Row-2); if (MineBoard[_x][_y] != Boom) { MineBoard[_x][_y] = Boom; num++; } }}
埋雷完成后則給用戶展示ShowBoard
void ShowBoards(char ShowBoard[][List], int row, int list){ printf(" "); for (int x = 1;x < list - 1;x++) { printf(" %2d ",x); } printf("/n"); for (int i = 1;i < row-1;i++) { printf(" %2d",i); for (int j = 1;j < list-1;j++) { printf(" %c |",ShowBoard[i][j]); } printf("/n"); printf(" "); for (int k = 0;k < row - 2;k++) { printf("----"); } printf("/n"); }}
此時用戶選擇要掃描的坐標若該坐標沒有雷則統計其周圍雷的個數,要是有雷則中雷游戲結束
考慮到用戶輸入的坐標可能已經被掃描或者用戶輸入的坐標不在(1.1)~(Row-2,Row-2)這個范圍內我們就要提醒用戶輸入的坐標以及被掃描或者輸入的坐標不合法,直到用戶為掃描的坐標全為Boom為止
void Select(char ShowBoard[Row][List], char MineBoard[][List], int row, int list){ int step = 0; int x = 0; int y = 0; while (step < ((row - 2) * (list - 2) - BoomNumber)) { printf("請輸入你要排雷的坐標:(x,y)/n"); scanf("%d,%d", &x, &y); if (x > 0 && x < (List-1) && y>0 && y < (List-1)) { if (ShowBoard[x][y] == 42) { if (MineBoard[x][y] == nice) { CountBoom(ShowBoard, MineBoard, Row, List,x,y); system("cls"); ShowBoards(ShowBoard, Row, List); step++; if (step == ((row - 2) * (list - 2) - BoomNumber)) { printf("掃雷成功!/n"); Menu(); } } else if(MineBoard[x][y] == Boom) { system("cls"); printf("你已經被炸死了!游戲結束/n"); ShowMineBoard(MineBoard, Row, List); } } else { printf("此處已經被掃描,請輸入合法的坐標/n"); } } else { printf("請輸入合法的坐標/n"); } }}
統計用戶選擇的坐標的周圍雷的個數并讓這個數字展示在ShowBoard上,我用到了sprintf函數來把數字轉換成字符(因為我們定義ShowBoard數組為char類型)統計雷的個數時因為MineBoard數組也是char類型在把(x,y)周圍8個位置的雷的個數加起來時用到的是Boom的ascii碼值,又因為有雷為‘1’(ascii碼值為49)沒有雷為‘0’(ascii碼值為48)所以在運算后需要減去8個‘0’的ASCII碼值,再返回去看定義這兩個棋盤時我們只需要10x10的棋盤卻定義了12x12的棋盤這是為了方便統計邊緣棋盤周圍雷的個數
void CountBoom(char ShowBoard[Row][List],char MineBoard[][List], int row, int list, int x, int y){ int a = MineBoard[x][y + 1]/ + MineBoard[x + 1][y + 1] + MineBoard[x - 1][y + 1] / + MineBoard[x][y - 1] + MineBoard[x + 1][y - 1] / + MineBoard[x - 1][y - 1] + MineBoard[x - 1][y] / + MineBoard[x + 1][y] - 384; char arr[32];//設置一個較大的數組防止溢出 sprintf(arr, "%d", a);//把數字轉成字符 ShowBoard[x][y] = arr[0];}
至此掃雷游戲的主要邏輯已經梳理完畢
#include"FindMine.h"void Menu(){ printf("*****1.開始游戲*****/n"); printf("*****2.退出游戲*****/n"); printf("請選擇:/n"); int a = 0; scanf("%d", &a); system("cls"); if (a == 1) { Game(); } else if (a == 2) { exit(0); } else { printf("輸入有誤,請重新選擇/n"); Menu(); }}void Game(){ char ShowBoard[Row][List]; for (int i = 0;i < Row;i++) { for (int j = 0;j < List;j++) { ShowBoard[i][j] = "*"; } } char MineBoard[Row][List]; SetMine(MineBoard, Row, List); ShowBoards(ShowBoard, Row, List); Select(ShowBoard, MineBoard, Row, List);}int main(){ srand((unsigned int)time(NULL)); Menu(); return 0;}
這些為用戶可見的函數
#include"FindMine.h"void ShowBoards(char ShowBoard[][List], int row, int list){ printf(" "); for (int x = 1;x < list - 1;x++) { printf(" %2d ",x); } printf("/n"); for (int i = 1;i < row-1;i++) { printf(" %2d",i); for (int j = 1;j < list-1;j++) { printf(" %c |",ShowBoard[i][j]); } printf("/n"); printf(" "); for (int k = 0;k < row - 2;k++) { printf("----"); } printf("/n"); }}void ShowMineBoard(char MineBoard[][List], int row, int list){ for (int i = 1;i < row-1;i++) { for (int j = 1;j < list-1;j++) { printf("%c", MineBoard[i][j]); } printf("/n"); } Menu();}void CountBoom(char ShowBoard[Row][List],char MineBoard[][List], int row, int list, int x, int y){ int a = MineBoard[x][y + 1]/ + MineBoard[x + 1][y + 1] + MineBoard[x - 1][y + 1] / + MineBoard[x][y - 1] + MineBoard[x + 1][y - 1] / + MineBoard[x - 1][y - 1] + MineBoard[x - 1][y] / + MineBoard[x + 1][y] - 384; char arr[32];//設置一個較大的數組防止溢出 sprintf(arr, "%d", a);//把數字轉成字符 ShowBoard[x][y] = arr[0];}void Select(char ShowBoard[Row][List], char MineBoard[][List], int row, int list){ int step = 0; int x = 0; int y = 0; while (step < ((row - 2) * (list - 2) - BoomNumber)) { printf("請輸入你要排雷的坐標:(x,y)/n"); scanf("%d,%d", &x, &y); if (x > 0 && x < (List-1) && y>0 && y < (List-1)) { if (ShowBoard[x][y] == 42) { if (MineBoard[x][y] == nice) { CountBoom(ShowBoard, MineBoard, Row, List,x,y); system("cls"); ShowBoards(ShowBoard, Row, List); step++; if (step == ((row - 2) * (list - 2) - BoomNumber)) { printf("掃雷成功!/n"); Menu(); } } else if(MineBoard[x][y] == Boom) { system("cls"); printf("你已經被炸死了!游戲結束/n"); ShowMineBoard(MineBoard, Row, List); } } else { printf("此處已經被掃描,請輸入合法的坐標/n"); } } else { printf("請輸入合法的坐標/n"); } }}void SetMine(char MineBoard[][List], int row, int list){ for (int i = 0;i < row;i++) { for (int j = 0;j < list;j++) { MineBoard[i][j] =nice; } }//無雷為nice int num = 0; int _x; int _y; while (num < BoomNumber) { _x = 1 + rand()%(Row-2); _y = 1 + rand()%(Row-2); if (MineBoard[_x][_y] != Boom) { MineBoard[_x][_y] = Boom; num++; } }}
以上則為Game函數中需要調用的函數
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/125656.html
摘要:每成功排一次雷,我們都要展示雷盤當場上剩下的格子數等于雷數時,游戲勝利,玩家踩雷時,游戲結束,所以我們這是一個判斷輸贏的函數。 前言:寫完三子棋后,慢慢地熟悉了這種...
摘要:上一期咱們用語言實現了三子棋的小游戲語言實現三子棋今天我們再來寫個掃雷的游戲,說起掃雷,相信大家都不陌生,可能許多朋友還是玩掃雷的高手。 ? ? ?上一期咱們用C語言實現了三子棋的小游戲? C語言實現三子棋? ? ? ?今天我們再來寫個掃雷的游戲,說起掃雷,相信大家都不陌生,可能許多朋友還是...
摘要:函數游戲菜單請選擇掃雷游戲退出游戲選擇錯誤解析函數內部利用時間戳,形成隨機數,主要目的是實現游戲中地雷的隨機埋放。 前言 本篇文章使用C語言實現簡單小游戲---掃雷。(文章最后有完整代碼鏈接) 想必大多數人都玩過或者了解過掃雷的游戲規則,但是在這里,我們在一起重溫一下掃雷的游戲規則,也更好...
摘要:寫在前面我們已經寫過了三子棋小游戲肯定沒玩過癮,我們再寫個掃雷小游戲吧目錄寫在前面認識游戲游戲規則游戲框架游戲實現效果展示全部代碼文件文件文件認識游戲相信大家對掃雷都不陌生每臺電腦必備的小游戲游戲規則就是在規定的時間將 ...
閱讀 3735·2023-01-11 11:02
閱讀 4244·2023-01-11 11:02
閱讀 3050·2023-01-11 11:02
閱讀 5180·2023-01-11 11:02
閱讀 4737·2023-01-11 11:02
閱讀 5534·2023-01-11 11:02
閱讀 5313·2023-01-11 11:02
閱讀 3990·2023-01-11 11:02