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

用C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)掃雷小游戲

 更新時(shí)間:2021年08月03日 08:39:41   作者:長(zhǎng)路不漫漫  
這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

設(shè)計(jì)思路

1. 定義兩個(gè)二維數(shù)組,一個(gè)存放炸彈信息,一個(gè)隱藏信息后向玩家展示。

2. 玩家每一次選擇都要判斷是否踩到炸彈,如果踩雷,將結(jié)束游戲,否則繼續(xù)游戲。

3.玩家每一次判斷后要將新棋盤展示給玩家,且將該位置附近雷的個(gè)數(shù)展示出來(lái)。

4.最后如果玩家找到所有非雷區(qū)時(shí),玩家獲勝。

首先,我們?cè)O(shè)計(jì)一個(gè)簡(jiǎn)單的主函數(shù)

方便玩家自由選擇進(jìn)入游戲與退出游戲

int main()
{
 int input = 0;
    srand((unsigned int)time(NULL));//隨機(jī)數(shù)用于隨機(jī)存放炸彈
 do 
 {
  menu();//打印菜單
  printf("請(qǐng)選擇>\n");
  scanf("%d", &input);
  switch (input)
  {case 1:
   game();
   break;
  case 0:
   break;
  default:
   printf("輸入錯(cuò)誤,重新輸入>\n");
    break;
  } 
 } while (input);
}

菜單我們可以自由設(shè)計(jì),這里是我設(shè)計(jì)的一個(gè)簡(jiǎn)單菜單:

void menu()
{
 printf("******************************\n");
 printf("********** 1. play  **********\n");
 printf("********** 0. exit  **********\n");
 printf("******************************\n");
}

敲重點(diǎn) 

接下來(lái)就開始了我們最關(guān)鍵的部分:游戲函數(shù)設(shè)計(jì)

void game()
{
 char mine[ROWS][COLS] = { 0 };//存放雷的信息
 char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息
 InitBoard(mine, ROWS, COLS, '0');//初始化棋盤
 InitBoard(show, ROWS, COLS, '*');//
 DisplayBoard(show, ROWS, COLS);
 //布置雷
 SetMine(mine, ROW, COL); 
  //排查雷
  FindMine(mine,show,ROW,COL); 
}

這里我們定義了兩個(gè)二維數(shù)組,mine和show,其中mine用于我們儲(chǔ)存炸彈的信息,而show則用于向玩家展示游戲棋盤

一開始我們要考慮我們的棋盤大小與數(shù)組大小的關(guān)系

棋盤的大小就等于我們創(chuàng)建的數(shù)組大小嗎? 等于嗎?啊哈?

當(dāng)然不等于了,想什么呢小伙子?。?!

我們可是要考慮每一個(gè)位置周圍的炸彈數(shù)量的,你讓我最外層的怎么辦!

于是我們定義了以下幾個(gè)常數(shù)用于定義棋盤的長(zhǎng)度寬度,還有多了一圈的數(shù)組

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2

接下來(lái)就是對(duì)數(shù)組進(jìn)行初始化

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
 int i = 0;
 int j = 0;
 for (i = 0; i < rows; i++)
 {
  for (j = 0; j < cols; j++)
  {
   board[i][j] = set;
  }
 }
}

打印數(shù)組(展示棋盤)

void DisplayBoard(char board[ROWS][COLS], int rows, int cols)
{
 int i = 0;
 int j = 0;
 printf("----------------------------\n");
 printf( "%d ", j);
 for (i = 1; i < rows - 1; i++)
 {
  printf(" %d ", i);
 }
 printf("\n");
 for (i = 1; i < rows - 1; i++)  
 {
  printf("%d ", i); 
  for (j = 1; j < cols - 1; j++)
  { 
   printf(" %c ", board[i][j]);
  }
  printf("\n");
 }
 printf("----------------------------\n");
}

隨機(jī)放雷

void SetMine(char board[ROWS][COLS], int row, int col)
{
 int count = EASY_COUNT;
 while (count)
 {
  int x = rand() % row + 1;//+1可以保證每一個(gè)位置都能隨機(jī)放雷
  int y = rand() % col + 1;
  if (board[x][y] == '0')//在沒(méi)有放過(guò)雷的位置放雷
  {
   board[x][y] = '1';
   count--;
  }
 }
}

排雷函數(shù)

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
 return mine[x-1][y]+mine[x+1][y]+
  mine[x-1][y-1]+mine[x][y-1]+mine[x+1][y-1]+
  mine[x-1][y+1]+mine[x][y+1]+mine[x+1][y+1]-
  8*'0';
}
 
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
 int x = 0;
 int y = 0;
 int win = 0;
 while (win<row*col-EASY_COUNT)
 {
  printf("請(qǐng)輸入要排查的坐標(biāo)>\n");
  scanf("%d%d", &x, &y);
  if(x>=1&&x<=row&&y>=1&&y<=col)
  {
   if (mine[x][y] == '0')//保證每一次都在新的位置
   {
    int count = GetMineCount(mine,  x,  y);
    show[x][y] = count+'0';//以字符形式
    DisplayBoard(show, ROWS, COLS);
    win++;
   }
   else
   {
    printf("很遺憾,踩到雷了\n");
    DisplayBoard(mine,ROWS,COLS);//向玩家展示所有雷的位置
    break;
   }  
  }
  else
  {
   printf("輸入不合法,請(qǐng)重新輸入>\n");
  }
 }
 if (win == row * col - EASY_COUNT)//判斷是否排雷成功
 {
  printf("恭喜您,排雷成功\n");
  DisplayBoard(mine, ROWS, COLS);
 }
}

至此我們的掃雷小游戲就制作完成了,可以進(jìn)行愉快的游戲啦!

下面是三個(gè)整體代碼

1.   game.h

#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
#include<stdio.h>
//初始化棋盤
void InitBoard(char board[ROWS][COLS], int  rows, int cols,  char set);
//顯示棋盤
void DisplayBoard(char board[ROWS][COLS], int rows, int cols);
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char mine[ROW][COL], char show[ROW][COL], int rows, int cols);

2.   game.c

#define _CRT_SECURE_NO_WARNINGS 
#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
 int i = 0;
 int j = 0;
 for (i = 0; i < rows; i++)
 {
  for (j = 0; j < cols; j++)
  {
   board[i][j] = set;
  }
 }
}
void DisplayBoard(char board[ROWS][COLS], int rows, int cols)
{
 int i = 0;
 int j = 0;
 printf("----------------------------\n");
 printf( "%d ", j);
 for (i = 1; i < rows - 1; i++)
 {
  printf(" %d ", i);
 }
 printf("\n");
 for (i = 1; i < rows - 1; i++)  
 {
  printf("%d ", i); 
  for (j = 1; j < cols - 1; j++)
  { 
   printf(" %c ", board[i][j]);
  }
  printf("\n");
 }
 printf("----------------------------\n");
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
 int count = EASY_COUNT;
 while (count)
 {
  int x = rand() % row + 1;
  int y = rand() % col + 1;
  if (board[x][y] == '0')
  {
   board[x][y] = '1';
   count--;
  }
 }
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
 return mine[x-1][y]+mine[x+1][y]+
  mine[x-1][y-1]+mine[x][y-1]+mine[x+1][y-1]+
  mine[x-1][y+1]+mine[x][y+1]+mine[x+1][y+1]-
  8*'0';
}
 
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
 int x = 0;
 int y = 0;
 int win = 0;
 while (win<row*col-EASY_COUNT)
 {
  printf("請(qǐng)輸入要排查的坐標(biāo)>\n");
  scanf("%d%d", &x, &y);
  if(x>=1&&x<=row&&y>=1&&y<=col)
  {
   if (mine[x][y] == '0')
   {
    int count = GetMineCount(mine,  x,  y);
    show[x][y] = count+'0';
    DisplayBoard(show, ROWS, COLS);
    win++;
   }
   else
   {
    printf("很遺憾,踩到雷了\n");
    DisplayBoard(mine,ROWS,COLS);
    break;
   }  
  }
  else
  {
   printf("輸入不合法,請(qǐng)重新輸入>\n");
  }
 }
 if (win == row * col - EASY_COUNT)
 {
  printf("恭喜您,排雷成功\n");
  DisplayBoard(mine, ROWS, COLS);
 }
}

3.  test.c

#define _CRT_SECURE_NO_WARNINGS 
#include"game.h"
void menu()
{
 printf("******************************\n");
 printf("********** 1. play  **********\n");
 printf("********** 0. exit  **********\n");
 printf("******************************\n");
}
void game()
{
 char mine[ROWS][COLS] = { 0 };//存放雷的信息
 char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息
 InitBoard(mine, ROWS, COLS, '0');//初始化棋盤
 InitBoard(show, ROWS, COLS, '*');//
 DisplayBoard(show, ROWS, COLS);
 //布置雷
 SetMine(mine, ROW, COL); 
 DisplayBoard(mine, ROWS, COLS);
  //排查雷
  FindMine(mine,show,ROW,COL); 
}
 
int main()
{
 int input = 0;
 srand((unsigned int)time(NULL));
 do 
 {
  menu();
  printf("請(qǐng)選擇>\n");
  scanf("%d", &input);
  switch (input)
  {case 1: 
   game();
   break;
  case 0:
   break;
  default:
   printf("輸入錯(cuò)誤,重新輸入>\n");
    break;
  } 
 } while (input);

}

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

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)順序表的全操作詳解

    C語(yǔ)言實(shí)現(xiàn)順序表的全操作詳解

    順序表,全名順序存儲(chǔ)結(jié)構(gòu),是線性表的一種,線性表用于存儲(chǔ)邏輯關(guān)系為“一對(duì)一”的數(shù)據(jù),順序表自然也不例外,不僅如此,順序表對(duì)數(shù)據(jù)的物理存儲(chǔ)結(jié)構(gòu)也有要求,跟隨下文來(lái)具體了解吧
    2022-04-04
  • 利用Qt+opencv實(shí)現(xiàn)視頻分解為圖片

    利用Qt+opencv實(shí)現(xiàn)視頻分解為圖片

    這篇文章主要為大家詳細(xì)介紹了如何利用Qt和opencv實(shí)現(xiàn)視頻分解為圖片,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • 解析C++編程中異常相關(guān)的堆棧展開和throw()異常規(guī)范

    解析C++編程中異常相關(guān)的堆棧展開和throw()異常規(guī)范

    這篇文章主要介紹了C++編程中異常相關(guān)的堆棧展開和throw()異常規(guī)范,throw()規(guī)范部分文中結(jié)合了C++11標(biāo)準(zhǔn)的新特性來(lái)講,需要的朋友可以參考下
    2016-01-01
  • 數(shù)據(jù)結(jié)構(gòu)之AVL樹詳解

    數(shù)據(jù)結(jié)構(gòu)之AVL樹詳解

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之AVL樹詳解,本文非常細(xì)致的講解了AVL樹的基礎(chǔ)知識(shí)、AVL樹的旋轉(zhuǎn)操作、AVL數(shù)的插入和刪除操作等,需要的朋友可以參考下
    2014-08-08
  • Conan中的C/C++的依賴管理

    Conan中的C/C++的依賴管理

    C/C++與Java、Python都有庫(kù)依賴問(wèn)題,但是C/C++語(yǔ)言沒(méi)有自帶的包管理機(jī)制,也許是因?yàn)镃/C++更多的應(yīng)用于系統(tǒng)程序領(lǐng)域,Java、Python更多用于應(yīng)用程序領(lǐng)域,對(duì)快速開發(fā)和部署要求更高,今天通過(guò)本文給大家介紹Conan中的C/C++的依賴管理,感興趣的朋友一起看看吧
    2023-01-01
  • Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)數(shù)據(jù)打印到紙張

    Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)數(shù)據(jù)打印到紙張

    關(guān)于Qt打印內(nèi)容到紙張,網(wǎng)上的辦法非常多,比如有些直接用painter繪制,逐步控制分頁(yè)打印。本文介紹的方法則是將內(nèi)容作為html設(shè)置到文檔對(duì)象,再調(diào)用文檔對(duì)象的print方法傳入QPrinter對(duì)象打印,感興趣的同學(xué)可以了解一下
    2022-01-01
  • Qt中Tab與Tree組件實(shí)現(xiàn)分頁(yè)菜單

    Qt中Tab與Tree組件實(shí)現(xiàn)分頁(yè)菜單

    本文主要介紹tabWidget選擇夾組件與TreeWidget樹形選擇組件的常用方法及靈活運(yùn)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • C生萬(wàn)物C語(yǔ)言宏將整數(shù)二進(jìn)制位的奇偶數(shù)位交換

    C生萬(wàn)物C語(yǔ)言宏將整數(shù)二進(jìn)制位的奇偶數(shù)位交換

    這篇文章主要為大家介紹了C生萬(wàn)物C語(yǔ)言使用宏將整數(shù)二進(jìn)制位的奇偶數(shù)位交換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 順序線性表的代碼實(shí)現(xiàn)方法

    順序線性表的代碼實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇順序線性表的代碼實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • C++直接cout指針名的含義?

    C++直接cout指針名的含義?

    今天小編就為大家分享一篇關(guān)于C++直接cout指針名的含義?,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04

最新評(píng)論