最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年03月16日 12:57:35   作者:Monster_ii  
這篇文章主要為大家詳細(xì)介紹了C語言掃雷游戲?qū)崿F(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

這是一個用C語言實現(xiàn)的控制臺掃雷小游戲,實現(xiàn)了隨機布置炸彈、掃描炸彈、標(biāo)記炸彈、百分百第一次不被炸死等功能。

編譯器:vs2015

功能模塊圖

源代碼

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void show(int cbd[10][10],int u[10][10])  //界面輸出函數(shù)
{
  int i, j;
  //for (i = 0; i < 10; i++)   //輸出全部炸彈信息(上帝視角,調(diào)試用)
  //{
  // for (j = 0; j < 10; j++)
  // {
  //   printf("%2d ", cbd[i][j]);
  // }
  // printf("\n");
  //}
  printf("   1 2 3 4 5 6 7 8 9 10\n");   //行標(biāo)
  printf("  --------------------\n");
  for (i = 0; i<10; i++)    //根據(jù)u數(shù)組和cbd數(shù)組的值選擇輸出
  {                //■:未掃描,□:周圍無炸彈,◇:炸彈標(biāo)記
    for (j = 0; j<10; j++)
    {
      if (j == 0)printf("%2d║ ", i+1);
      if (u[i][j] == 0)printf("■");
      else if (u[i][j] == 1)
      {
        if (cbd[i][j] == 0)printf("□");
        else printf("%2d", cbd[i][j]);
      }
      else if (u[i][j] == -1) 
      {
        printf("◇");
      }
    }
    printf("\n");
  }
}

int find(int cbd[10][10], int i, int j)   //掃描周圍炸彈數(shù)目
{
  int l, c,lmin,cmin, lmax, cmax, num = 0;
  l = lmin = (i - 1) >= 0 ? (i - 1) : 0;   //計算行、列起點
  c = cmin = (j - 1) >= 0 ? (j - 1) : 0;
  lmax = ((i + 1) < 10 ? (i + 1) : 9);    //計算行、列終點
  cmax = ((j + 1) < 10 ? (j + 1) : 9);

  for (l = lmin; l <= lmax; l++)
  {
    for (c = cmin; c <= cmax; c++)
    {
      if (l == i&&c == j)continue;    //跳過自身
      if (cbd[l][c] == -1)num++;  //炸彈計數(shù)
    }
  }
  return num;
}

void init(int cbd[10][10])    //cbd數(shù)組初始化(隨機布置炸彈并填充各個格子的數(shù)目)
{
  int n = 10, l, c, i, j;
  srand(time(NULL));      //隨機數(shù)種子設(shè)置
  for (i = 0; i< 10; i++)
  {
    for (j = 0; j< 10; j++)
    {
      cbd[i][j] = 0;      //全0填充
    }
  }
  while (n--)     //隨機行列放置炸彈
  {
    l = rand() % 10;
    c = rand() % 10;
    if (cbd[l][c] != -1)cbd[l][c] = -1;    //炸彈重復(fù)處理
    else n++;
  }
  for (i = 0; i< 10; i++)
  {
    for (j = 0; j< 10; j++)
    {
      if (cbd[i][j] != -1)
      {
        cbd[i][j] = find(cbd, i, j);  //炸彈數(shù)目填充
      }
    }
  }
}

void open(int cbd[10][10],int u[10][10], int i, int j)   //周圍無炸彈時的展開函數(shù)(遞歸展開)
{
  u[i][j] = 1;
  if (cbd[i][j] == 0)
  {
    if(i - 1 >= 0 && u[i - 1][j] != 1)open(cbd, u, i - 1, j);  //上
    if(j - 1 >= 0 && u[i][j - 1] != 1)open(cbd, u, i, j - 1);  //左
    if (i + 1 <= 9 && u[i + 1][j] != 1)open(cbd, u, i + 1, j); //下
    if (j + 1 <= 9 && u[i][j + 1] != 1)open(cbd, u, i, j + 1); //右
  }
}

int judge(int u[10][10])    //判斷游戲是否通關(guān)
{
  int i, j, num = 0;
  for (i = 0; i < 10; i++)
  {
    for (j = 0; j < 10; j++)
    {
      if (u[i][j] == 0 || u[i][j] == -1)num++;
    }
  }
  if (num == 10)return 1;
  else return 0;
}

void fail(int cbd[10][10], int u[10][10])    //游戲失敗函數(shù)
{
  int i, j;
  for (i = 0; i < 10; i++)          //輸出全部炸彈信息
  {
    for (j = 0; j < 10; j++)
    {
      if (cbd[i][j] == 0)printf(" ");
      else if (cbd[i][j] != -1)printf("%2d", cbd[i][j]); 
      else printf("●");
    }
    printf("\n");
  }
  printf("請大俠重新來過~\n");
}

void menu(int cbd[10][10],int u[10][10])  //菜單函數(shù)
{
  int chs,i,j;
  int boom = 10;    //剩余炸彈數(shù)
  int num = 0;     //步數(shù)
  while (1)                  
  {
    system("cls");
    show(cbd,u);
    printf("還有%d個炸彈\n",boom);
    printf("1.掃描  2.標(biāo)記  3.取消標(biāo)記\n");
    printf("請輸入選項:>");
    scanf("%d", &chs);
    if (chs > 3 || chs < 1) {
      printf("請輸入正確選項!\n");
      system("pause");
      continue;
    }
    printf("請輸入坐標(biāo):>");
    scanf("%d %d", &i, &j);
    if (i < 1 || i>10)
    {
      printf("請輸入正確坐標(biāo)!\n");
      system("pause");
      continue;
    }
    i--;      //輸入行列數(shù)處理(適用數(shù)組下標(biāo))
    j--;
    if (chs == 1)
    {
      if (cbd[i][j] == -1) {
        if (num == 0) {   //若第一步掃描到炸彈,就重新初始化棋盤
          init(cbd);
          show(cbd, u);
          open(cbd, u, i, j);
          num++;
          continue;
        }
        else
        {
          fail(cbd, u);  //否則游戲失敗,循環(huán)跳出
          break;
        }
      }
      if (u[i][j] == 1)    //重復(fù)掃描時的處理
      {
        printf("該位置已經(jīng)掃描過了!\n");
        system("pause");
        continue;
      }
      open(cbd, u, i, j);
      num++;
    }
    else if(chs == 2)
    {
      if (u[i][j] == 1) {
        printf("該位置已經(jīng)掃描過了!\n"); //只能標(biāo)記未掃描到的
        system("pause");
        continue;
      }
      u[i][j] = -1;
      boom --;      
    }
    else if (chs == 3)
    {
      if (u[i][j] != -1) {
        printf("該位置沒有標(biāo)記!\n");    //只能取消標(biāo)記過的
        system("pause");
        continue;
      }
      u[i][j] = 0;
      boom++;
    }
    if (judge(u))    //判斷游戲是否通關(guān)
    {
      printf("Old Fe 666!\n");    //老鐵666!,循環(huán)跳出
      break;
    }
  }
}

int main()
{
  int cbd[10][10] = { 0 };    //保存炸彈信息的二維數(shù)組
  int u[10][10] = { 0 };     //保存是否翻開信息的二維數(shù)組
  init(cbd);      //數(shù)組初始化
  menu(cbd, u);    //進(jìn)入菜單
  return 0;
}

Tips:在掃描到周圍無炸彈的格子時,要將此格子周圍的部分依次打開,直到上下左右都出現(xiàn)炸彈數(shù)字為止,這里要用到遞歸的方法,我的順序為依次遞歸處理上、左、下、右的格子,這里順序可以任意。

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

相關(guān)文章

  • C++ cin.getline及getline()用法詳解

    C++ cin.getline及getline()用法詳解

    這篇文章主要介紹了C++ cin.getline用法及C++ getline()的兩種用法,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • C語言字符串旋轉(zhuǎn)問題的深入講解

    C語言字符串旋轉(zhuǎn)問題的深入講解

    這篇文章主要給大家介紹了關(guān)于C語言字符串旋轉(zhuǎn)問題的相關(guān)資料,文中給出了詳細(xì)的實現(xiàn)方法,并對每種方法進(jìn)行了分析和示例代碼,需要的朋友可以參考下
    2021-09-09
  • C語言詳細(xì)講解通過遞歸實現(xiàn)掃雷的展開

    C語言詳細(xì)講解通過遞歸實現(xiàn)掃雷的展開

    windows自帶的游戲《掃雷》是陪伴了無數(shù)人的經(jīng)典游戲,本文將利用C語言實現(xiàn)這一經(jīng)典的游戲,文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • C語言關(guān)于注釋的知識點總結(jié)

    C語言關(guān)于注釋的知識點總結(jié)

    在本篇文章里小編給大家分享的是關(guān)于C語言關(guān)于注釋的知識點總結(jié),需要的朋友們可以參考學(xué)習(xí)下。
    2020-02-02
  • C/C++實現(xiàn)雙路快速排序算法原理

    C/C++實現(xiàn)雙路快速排序算法原理

    這篇文章主要為大家詳細(xì)介紹了C/C++實現(xiàn)雙路快速排序算法原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C++ 中CListCtrl的每個項都顯示不同的提示信息

    C++ 中CListCtrl的每個項都顯示不同的提示信息

    這篇文章主要介紹了C++ 中CListCtrl的每個項都顯示不同的提示信息的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • C++按位異或運算符的使用介紹

    C++按位異或運算符的使用介紹

    本篇文章對C++按位異或運算符的使用進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • C++ OpenCV單峰三角閾值法Thresh_Unimodal詳解

    C++ OpenCV單峰三角閾值法Thresh_Unimodal詳解

    本文主要介紹了適合當(dāng)圖像的直方圖具有明顯單峰特征時使用,結(jié)合了三角法的原理而設(shè)計的圖像分割方法,感興趣的小伙伴可以了解一下
    2021-12-12
  • c++命名對象和匿名對象的解析

    c++命名對象和匿名對象的解析

    像按值傳遞的對象(函數(shù)入?yún)?,函?shù)返回值)都是匿名對象,那匿名對象的特點是什么呢?下面通過實例代碼給大家解析c++命名對象和匿名對象的相關(guān)知識,感興趣的朋友一起看看吧
    2021-10-10
  • C++中const用法小結(jié)

    C++中const用法小結(jié)

    C++ const 允許指定一個語義約束,編譯器會強制實施這個約束,允許程序員告訴編譯器某值是保持不變的。如果在編程中確實有某個值保持不變,就應(yīng)該明確使用const,這樣可以獲得編譯器的幫助。
    2016-04-04

最新評論

九龙坡区| 桦南县| 麻江县| 琼结县| 新竹市| 剑河县| 都昌县| 修水县| 新疆| 金湖县| 宣武区| 中方县| 丹凤县| 丹棱县| 洪泽县| 青川县| 宝丰县| 陆丰市| 广昌县| 龙泉市| 晴隆县| 江津市| 永川市| 新民市| 雷州市| 衡南县| 扬中市| 崇仁县| 宜丰县| 始兴县| 高密市| 漠河县| 阿尔山市| 马边| 湘乡市| 双城市| 保德县| 塔河县| 肥城市| 元江| 巴楚县|