欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言二維數(shù)組應用之掃雷游戲

 更新時間:2022年06月07日 11:00:45   作者:迷亭君  
這篇文章主要為大家詳細介紹了C語言二維數(shù)組應用之掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了C語言實現(xiàn)掃雷游戲的具體代碼,供大家參考,具體內容如下

上次用數(shù)組完成了一個井字棋,接下來用數(shù)組完成一個簡易版掃雷。

《掃雷》是一款大眾類的益智小游戲,于1992年發(fā)行。游戲目標是在短的時間內根據(jù)格子出現(xiàn)的數(shù)字找出所有非雷格子,同時避免踩雷,踩到一個雷即全盤皆輸。

根據(jù)上述定義,我們可知,游戲勝利的要求是:找出所有非雷的格子。

現(xiàn)在我們簡單梳理一下完成游戲的思路

一、變量定義

1、首次要定義地圖變量,這里注意要定義兩個二維數(shù)組,一個用來存放地雷的分布情況,另一個存放玩家看見的地圖。 

     這里以9*9的地圖為例

     char playerMap[9][9];

     char mineMap[9]9];

     剩下的操作都在這兩個地圖上進行

二、游戲步驟

1、初始化兩張地圖,即

     將玩家所見的地圖初始化為全為草地的樣子(這里用*代表草地);

     將地雷分布地圖用隨機數(shù)生成10個地雷,有雷的位置用 '1' 表示,沒有雷的位置用 '0' 表示;

     需注意 (1)、隨機生成的地雷位置不能超出地圖邊界;

                 (2)、生成地雷的位置在生成前必須沒有地雷;

2、打印地圖給玩家看,這里打印的是玩家地圖 playerMap ;

3、玩家操作,輸入所要揭開的位置坐標;

     需注意 (1)、需要判斷玩家所輸入的坐標是否超界;

                 (2)、需要判斷玩家所輸入的坐標是否已經(jīng)被揭開;

4、判斷玩家選擇位置是否是雷,

     若是,則輸出"你輸了",跳到6;

     若不是,更改玩家看見地圖的信息,即顯示玩家所選位置的周圍有幾個雷,進入下一步;

5、打印玩家地圖,即將剛才地圖的更新情況告知玩家;

5、判斷玩家是否勝利(未被揭開的位置的個數(shù)是否和雷的個數(shù)一致,一致代表玩家已經(jīng)找出了所有不是雷的位置,玩家勝利);

     若還未勝利,回到3;

     若勝利,則輸入"你贏了",進入下一步;

6、打印地雷的分布地圖;

7、游戲結束。

三、代碼實現(xiàn)

#define _CRT_SECURE_NO_WARNINGS
#define MAX_ROW 9
#define MAX_COL 9
#define MAX_MINE_NUM 10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
?
//菜單函數(shù)
int menu(){
?? ?printf("--------------\n");
?? ?printf("1.開始游戲\n");
?? ?printf("2.退出游戲\n");
?? ?printf("--------------\n");
?? ?int choice = 0;
?? ?scanf("%d", &choice);
?? ?return choice;
}
?
//初始化兩張地圖
void initMap(char playerMap[MAX_ROW][MAX_COL],
?? ?char mineMap[MAX_ROW][MAX_COL]){
?? ?for (int row = 0; row < MAX_ROW; row++){
?? ??? ?for (int col = 0; col < MAX_COL; col++){
?? ??? ??? ?playerMap[row][col] = '*';
?? ??? ?}
?? ?}
?? ?for (int row = 0; row < MAX_ROW; row++){
?? ??? ?for (int col = 0; col < MAX_COL; col++){
?? ??? ??? ?mineMap[row][col] = '0';
?? ??? ?}
?? ?}
?? ?//隨機生成10個雷
?? ?int mineNum = 0;
?? ?while (mineNum<MAX_MINE_NUM){
?? ??? ?int row = rand() % 9;
?? ??? ?int col = rand() % 9;
?
?? ??? ?if (mineMap[row][col] == '0'){
?? ??? ??? ?mineMap[row][col] = '1';
?? ??? ??? ?mineNum++;
?? ??? ?}
?? ?}
}
?
//打印地圖
void printMap(char theMap[MAX_ROW][MAX_COL]){
?? ?printf(" ?|");
?? ?for (int col = 0; col < MAX_COL; col++){
?? ??? ?printf("%d |", col);
?? ?}
?? ?printf("\n");
?? ?printf("--+--+--+--+--+--+--+--+--+--+\n");
?? ?for (int row = 0; row < MAX_ROW; row++){
?? ??? ?printf("%d ", row);
?? ??? ?printf("|");
?? ??? ?for (int col = 0; col < MAX_COL; col++){
?? ??? ??? ?printf("%c |", theMap[row][col]);
?? ??? ?}
?? ??? ?printf("\n");
?? ??? ?printf("--+--+--+--+--+--+--+--+--+--+\n");
?? ?}
}
?
?
//改變玩家所見地圖信息
void updateMapInfor(char playerMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL],int row, int col){
?? ?//定義所選位置周圍的地雷的個數(shù)
?? ?int numOfMine = 0;
?? ?for (int r = row - 1; r <= row + 1; r++){
?? ??? ?for (int c = col - 1; c <= col + 1; c++){
?? ??? ??? ?if (r >= 0 && r < MAX_ROW
?? ??? ??? ??? ?&&c >= 0 && c < MAX_COL
?? ??? ??? ??? ?&&mineMap[r][c] == '1'){
?? ??? ??? ??? ?numOfMine++;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?playerMap[row][col] = numOfMine + '0';
}
?
?
//玩家操作,
//返回值代表玩家所選位置是否是雷
//是雷返回1,不是雷返回0
int playDo(char playerMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL]) {
?? ?printf("輸入橫縱坐標選擇沒有雷的位置,(橫 縱)\n");
?? ?int row = 0;
?? ?int col = 0;
?? ?while (1){
?? ??? ?scanf("%d %d", &row, &col);
?? ??? ?if (playerMap[row][col] == '*'
?? ??? ??? ?&&row >= 0 && row < MAX_ROW
?? ??? ??? ?&&col >= 0 && col < MAX_COL) {
?? ??? ??? ?//被選位置未被揭開,且被選位置沒有越界
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?printf("您的位置輸入有誤,可能存在如下問題\n");
?? ??? ?printf("1.位置選擇越界\n2.所選位置已經(jīng)被揭開\n");
?? ??? ?printf("請您重新輸入位置\n");
?? ?}
?? ?//判斷是不是雷,如果是
?? ?if (mineMap[row][col] == '1'){
?? ??? ?return 1;
?? ?}
?? ?else{//否則(不是雷)更新地圖信息
?? ??? ?updateMapInfor(playerMap, mineMap, row, col);
?? ??? ?return 0;
?? ?}
?? ?
}
?
//判斷玩家是否勝利(所有雷是否已經(jīng)被找完),返回值為1代表勝利,0代表還未勝利
//判斷方法為,檢查玩家地圖上未揭起的位置是否和雷的個數(shù)相等
//(可揭起的一定不是雷,未揭起的可能是雷)
//若未揭起的個數(shù)大于雷的個數(shù)說明游戲還未結束
int isWin(char playerMap[MAX_ROW][MAX_COL]){
?? ?//玩家地圖中草坪的個數(shù),也就是未揭起位置的個數(shù),初始化為0
?? ?int numOfGrass = 0;
?? ?for (int row = 0; row < MAX_ROW; row++){
?? ??? ?for (int col = 0; col < MAX_COL; col++){
?? ??? ??? ?if (playerMap[row][col] == '*'){
?? ??? ??? ??? ?numOfGrass++;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?if (numOfGrass == MAX_MINE_NUM){
?? ??? ?return 1;
?? ?}
?? ?return 0;
}
?
void game(){
?? ?//玩家看見的地圖
?? ?char playerMap[MAX_ROW][MAX_COL];
?? ?//埋雷地圖
?? ?char mineMap[MAX_ROW][MAX_COL];
?? ?//1.初始化兩張地圖,
?? ?//一張玩家看見的map1,草地全用*表示
?? ?//一張地雷地圖map2,地雷的位置隨機生成,有雷為1,沒雷為0
?? ?initMap(playerMap, mineMap);
?? ?//2.打印map1
?? ?printMap(playerMap);
?? ?//TODO
?? ?//printMap(mineMap);
?? ?while (1){
?? ??? ?//3.玩家操作,輸入坐標
?? ??? ?//判斷玩家選擇的位置是否是雷
?? ??? ?//若是則跳出循環(huán)結束
?? ??? ?if (playDo(playerMap, mineMap) == 1){
?? ??? ??? ?printf("你輸了\n");
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?//判斷所有雷是否已經(jīng)被找完
?? ??? ?//是,則游戲勝利
?? ??? ?if (isWin(playerMap)==1){
?? ??? ??? ?printf("你贏了\n");
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?//否,則繼續(xù)游戲
?? ??? ?//4.打印map1
?? ??? ?printMap(playerMap);
?? ?}
?? ?//5.判斷游戲是否結束,否回到3
?? ?//6.是,游戲結束,打印地雷位置圖
?? ?printMap(mineMap);
}
?
int main(){
?? ?//菜單,1.開始游戲 ? 2.退出游戲
?? ?int choice = 0;
?? ?srand((unsigned int)time(0));
?? ?while (1){
?? ??? ?choice = menu();
?? ??? ?if (choice == 1){
?? ??? ??? ?game();
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?else if (choice == 2){
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?else{
?? ??? ??? ?printf("您的輸入有誤,請重新輸入\n");
?? ??? ?}
?? ?}
?? ?system("pause");
?? ?return 0;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C++全密碼生成的實現(xiàn)代碼

    C++全密碼生成的實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了C++全密碼生成的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C語言實現(xiàn)掃雷游戲

    C語言實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++簡單實現(xiàn)RPC網(wǎng)絡通訊的示例詳解

    C++簡單實現(xiàn)RPC網(wǎng)絡通訊的示例詳解

    RPC是遠程調用系統(tǒng)簡稱,它允許程序調用運行在另一臺計算機上的過程,就像調用本地的過程一樣。本文將用C++簡單實現(xiàn)RPC網(wǎng)絡通訊,感興趣的可以了解一下
    2023-04-04
  • C++右值引用問題解決

    C++右值引用問題解決

    本文主要介紹了C++右值引用問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • C++ txt 文件讀取,并寫入結構體中的操作

    C++ txt 文件讀取,并寫入結構體中的操作

    這篇文章主要介紹了C++ txt 文件讀取,并寫入結構體中的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Qt實現(xiàn)網(wǎng)易云音樂進度條效果

    Qt實現(xiàn)網(wǎng)易云音樂進度條效果

    這篇文章主要為大家詳細介紹了Qt實現(xiàn)網(wǎng)易云音樂進度條效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 利用Matlab繪制一個可愛的南瓜燈

    利用Matlab繪制一個可愛的南瓜燈

    這篇文章主要為大家介紹了如何利用Matlab繪制一個可愛的南瓜燈!文中的示例代碼講解詳細,對我們學習Matlab有一定幫助,需要的可以參考一下
    2022-02-02
  • 常用的C++標準庫頭文件小結

    常用的C++標準庫頭文件小結

    C++標準庫定義了一系列函數(shù)、宏和對象,以實現(xiàn)跨團隊、跨平臺的高效且具有卓越性能的標準化 C++ 代碼, 本文介紹常用的C++標準庫頭文件,需要的朋友可以參考下
    2023-11-11
  • C++數(shù)據(jù)結構與算法之哈夫曼樹的實現(xiàn)方法

    C++數(shù)據(jù)結構與算法之哈夫曼樹的實現(xiàn)方法

    這篇文章主要介紹了C++數(shù)據(jù)結構與算法之哈夫曼樹的實現(xiàn)方法,簡單說明了哈夫曼樹的原理,并結合具體實例形式分析了C++實現(xiàn)哈夫曼樹的相關操作技巧,需要的朋友可以參考下
    2017-11-11
  • C++中vector迭代器失效問題詳解

    C++中vector迭代器失效問題詳解

    vector是向量類型,它可以容納許多類型的數(shù)據(jù),如若干個整數(shù),所以稱其為容器,這篇文章主要給大家介紹了關于C++中vector迭代器失效問題的相關資料,需要的朋友可以參考下
    2021-11-11

最新評論