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

C語言版掃雷游戲

 更新時(shí)間:2021年05月17日 08:36:44   作者:四舍五入兩米高的小晨  
這篇文章主要為大家詳細(xì)介紹了C語言版掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

1、思路

一、創(chuàng)建二維數(shù)組,來表示地圖

每一個(gè)格子要表示的信息:

1、未翻開狀態(tài)(草地)和已翻開狀態(tài)(數(shù)字)
2、該格子是地雷或者不是地雷(1表示是地雷,0表示不是)

二、使用兩個(gè)二維數(shù)組來分別表示以上的兩種狀態(tài)

第一個(gè)二維數(shù)組
char showMap[9][9];表示每個(gè)格子的翻開和未翻開狀態(tài)
表示未翻開,字符'0'-'8'表示已翻開的數(shù)字
第二個(gè)二維數(shù)組
char mineMap[9][9];表示每個(gè)格子是否是地雷
'1'表示是地雷,'0'表是不是地雷

三、掃雷游戲流程

1、創(chuàng)建地圖并初始化
針對showMap來說,初始化全是
針對mineMap來說,先把整個(gè)數(shù)組都初始化成'0',隨機(jī)生成10個(gè)位置,作為地雷,設(shè)為'1',
2、打印地圖showMap
3、讓玩家輸入坐標(biāo),表示要翻開的位置
4、判定是否踩雷
5、更新showMap,再翻開位置顯示周圍有多少個(gè)地雷
6、判定玩家是否翻開了所有的位置
如果為否則返回第二步

2、源代碼:

#define  _CRT_SECURE_NO_WARNINGS  
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>


#define MAX_ROW 9
#define MAX_COL 9
#define MINE_COUNT 10

void init(char showMap[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++)
   showMap[row][col] = '*';*/
 //mem=>memory 內(nèi)存
 //set:設(shè)置,集合
 //memset的功能就是把一段內(nèi)存上的每一個(gè)字節(jié)都設(shè)置成一個(gè)具體的值
 //二維數(shù)組的每個(gè)元素都是在一個(gè)連續(xù)的內(nèi)存空間上布局的
 memset(showMap,'*',MAX_ROW*MAX_COL);
 //第一個(gè)參數(shù)表示起始位置,第二個(gè)參數(shù)表示把這段內(nèi)存的值設(shè)為啥,第三個(gè)參數(shù)表示這段內(nèi)存多少字節(jié)
 memset(mineMap, '0', MAX_ROW * MAX_COL);
 //隨機(jī)產(chǎn)生十個(gè)位置作為地雷
 //先設(shè)置隨機(jī)種子
 srand((unsigned int)time(0));
 int mineCount = 0;
 while (mineCount< MINE_COUNT) {
  int row = rand() % MAX_ROW;
  int col = rand() % MAX_COL;
  if (mineMap[row][col] == '1') {
   continue;
  }
  mineMap[row][col] = '1';
  mineCount++;
 }

}  
//打印地圖,希望這一個(gè)函數(shù)同時(shí)具備打印兩種地圖的功能
//取決于實(shí)參填啥
//形參名字叫做"map"不太合適,C++標(biāo)準(zhǔn)庫里有一個(gè)std::map
void print(char theMap[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   printf("%c",theMap[row][col]);
  }
  printf("\n");
 }
}

void update(char showMap[MAX_ROW][MAX_COL],
    char mineMap[MAX_ROW][MAX_COL],int row,int col){
 //count表示周圍的地雷個(gè)數(shù)
 int count = 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) {
    //此時(shí)r,c坐標(biāo)超出棋盤的范圍,直接跳出
    continue;
   }
   if (r == row && c == col) {
    //如果為這個(gè)點(diǎn)本身,不需要循環(huán),直接下次循環(huán)
    continue;
   }
   if (mineMap[r][c] == '1') {
    count++;
   }
  }
 }
 //如果直接賦值,此時(shí)假設(shè)count是2,
 //當(dāng)前row,col位置的元素就被設(shè)置成了ASCLL值為
 //2的字符而不是'2'
 showMap[row][col] ='0'+ count;
}
int main() {
 //1、創(chuàng)建地圖并初始化
 char showMap[MAX_ROW][MAX_COL] = { 0 };
 char mineMap[MAX_ROW][MAX_COL] = { 0 };
 init(showMap, mineMap);
 int openedCount = 0;//用來表示翻開的個(gè)數(shù)
 while (1) {
  //清屏
  system("cls");
  //2、打印地圖
  print(showMap);
  //為了驗(yàn)證update函數(shù)的正確性,先把地雷的布局也打印出來
  //printf("============================\n");
  //print(mineMap);
  //3、玩家輸入坐標(biāo)
  int row = 0;
  int col = 0;
  printf("請輸入坐標(biāo)(row,col):");
  scanf("%d %d", &row, &col);
  //進(jìn)行合法性判定
  if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
   printf("你輸入的坐標(biāo)有誤!請重新輸入!\n");
   continue;
  }
  //判斷玩家輸入的位置是否已經(jīng)翻開
  if (showMap[row][col] != '*') {
   printf("您輸入的位置已經(jīng)翻開了!請重新輸入!\n");
   continue;
  }
  //4、判定是否踩雷
  if (mineMap[row][col] == '1') {
   printf("您踩雷了!??!游戲結(jié)束!\n");
   break;
  }
  //5、更新showMap,顯示當(dāng)前位置周圍有多少個(gè)雷
  update(showMap, mineMap, row, col);
  //6、進(jìn)行游戲勝利的判定,統(tǒng)計(jì)當(dāng)前一共翻開了多少個(gè)格子
  openedCount++;
  if (openedCount == MAX_ROW * MAX_COL - MINE_COUNT) {
   printf("恭喜你,獲勝了!\n");
   break;
  }
 }
 system("pause");
 return 0;
}

3、總結(jié)

a.memset函數(shù)的使用
b.使用數(shù)組時(shí)應(yīng)時(shí)刻注意越界問題
c.在update函數(shù)中數(shù)坐標(biāo)周圍地雷個(gè)數(shù)時(shí)注意不要直接賦值,而應(yīng)該加字符0,因?yàn)榈貓D元素為char型。

showMap[row][col] ='0'+ count;

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言結(jié)構(gòu)體的全方面解讀

    C語言結(jié)構(gòu)體的全方面解讀

    C 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲不同類型的數(shù)據(jù)項(xiàng)
    2021-10-10
  • 基于C語言掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn)

    基于C語言掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn)

    大家好,本篇文章主要講的是基于C語言掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語言字符串左旋的兩種實(shí)現(xiàn)方法

    C語言字符串左旋的兩種實(shí)現(xiàn)方法

    匯編語言中有一種移位指令叫做循環(huán)左移(ROL),下面這篇文章主要給大家介紹了關(guān)于C語言字符串左旋的兩種實(shí)現(xiàn)方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • C++日期類實(shí)現(xiàn)的完整操作

    C++日期類實(shí)現(xiàn)的完整操作

    C++標(biāo)準(zhǔn)庫沒有提供所謂的日期類型,C++繼承了C語言用于日期和時(shí)間操作的結(jié)構(gòu)和函數(shù),這篇文章主要給大家介紹了關(guān)于C++日期類實(shí)現(xiàn)的完整操作,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • VC++實(shí)現(xiàn)通過API來查看程序錯(cuò)誤信息的方法

    VC++實(shí)現(xiàn)通過API來查看程序錯(cuò)誤信息的方法

    這篇文章主要介紹了VC++實(shí)現(xiàn)通過API來查看程序錯(cuò)誤信息的方法,非常實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • 基于C++自制屠夫躲貓貓小游戲

    基于C++自制屠夫躲貓貓小游戲

    這篇文章主要為大家詳細(xì)介紹了如何基于C++自制屠夫躲貓貓小游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C語言編程中分配內(nèi)存空間的相關(guān)函數(shù)

    C語言編程中分配內(nèi)存空間的相關(guān)函數(shù)

    這篇文章主要介紹了C語言編程中分配內(nèi)存空間的相關(guān)函數(shù),分別是malloc()函數(shù)和calloc()函數(shù),需要的朋友可以參考下
    2015-08-08
  • C/C++宏定義的可變參數(shù)詳細(xì)解析

    C/C++宏定義的可變參數(shù)詳細(xì)解析

    在1999年版本的ISO C 標(biāo)準(zhǔn)中,宏可以象函數(shù)一樣,定義時(shí)可以帶有可變參數(shù)。宏的語法和函數(shù)的語法類似
    2013-09-09
  • C++私有繼承(二)

    C++私有繼承(二)

    這篇文章主要介紹了C++私有繼承,在私有繼承時(shí),基類的公有對象以及保護(hù)對象會變成派生類的私有對象。我們可以在派生類方法當(dāng)中使用它,但無法通過派生類對象直接調(diào)用,但無法訪問基類的私有方法和對象,下面具體內(nèi)容,需要的朋友可以參考一下
    2022-01-01
  • C語言深入探究直接插入排序與希爾排序使用案例講解

    C語言深入探究直接插入排序與希爾排序使用案例講解

    算法中排序是十分重要的,而每一個(gè)學(xué)習(xí)計(jì)算機(jī)的都會在初期的時(shí)候接觸到這種排序,下面這篇文章主要給大家介紹了關(guān)于c語言直接插入排序與希爾排序使用的相關(guān)資料,需要的朋友可以參考下
    2022-05-05

最新評論