中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么利用C語言實現簡易版掃雷

發布時間:2021-02-19 11:45:14 來源:億速云 閱讀:138 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關怎么利用C語言實現簡易版掃雷,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

首先我們要構建好雷盤的樣子,我們理所當然想到利用二維數組。那么請注意:因為我們每一次隨機生成的雷盤不能展示給用戶,所以顯示盤與雷盤要分開,那么我們在這里要用到兩個二維數組。一個是雷盤,用來記錄隨機生成雷的布局,另一個是顯示盤,初始化全為*,讓用戶來掃雷。

怎么利用C語言實現簡易版掃雷

具體功能:

  • 先由電腦隨機生成雷的分布。

  • 玩家通過輸入坐標來選擇點。

  • 玩家選擇對應點后,對應點將顯示周圍雷的個數(以該點為中心的一個九宮格)。

  • 玩家需要根據這個個數,自己推斷出有雷的地方,不能輸入有雷的對應坐標,只能輸入沒雷的對應坐標。

  • 當輸入坐標對應點有雷時,炸“死”,游戲結束。當剩下未選中的點的個數等于總共布下的雷的個數時,游戲勝利。

實現功能的函數:

1.菜單函數,必不可少,是展示給用戶的第一界面,這個比較簡陋,后期可以考慮做一些fashion一點的。

void Menu()
{
 printf("##########################\n");
 printf("#####choose 1 to play#####\n");
 printf("#####choose 0 to exit#####\n");
 printf("Please input your select here:>\n");
}

2.隨機生成雷函數,那么對應雷的橫豎坐標就是需要隨機生成的數。如果大家看過我之前的三子棋就知道,在這里關于隨機生成用到了函數GetIndex,算是一個小優化。

void SetMine(char mine_board[][COL], int row, int col)
{
 srand((unsigned long)time(NULL));
 int mine_num = MINES;
 while (mine_num)
 {
 int i_index = GetIndex(1,col-2);//生成1~10的隨機數
 int j_index = GetIndex(1,col-2);
 if (mine_board[i_index][j_index] == '0')
 {
 mine_board[i_index][j_index] = '1';
 mine_num--;
 }
 }
}

3.GetIndex函數,這里要注意start和end表示的是生成的隨機數的范圍。之前我們 如果用rand生成0~10的隨機數,就直接rand%10,但是如果是5 ~10呢?所以我們用(end-start+1)得到的是0 ~end的范圍,再加一個start,就能到到start ~end的范圍。

static int GetIndex(int start, int end)//static修飾 代表該函數只能在本文件內部使用
{
 return rand() % (end - start + 1) + start;
}

4.得到一個點周圍雷的數量函數,這里要注意,我寫的這個函數的返回值是整型,但得到的mine_board的和是字符型,那么要通過8-'0'來轉換一下。

int GetMineNum(char mine_board[][COL], int i, int j)
{
 return mine_board[i-1][j-1]+mine_board[i-1][j]+ mine_board[i-1][j+1]+ \
 mine_board[i][j-1]+ mine_board[i][j+1]+ \
 mine_board[i+1][j-1]+mine_board[i+1][j]+ mine_board[i+1][j+1]-8*'0';//整型
}

5.顯示雷盤函數

void ShowBoard(char show_board[][COL], int row, int col)
{
 int i = 0;
 int j = 0;
 printf(" ");
 for (i = 1; i <= col-2; i++)
 {
 printf("%d ", i);
 }
 printf("\n");
 for (i = 1; i <= col - 1; i++)
 {
 printf("----");
 }
 printf("\n");
 for (i = 1; i <=row - 2; i++)
 {
 printf("%-2d|", i);
 for (j = 1; j <=col - 2; j++)
 {
 printf(" %c |", show_board[i][j]);
 }
 printf("\n");
 int k = 1;
 for (k = 1; k <= col - 1; k++)
 {
 printf("----");
 }
 printf("\n");
 }
}

6.進行游戲函數,以total作為一個衡量標準。輸入坐標,判斷是否為雷的位置,是則游戲結束,不是則總的方塊數減1,繼續輸入坐標。

void PlayGame(char show_board[][COL], char mine_board[][COL], int row, int col)
{
 int i = 0;
 int j = 0;
 int total = (ROW - 2)*(COL - 2);
 while (1)
 {
 ShowBoard(show_board, row, col);
 printf("Please enter your pos<x,y>");
 scanf("%d%d", &i, &j);
 if (i >= 1 && i < row - 2 && j >= 1 && j < col - 2)
 {
 if (mine_board[i][j] == '0')
 {
 int num = GetMineNum(mine_board, i, j);
 show_board[i][j] = num + '0';
 total--;
 }
 else
 {
 ShowBoard(mine_board, row, col);
 printf("Game over!you lose!:(\n");
 break;
 }
 }
 else
 {
 printf("Error!Try again!\n");
 continue;
 }
 if (total == MINES)
 {
 printf("You win:)!\n");
 break;
 }
 }
}

7.Game函數,初始化兩個盤,主要調用了前面的函數,對函數的一個整合,來貫穿一下整個流程。

void Game()
{
 char show_board[ROW][COL];
 char mine_board[ROW][COL];
 memset(show_board, '*', sizeof(show_board));
 memset(mine_board, '0', sizeof(mine_board));

 SetMine(mine_board, ROW, COL);
 PlayGame(show_board, mine_board, ROW, COL);
}

這里還是采用了文件的形式,分為函數聲明,函數定義,主函數。

函數聲明 Mine.h

#ifndef _MINE_H_
#define _MINE_H_

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

#define ROW 12
#define COL 12
#define MINES 20
void Menu();
void Game();
int GetIndex(int start, int end);
void SetMine(char mine_board[][COL], int row, int col);
int GetMineNum(char mine_board[][COL], int i, int j);
void ShowBoard(char show_board[][COL], int row, int col);
void PlayGame(char show_board[][COL], char mine_board[][COL], int row, int col);
#endif

函數定義 Mine.c

#include"Mine.h"

void Menu()
{
 printf("##########################\n");
 printf("#####choose 1 to play#####\n");
 printf("#####choose 0 to exit#####\n");
 printf("Please input your select here:>\n");
}

static int GetIndex(int start, int end)//static修飾 代表該函數只能在本文件內部使用
{
 return rand() % (end - start + 1) + start;
}

//隨機生成雷
void SetMine(char mine_board[][COL], int row, int col)
{
 srand((unsigned long)time(NULL));
 int mine_num = MINES;
 while (mine_num)
 {
 int i_index = GetIndex(1,col-2);
 int j_index = GetIndex(1,col-2);
 if (mine_board[i_index][j_index] == '0')
 {
 mine_board[i_index][j_index] = '1';
 mine_num--;
 }
 }
}
//得到一個點周圍雷的數量
int GetMineNum(char mine_board[][COL], int i, int j)
{
 return mine_board[i-1][j-1]+mine_board[i-1][j]+ mine_board[i-1][j+1]+ \
 mine_board[i][j-1]+ mine_board[i][j+1]+ \
 mine_board[i+1][j-1]+mine_board[i+1][j]+ mine_board[i+1][j+1]-8*'0';//整型
} 
//顯示雷盤
void ShowBoard(char show_board[][COL], int row, int col)
{
 int i = 0;
 int j = 0;
 printf(" ");
 for (i = 1; i <= col-2; i++)
 {
 printf("%d ", i);
 }
 printf("\n");
 for (i = 1; i <= col - 1; i++)
 {
 printf("----");
 }
 printf("\n");
 for (i = 1; i <=row - 2; i++)
 {
 printf("%-2d|", i);
 for (j = 1; j <=col - 2; j++)
 {
 printf(" %c |", show_board[i][j]);
 }
 printf("\n");
 int k = 1;
 for (k = 1; k <= col - 1; k++)
 {
 printf("----");
 }
 printf("\n");
 }
}
void PlayGame(char show_board[][COL], char mine_board[][COL], int row, int col)
{
 int i = 0;
 int j = 0;
 int total = (ROW - 2)*(COL - 2);
 while (1)
 {
 ShowBoard(show_board, row, col);
 printf("Please enter your pos<x,y>");
 scanf("%d%d", &i, &j);
 if (i >= 1 && i < row - 2 && j >= 1 && j < col - 2)
 {
 if (mine_board[i][j] == '0')
 {
 int num = GetMineNum(mine_board, i, j);
 show_board[i][j] = num + '0';
 total--;
 }
 else
 {
 ShowBoard(mine_board, row, col);
 printf("Game over!you lose!:(\n");
 break;
 }
 }
 else
 {
 printf("Error!Try again!\n");
 continue;
 }
 if (total == MINES)
 {
 printf("You win:)!\n");
 break;
 }
 }
}
void Game()
{
 char show_board[ROW][COL];
 char mine_board[ROW][COL];
 memset(show_board, '*', sizeof(show_board));
 memset(mine_board, '0', sizeof(mine_board));

 SetMine(mine_board, ROW, COL);
 PlayGame(show_board, mine_board, ROW, COL);
}

主函數 main.c

#include"Mine.h"

int main()
{
 int select = 0;
 int quit = 0;
 while (!quit)
 {
 Menu();
 scanf("%d", &select);
 switch (select)
 {
 case 1:
 Game();
 break;
 case 0:
 printf("OK,byebye!\n");
 quit = 1;
 break;
 default:
 printf("Error!input again!\n");
 break;
 }
 }
 system("pause");
 return 0;
}

運行展示界面:

怎么利用C語言實現簡易版掃雷

怎么利用C語言實現簡易版掃雷

關于“怎么利用C語言實現簡易版掃雷”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

咸阳市| 崇信县| 五常市| 和林格尔县| 桐城市| 监利县| 江西省| 枣强县| 浠水县| 鹿泉市| 益阳市| 喀喇沁旗| 澎湖县| 德钦县| 广西| 黄冈市| 延川县| 清水河县| 松溪县| 苏尼特左旗| 宾阳县| 吴忠市| 文水县| 德化县| 文登市| 肇州县| 河北区| 安新县| 乌拉特前旗| 新源县| 若尔盖县| 永顺县| 大宁县| 凤山市| 潜山县| 高雄市| 宜都市| 温泉县| 浮山县| 宜丰县| 德格县|