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

C語(yǔ)言實(shí)現(xiàn)掃雷游戲(含注釋詳解)

 更新時(shí)間:2021年09月10日 15:28:02   作者:3 ERROR(s)  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲,含注釋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

前言

一、游戲規(guī)則介紹

掃雷是一個(gè)十分經(jīng)典的游戲,一張棋盤中有很多個(gè)不確定是雷還是安全區(qū)域的格子,當(dāng)點(diǎn)擊之后若沒有雷則會(huì)在該區(qū)域顯示周圍八個(gè)格子雷的數(shù)目,若有雷則游戲結(jié)束。今天我就跟大家分享一下如何用c語(yǔ)言實(shí)現(xiàn)初階版掃雷。

二、基本思路流程介紹

1.創(chuàng)建一個(gè)用戶交互菜單
2.創(chuàng)建一個(gè)Show_Mines棋盤用來(lái)埋雷并初始化
3.創(chuàng)建一個(gè)Show_Table 棋盤用來(lái)和用戶交互并初始化
4.玩家選擇想要掃描的坐標(biāo)
5.判定游戲是否結(jié)束
6.若沒有踩雷則在剛掃描的區(qū)域上顯示周圍八個(gè)區(qū)域的地雷數(shù)目并繼續(xù)游戲
7.繼續(xù)掃雷
8.判定游戲是否結(jié)束

9.若全部掃描完非雷區(qū)域則游戲結(jié)束

效果展示

三、代碼實(shí)現(xiàn)

1.用戶交互菜單(Menu函數(shù))

Menu(){
 printf("########################\n");
 printf("# 1. Play       0.Exit #\n");
 printf("########################\n");
}

2. Game函數(shù)

void Game()
{
 srand((unsigned long)time(NULL)); //生成隨機(jī)數(shù)種子

 char show_board[ROW][COL];   
 char mines_board[ROW][COL];

 memset(show_board, WHAT, sizeof(show_board));//生成并且初始化用戶顯示棋盤
 memset(mines_board, '0', sizeof(mines_board));//生成并且初始化掃雷棋盤

 SetMines(mines_board, ROW, COL);//放雷

 int count = (ROW - 2)*(COL - 2) - NUM;    //若掃完這些次 不觸雷則勝利

 while (count){
  system("cls");
  ShowBoard(show_board, ROW, COL);
  printf("請(qǐng)選擇你要掃描的區(qū)域坐標(biāo) ");
  int x = 0;
  int y = 0;
  scanf("%d %d", &x, &y);
  if (x < 1 || x > ROW-2 || y < 1 || y > COL-2){ //非法性輸入判斷
   printf("輸入錯(cuò)誤!\n");
   continue;
  }
  if (show_board[x][y] != WHAT){           
   printf("此處已經(jīng)被掃過(guò)了,請(qǐng)從新輸出\n");
   continue;
  }
  if (mines_board[x][y] == '1'){
   system("cls");
   ShowBoard(mines_board, ROW, COL);
   printf("踩雷了!游戲結(jié)束!\n");
   break;
  }
  
  show_board[x][y] = CountMines(mines_board, x, y);
  count--;
 }

}

1.memset函數(shù)直接定義show_board函數(shù)并且初始化二維數(shù)組為全WHAT宏定義的*。
2.先向用戶展示用戶展示棋盤,用戶輸入一個(gè)坐標(biāo)進(jìn)行非法性判斷。
3.把用戶輸入的坐標(biāo)拿給放置雷的棋盤中,若該區(qū)域有雷則游戲結(jié)束,反之則繼續(xù)
4.游戲勝利條件為掃描完所有非雷區(qū)域

3.放雷函數(shù)(SetMines函數(shù))

void SetMines(char board[][COL], int row, int col){ //放雷函數(shù)
 int count = NUM;
 while (count){
  int x = rand() % (row - 2) + 1;
  int y = rand() % (col - 2) + 1;
  if (board[x][y] == '0'){
   board[x][y] = '1';
   count--;
  }
 }
}

使用隨機(jī)數(shù)種子生成1到 棋盤大小長(zhǎng)寬-2的隨機(jī)數(shù),這些隨機(jī)數(shù)組成的坐標(biāo)放雷,循環(huán)次數(shù)就是雷的數(shù)目。因?yàn)殡S機(jī)數(shù)可能生成一樣的,所以要進(jìn)行一次非法性判斷,當(dāng)棋盤這個(gè)位置沒有雷的情況下才能往里面放雷。

4.掃雷展示面板(ShowBoard函數(shù)和ShowLine函數(shù))

void ShowBoard(char board[][COL], int row, int col){//掃雷展示面板
 printf("     ");
 for (int i = 1; i <= (col - 2); i++){  //打印表頭數(shù)字
  printf("%d   ", i);
 }
 printf("\n");
 ShowLine(col);//顯示行線
 for (int i = 1; i <= (row - 2); i++){
  printf("%-3d|", i);
  for (int j = 1; j <= (col - 2); j++){
   printf(" %c |", board[i][j]); 
  }
  printf("\n");
  ShowLine(col);
 }
}


void ShowLine(int col){  //顯示橫著的虛線,作為行間隔

 for (int i = 0; i <= (col - 2); i++){
  printf("----");
 }
 printf("\n");
}

5.統(tǒng)計(jì)周圍雷的個(gè)數(shù)(CountMines函數(shù))

CountMines(char board[][COL], int x, int y){ //統(tǒng)計(jì)周圍雷的個(gè)數(shù)
 return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + \
  board[x][y + 1] + board[x + 1][y + 1] + board[x + 1][y] + \
  board[x + 1][y - 1] + board[x][y - 1] - 7 * '0';//本來(lái)減八個(gè)零,但是整形轉(zhuǎn)字符加一個(gè)‘0'
}

由于數(shù)組中存放的是字符'0',周圍是8個(gè)數(shù)字,所以-8*'0'才能返回雷數(shù)的int值,為了把數(shù)字也能打印出來(lái),所以+‘0',否則打印的是數(shù)字作為的ASCLL碼的值,最終的結(jié)果為-7*‘0'.

6.mine函數(shù)

int main()
{
 int quit = 0;
 int select = 0;
 while (!quit){
  Menu();
  printf("請(qǐng)輸入 ");
  scanf("%d", &select);
  switch (select){
  case 1:
   Game();
   break;
  case 0:
   quit = 1;
   break;
  default:
   printf("輸入錯(cuò)誤,請(qǐng)重試!\n");
   break;
  }
 }

 printf("byebye!\n");

 system("pause");
 return 0;
}

四、總代碼

#ifndef __Test_H__
#define __Test_H__

#include<stdio.h>
#include<Windows.h>
#include <stdlib.h>
#include <time.h>
#define WHAT '*'
#define NUM  20
#define COL  10
#define ROW  10
void Game();
#pragma warning(disable:4996)
#endif       //以上都是頭文件

int main()
{
 int quit = 0;
 int select = 0;
 while (!quit){
  Menu();
  printf("請(qǐng)輸入 ");
  scanf("%d", &select);
  switch (select){
  case 1:
   Game();
   break;
  case 0:
   quit = 1;
   break;
  default:
   printf("輸入錯(cuò)誤,請(qǐng)重試!\n");
   break;
  }
 }

 printf("byebye!\n");

 system("pause");
 return 0;
}


void Game()
{
 srand((unsigned long)time(NULL)); //生成隨機(jī)數(shù)種子

 char show_board[ROW][COL];   
 char mines_board[ROW][COL];

 memset(show_board, WHAT, sizeof(show_board));
 memset(mines_board, '0', sizeof(mines_board));

 SetMines(mines_board, ROW, COL);

 int count = (ROW - 2)*(COL - 2) - NUM;    //若掃完這些次 不觸雷則勝利

 while (count){
  system("cls");
  ShowBoard(show_board, ROW, COL);
  printf("請(qǐng)選擇你要掃描的區(qū)域坐標(biāo) ");
  int x = 0;
  int y = 0;
  scanf("%d %d", &x, &y);
  if (x < 1 || x > ROW-2 || y < 1 || y > COL-2){ //非法性輸入判斷
   printf("輸入錯(cuò)誤!\n");
   continue;
  }
  if (show_board[x][y] != WHAT){           
   printf("此處已經(jīng)被掃過(guò)了,請(qǐng)從新輸出\n");
   continue;
  }
  if (mines_board[x][y] == '1'){
   system("cls");
   ShowBoard(mines_board, ROW, COL);
   printf("踩雷了!游戲結(jié)束!\n");
   break;
  }
  
  show_board[x][y] = CountMines(mines_board, x, y);
  count--;
 }
}


CountMines(char board[][COL], int x, int y){ //統(tǒng)計(jì)周圍雷的個(gè)數(shù)
 return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + \
  board[x][y + 1] + board[x + 1][y + 1] + board[x + 1][y] + \
  board[x + 1][y - 1] + board[x][y - 1] - 7 * '0';//本來(lái)減八個(gè)零,但是整形轉(zhuǎn)字符加一個(gè)‘0'
}

void ShowBoard(char board[][COL], int row, int col){//掃雷展示面板
 printf("     ");
 for (int i = 1; i <= (col - 2); i++){
  printf("%d   ", i);
 }
 printf("\n");
 ShowLine(col);//顯示行線
 for (int i = 1; i <= (row - 2); i++){
  printf("%-3d|", i);
  for (int j = 1; j <= (col - 2); j++){
   printf(" %c |", board[i][j]); 
  }
  printf("\n");
  ShowLine(col);
 }
}

oid SetMines(char board[][COL], int row, int col){ //放雷函數(shù)
 int count = NUM;
 while (count){
  int x = rand() % (row - 2) + 1;
  int y = rand() % (col - 2) + 1;
  if (board[x][y] == '0'){
   board[x][y] = '1';
   count--;
  }
 }
}
void ShowLine(int col){

 for (int i = 0; i <= (col - 2); i++){
  printf("----");
 }
 printf("\n");
}

Menu(){   //用戶交互函數(shù)
 printf("########################\n");
 printf("# 1. Play       0.Exit #\n");
 printf("########################\n");
}

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

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(73.矩陣賦零)

    C++實(shí)現(xiàn)LeetCode(73.矩陣賦零)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(73.矩陣賦零),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C/C++實(shí)現(xiàn)對(duì)STORM運(yùn)行信息查看及控制的方法

    C/C++實(shí)現(xiàn)對(duì)STORM運(yùn)行信息查看及控制的方法

    這篇文章主要介紹了C/C++實(shí)現(xiàn)對(duì)STORM運(yùn)行信息查看及控制的方法,需要的朋友可以參考下
    2014-07-07
  • C++針對(duì)bmp格式解析實(shí)例

    C++針對(duì)bmp格式解析實(shí)例

    這篇文章主要介紹了C++針對(duì)bmp格式解析實(shí)例,設(shè)計(jì)CWnd框架的使用及位圖的操作,需要的朋友可以參考下
    2014-10-10
  • 一篇文章帶你了解論C語(yǔ)言中算法的重要性

    一篇文章帶你了解論C語(yǔ)言中算法的重要性

    最近一直在學(xué)數(shù)據(jù)結(jié)構(gòu)與算法,深深的感受到我們學(xué)習(xí)語(yǔ)言,永遠(yuǎn)都只是一項(xiàng)工具,方法才是其中最重要的部分。這篇文章我將會(huì)通過(guò)幾個(gè)例子來(lái)說(shuō)明算法,也就是寫程序的思路在程序中的重要意義
    2021-08-08
  • C++泛型模板約束深入講解

    C++泛型模板約束深入講解

    C/C++ 作為 C# 語(yǔ)言的前置版本,ECMA工業(yè)化編程語(yǔ)言,自然是存在 “泛型模板約束” 的功能的,只是本文不以 C/C++ 20 新語(yǔ)法搞出來(lái)的 “requires” 關(guān)鍵字來(lái)實(shí)現(xiàn),它很難用
    2022-09-09
  • C++基于Boost.Asio實(shí)現(xiàn)端口映射器的過(guò)程詳解

    C++基于Boost.Asio實(shí)現(xiàn)端口映射器的過(guò)程詳解

    Boost.Asio 是一個(gè)功能強(qiáng)大的 C++ 庫(kù),用于異步編程和網(wǎng)絡(luò)編程,它提供了跨平臺(tái)的異步 I/O 操作,在這篇文章中,我們將深入分析一個(gè)使用 Boost.Asio 實(shí)現(xiàn)的簡(jiǎn)單端口映射服務(wù)器,文中有詳細(xì)的代碼講解,需要的朋友可以參考下
    2023-11-11
  • 講解C++編程中Address-of運(yùn)算符&的作用及用法

    講解C++編程中Address-of運(yùn)算符&的作用及用法

    這篇文章主要介紹了C++編程中Address-of運(yùn)算符&的作用及用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01
  • C++實(shí)現(xiàn)簡(jiǎn)單的圖書管理系統(tǒng)

    C++實(shí)現(xiàn)簡(jiǎn)單的圖書管理系統(tǒng)

    本文給大家分享的是使用C++實(shí)現(xiàn)簡(jiǎn)單的圖書管理系統(tǒng)的代碼,本系統(tǒng)采用了面向?qū)ο蟮某绦蛟O(shè)計(jì)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-08-08
  • Visual Studio Code上添加小程序自動(dòng)補(bǔ)全插件的操作方法

    Visual Studio Code上添加小程序自動(dòng)補(bǔ)全插件的操作方法

    這篇文章主要介紹了Visual Studio Code上添加小程序自動(dòng)補(bǔ)全插件的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 淺析C++中的函數(shù)重載

    淺析C++中的函數(shù)重載

    這篇文章主要介紹了淺析C++中的函數(shù)重載,在C++中,可以為兩個(gè)或兩個(gè)以上的函數(shù)提供相同的函數(shù)名稱,只要參數(shù)類型不同,或者參數(shù)類型相同而參數(shù)個(gè)數(shù)不同,又或者參數(shù)類型參數(shù)個(gè)數(shù)相同,參數(shù)次序不同,稱為函數(shù)重載,需要的朋友可以參考下
    2023-08-08

最新評(píng)論

峨边| 洛浦县| 石门县| 庆阳市| 藁城市| 汶上县| 葵青区| 尉氏县| 新绛县| 赤峰市| 云梦县| 札达县| 遂昌县| 城固县| 体育| 舒兰市| 苍溪县| 根河市| 沙田区| 连平县| 富源县| 军事| 正宁县| 竹溪县| 沛县| 翁牛特旗| 永丰县| 天门市| 正阳县| 泰兴市| 大安市| 青浦区| 雷州市| 文山县| 汝城县| 兴义市| 西乌| 松滋市| 石渠县| 漳州市| 临汾市|