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

用C語言簡單實現(xiàn)掃雷小游戲

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

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

設(shè)計思路

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

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

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

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

首先,我們設(shè)計一個簡單的主函數(shù)

方便玩家自由選擇進入游戲與退出游戲

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

菜單我們可以自由設(shè)計,這里是我設(shè)計的一個簡單菜單:

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

敲重點 

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

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); 
}

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

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

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

當然不等于了,想什么呢小伙子?。?!

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

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

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

接下來就是對數(shù)組進行初始化

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");
}

隨機放雷

void SetMine(char board[ROWS][COLS], int row, int col)
{
 int count = EASY_COUNT;
 while (count)
 {
  int x = rand() % row + 1;//+1可以保證每一個位置都能隨機放雷
  int y = rand() % col + 1;
  if (board[x][y] == '0')//在沒有放過雷的位置放雷
  {
   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("請輸入要排查的坐標>\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("輸入不合法,請重新輸入>\n");
  }
 }
 if (win == row * col - EASY_COUNT)//判斷是否排雷成功
 {
  printf("恭喜您,排雷成功\n");
  DisplayBoard(mine, ROWS, COLS);
 }
}

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

下面是三個整體代碼

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("請輸入要排查的坐標>\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("輸入不合法,請重新輸入>\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("請選擇>\n");
  scanf("%d", &input);
  switch (input)
  {case 1: 
   game();
   break;
  case 0:
   break;
  default:
   printf("輸入錯誤,重新輸入>\n");
    break;
  } 
 } while (input);

}

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    C生萬物C語言宏將整數(shù)二進制位的奇偶數(shù)位交換

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

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

    下面小編就為大家?guī)硪黄樞蚓€性表的代碼實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • C++直接cout指針名的含義?

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

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

最新評論