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

使用C語(yǔ)言實(shí)現(xiàn)掃雷游戲

 更新時(shí)間:2022年08月03日 13:19:53   作者:7昂7.  
這篇文章主要為大家詳細(xì)介紹了使用C語(yǔ)言實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

一、游戲介紹

掃雷游戲是在一個(gè)指定的二維空間里,隨機(jī)布置雷,把不是雷的位置都找出來(lái),在你點(diǎn)一個(gè)位置的時(shí)候它會(huì)顯示它周圍全部雷的個(gè)數(shù),根據(jù)這個(gè)線索去找 ,會(huì)更容易贏。

二、實(shí)現(xiàn)模塊

文件名                作用
clear_mine.h      三子棋的函數(shù)聲明,頭文件聲明等
clear_mine.c      三子棋函數(shù)接口的實(shí)現(xiàn)
main.c               三子棋函數(shù)測(cè)試功能

三、實(shí)現(xiàn)原理

1、用兩個(gè)2維數(shù)組保存掃雷信息,一個(gè)用來(lái)設(shè)置雷,另一個(gè)用來(lái)展示看不見(jiàn)的雷,并把周圍的雷的個(gè)數(shù)統(tǒng)計(jì)出來(lái)展示。
2、也就是當(dāng)在排查雷輸入坐標(biāo)的時(shí)候要使用這個(gè)兩個(gè)數(shù)組,這個(gè)坐標(biāo)位置在設(shè)置雷的數(shù)組里面如果不是雷,就統(tǒng)計(jì)它周圍雷個(gè)數(shù)放在另一個(gè)數(shù)組里面進(jìn)行顯示。直到我們排查排查 ROW乘COL-雷個(gè)數(shù)次,即可勝利
3、這里面最重要的怎樣在方格位置上是顯示個(gè)數(shù),用字符是最方便的,不是雷的初始化為字符0,是雷放字符置為1。當(dāng)一個(gè)位置上不是雷把他周圍8個(gè)的字符加起來(lái)-去8*字符0就是有多少個(gè)雷的個(gè)數(shù)。再把雷的個(gè)數(shù)轉(zhuǎn)化為字符放在可視化數(shù)字里面顯示,只需要個(gè)數(shù)加上字符0即可。

四、實(shí)現(xiàn)邏輯

(一)、創(chuàng)建menu菜單函數(shù)

void menu()
{
?? ?printf("########### ?1、游戲開(kāi)始 ##########\n");
?? ?printf("########### ?2、退出 ? ##############\n");
}

(二)、用switch語(yǔ)句去創(chuàng)建game游戲開(kāi)始函數(shù)和退出功能

void game()
{
?? ?//用2個(gè)棋盤即兩個(gè)2維數(shù)組,一個(gè)進(jìn)行放雷另一個(gè)進(jìn)行展示棋盤信息
?? ?char mine[ROWS][COLS] = { 0 };
?? ?char show[ROWS][COLS] = { 0 };
?? ?Init(mine,ROWS,COLS,'0');//先把放雷的數(shù)組初始化為字符0
?? ?Init(show,ROWS, COLS, '*');//再把棋盤信息初始化為字符*
?? ?set_mine(mine, ROW, COL );//放置雷
?? ?show1(show, ROW, COL);//展示棋盤信息
?? ?clear_mine(mine, show, ROW, COL);//排查雷
}
int main()
{
?? ?int insert = 0;
?? ?srand((unsigned int)time(NULL));
?? ?do{
?? ??? ?menu();
?? ??? ?printf("請(qǐng)選擇:");
?? ??? ?scanf("%d", &insert);
?? ??? ?switch (insert)
?? ??? ?{
?? ??? ?case 1:
?? ??? ??? ?game();
?? ??? ??? ?break;
?? ??? ?case 2:
?? ??? ??? ?printf("退出游戲");
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?printf("請(qǐng)重新輸入");
?? ??? ??? ?break;
?? ??? ?}

?? ?} while (insert);
}

(三)、在void game()函數(shù)里面創(chuàng)建上層調(diào)用框架

(1)、初始化棋盤并可視化棋盤

1、創(chuàng)建兩個(gè)數(shù)組一個(gè)mine數(shù)組,一個(gè)是show數(shù)組并初始化,把它們分別置為字符0和字符*。然后創(chuàng)建一個(gè)打印棋盤函數(shù)以便呈現(xiàn)我們眼前。我們先調(diào)用Init和show1函數(shù)來(lái)看一下打印效果。
2、需要注意的是我們用二維數(shù)組打印兩個(gè)棋盤,我們就是要打印9x9的棋盤?答案不是,因?yàn)槲覀冊(cè)谠O(shè)計(jì)算法時(shí)需要統(tǒng)計(jì)坐標(biāo)周圍8個(gè)方位的個(gè)數(shù),假如要統(tǒng)計(jì)邊界周圍雷的個(gè)數(shù),那么就會(huì)有數(shù)組越界的問(wèn)題,那么我們就需要在9×9的基礎(chǔ)上加2,這些元素我們不打印,心里有數(shù)就行。

void Init(char a[][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++)
?? ??? ?{
?? ??? ??? ?a[i][j] = set;
?? ??? ?}
?? ?}
}
void show1(char a[][COLS], int row, int col)
{
?? ?int i = 0;
?? ?int j = 0;
?? ?for (j = 0; j <col+1; j++)
?? ?{
?? ??? ?printf("%d ", j);
?? ?}
?? ?printf("\n");
?? ?for (i = 1; i < row+1; i++)
?? ?{
?? ??? ?printf("%d ", i);
?? ??? ?for (j= 1; j <col+1; j++)
?? ??? ?{
?? ??? ??? ?printf("%c ", a[i][j]);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}
;
}

(2)、設(shè)置雷

這一步我門要去設(shè)置雷,就在剛剛我們初始化的mine數(shù)組里面去放隨機(jī)雷,這個(gè)雷我們可以指定大小 我們定義宏,以便可以方便改。當(dāng)然我們要現(xiàn)在測(cè)試函數(shù)main里面設(shè)置一個(gè)隨機(jī)數(shù)生成器。然后再set_mine函數(shù)設(shè)置rand函數(shù)生成隨機(jī)坐標(biāo)。我們雷置為字符1,以便我更好計(jì)算。如圖代碼:

void set_mine(char mine[][COLS], int row, int col)
{
?? ?int i = 0;
?? ?int j = 0;
?? ?int x = 0;
?? ?int y = 0;
?? ?int count = mine_count;//雷的個(gè)數(shù)
?? ?while (count)
?? ?{
?? ??? ?x = rand() % row + 1;//生成一到0的數(shù)
?? ??? ?y = rand() % col + 1;
?? ??? ?if (mine[x][y] == '0')
?? ??? ?{
?? ??? ??? ?mine[x][y] = '1';
?? ??? ??? ?count--;
?? ??? ?}
?? ?}
?? ??? ?
}

(3)、展示棋盤信息

展示棋盤信息是剛才我們初始化的show函數(shù)里面 放的都是字符*,在這里就調(diào)用一次來(lái)開(kāi)始玩游戲,進(jìn)行第一次掃雷。
如圖效果:

(4)、排查雷

1、這一步是游戲的核心,進(jìn)行排查雷,要輸入坐標(biāo)就要先考慮它的合法性。
2、要要考慮他是否被排查過(guò) 也就是去重性。
3、在進(jìn)行判斷這個(gè)坐標(biāo)在mine數(shù)組里面是否是字符1,如果是游戲結(jié)束,反之則把他周圍的雷數(shù)統(tǒng)計(jì)出來(lái)給show數(shù)組,再調(diào)用show1來(lái)顯示。
4、最一步判斷排雷是否成功,只要排了ROW*COL-雷個(gè)數(shù)次,說(shuō)明排雷成功。

void clear_mine(char ?mine[][COLS], char show[][COLS], int row, int col)
{
?? ?int x = 0;
?? ?int y = 0;
?? ?int count = 0;
?? ?while (count = row*col - mine_count)
?? ?{
?? ??? ?printf("請(qǐng)輸入坐標(biāo):");
?? ??? ?scanf("%d %d", &x, &y);
?? ??? ?if (x >= 1&& x <= row && y >= 1 && y <= col)
?? ??? ?{
?? ??? ??? ?if (show[x][y] == '*')
?? ??? ??? ?{
?? ??? ??? ??? ?if (mine[x][y] != '1')
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?int count1 = 0;
?? ??? ??? ??? ??? ?count1 = round_mineCount(mine, x, y);
?? ??? ??? ??? ??? ?show[x][y] = count1 + '0';
?? ??? ??? ??? ??? ?show1(show, row, col);
?? ??? ??? ??? ??? ?count--;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?printf("踩到雷,游戲結(jié)束\n");
?? ??? ??? ??? ??? ?show1(mine, row, col);
?? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?printf("已經(jīng)被排查\n");
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?printf("坐標(biāo)非法,請(qǐng)重新輸入\n");
?? ??? ?}
?? ??? ?if (count == 0)
?? ??? ?{
?? ??? ??? ?printf("排雷成功");
?? ??? ??? ?show1(mine, row, col);
?? ??? ?}
?? ?}
}
//t統(tǒng)計(jì)雷的個(gè)數(shù),八個(gè)方向
int round_mineCount(char mine[][COLS],int x,int y)
{
?? ?return ?( mine[x - 1][y] + mine[x + 1][y] +
?? ??? ?mine[x][y - 1] + mine[x][y + 1] +
?? ??? ?mine[x - 1][y - 1] + mine[x - 1][y + 1]
?? ??? ?+ mine[x + 1][y - 1] + mine[x + 1][y + 1]-8*'0');
}

五、全部代碼

main.c

#include"clear_mine.h"
void menu()
{
?? ?printf("########### ?1、游戲開(kāi)始 ##########\n");
?? ?printf("########### ?2、退出 ? ##############\n");
}
void game()
{
?? ?//用2個(gè)棋盤即兩個(gè)2維數(shù)組,一個(gè)進(jìn)行放雷另一個(gè)進(jìn)行展示棋盤信息
?? ?char mine[ROWS][COLS] = { 0 };
?? ?char show[ROWS][COLS] = { 0 };
?? ?Init(mine,ROWS,COLS,'0');//先把放雷的數(shù)組初始化為字符0
?? ?Init(show,ROWS, COLS, '*');//再把棋盤信息初始化為字符*
?? ?set_mine(mine, ROW, COL );//放置雷
?? ?show1(show, ROW, COL);//展示棋盤信息
?? ?clear_mine(mine, show, ROW, COL);//排查雷
}
int main()
{
?? ?int insert = 0;
?? ?srand((unsigned int)time(NULL));
?? ?do{
?? ??? ?menu();
?? ??? ?printf("請(qǐng)選擇:");
?? ??? ?scanf("%d", &insert);
?? ??? ?switch (insert)
?? ??? ?{
?? ??? ?case 1:
?? ??? ??? ?game();
?? ??? ??? ?break;
?? ??? ?case 2:
?? ??? ??? ?printf("退出游戲");
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?printf("請(qǐng)重新輸入");
?? ??? ??? ?break;
?? ??? ?}

?? ?} while (insert);
}

clear_mine.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_count 10//設(shè)置雷的個(gè)數(shù)
#define count2 row*col-Count
void Init(char a[][COLS], int rows,int cols, char set);//初始化棋盤
void set_mine(char mine[][COLS], int row, int col);//設(shè)置雷
void show1(char a[][COLS], int row, int col);//展示棋盤信息
void clear_mine(char mine[][COLS], char show[][COLS], int row, int col);// 排查雷
int ?round_mineCount(char mine[][COLS], int row, int col);//統(tǒng)計(jì)一個(gè)位置周圍的雷的個(gè)數(shù)

clear_mine.c

#include"clear_mine.h"
void Init(char a[][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++)
?? ??? ?{
?? ??? ??? ?a[i][j] = set;
?? ??? ?}
?? ?}
}
void show1(char a[][COLS], int row, int col)
{
?? ?int i = 0;
?? ?int j = 0;
?? ?for (j = 0; j <col+1; j++)
?? ?{
?? ??? ?printf("%d ", j);
?? ?}
?? ?printf("\n");
?? ?for (i = 1; i < row+1; i++)
?? ?{
?? ??? ?printf("%d ", i);
?? ??? ?for (j= 1; j <col+1; j++)
?? ??? ?{
?? ??? ??? ?printf("%c ", a[i][j]);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}
;
}
void set_mine(char mine[][COLS], int row, int col)
{
?? ?int i = 0;
?? ?int j = 0;
?? ?int x = 0;
?? ?int y = 0;
?? ?int count = mine_count;
?? ?while (count)
?? ?{
?? ??? ?x = rand() % row + 1;
?? ??? ?y = rand() % col + 1;
?? ??? ?if (mine[x][y] == '0')
?? ??? ?{
?? ??? ??? ?mine[x][y] = '1';
?? ??? ??? ?count--;
?? ??? ?}
?? ?}
?? ??? ?
}
void clear_mine(char ?mine[][COLS], char show[][COLS], int row, int col)
{
?? ?int x = 0;
?? ?int y = 0;
?? ?int count = 0;
?? ?while (count = row*col - mine_count)
?? ?{
?? ??? ?printf("請(qǐng)輸入坐標(biāo):");
?? ??? ?scanf("%d %d", &x, &y);
?? ??? ?if (x >= 1&& x <= row && y >= 1 && y <= col)
?? ??? ?{
?? ??? ??? ?if (show[x][y] == '*')
?? ??? ??? ?{
?? ??? ??? ??? ?if (mine[x][y] != '1')
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?int count1 = 0;
?? ??? ??? ??? ??? ?count1 = round_mineCount(mine, x, y);
?? ??? ??? ??? ??? ?show[x][y] = count1 + '0';
?? ??? ??? ??? ??? ?show1(show, row, col);
?? ??? ??? ??? ??? ?count--;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?printf("踩到雷,游戲結(jié)束\n");
?? ??? ??? ??? ??? ?show1(mine, row, col);
?? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?printf("已經(jīng)被排查\n");
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?printf("坐標(biāo)非法,請(qǐng)重新輸入\n");
?? ??? ?}
?? ??? ?if (count == 0)
?? ??? ?{
?? ??? ??? ?printf("排雷成功");
?? ??? ??? ?show1(mine, row, col);
?? ??? ?}
?? ?}
}
int round_mineCount(char mine[][COLS],int x,int y)
{
?? ?return ?( mine[x - 1][y] + mine[x + 1][y] +
?? ??? ?mine[x][y - 1] + mine[x][y + 1] +
?? ??? ?mine[x - 1][y - 1] + mine[x - 1][y + 1]
?? ??? ?+ mine[x + 1][y - 1] + mine[x + 1][y + 1]-8*'0');
}

六、運(yùn)行結(jié)果

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

相關(guān)文章

  • C++利用EasyX編寫貪吃蛇游戲的示例代碼

    C++利用EasyX編寫貪吃蛇游戲的示例代碼

    EasyX, 全名EasyX Graphics Library, 是針對(duì) Visual C++ 的免費(fèi)繪圖庫(kù),本文將為大家介紹如何使用EasyX編寫貪吃蛇游戲,需要的小伙伴可以參考下
    2023-08-08
  • C++實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng)的示例代碼

    C++實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng)的示例代碼

    停車場(chǎng)管理系統(tǒng)就是模擬停車場(chǎng)進(jìn)行車輛管理的系統(tǒng),該系統(tǒng)分為汽車信息模塊,用戶使用模塊和管理員用戶模塊,本文將用C++實(shí)現(xiàn)這一簡(jiǎn)單的系統(tǒng),希望對(duì)大家有所幫助
    2023-04-04
  • 使用C語(yǔ)言實(shí)現(xiàn)五子棋游戲

    使用C語(yǔ)言實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了使用C語(yǔ)言實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++ 深入淺出探索模板

    C++ 深入淺出探索模板

    人們需要編寫多個(gè)形式和功能都相似的函數(shù),因此有了函數(shù)模板來(lái)減少重復(fù)勞動(dòng);人們也需要編寫多個(gè)形式和功能都相似的類,于是 C++ 引人了類模板的概念,編譯器從類模板可以自動(dòng)生成多個(gè)類,避免了程序員的重復(fù)勞動(dòng)
    2022-04-04
  • C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹(shù)的實(shí)現(xiàn)方法

    C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹(shù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹(shù)的實(shí)現(xiàn)方法,簡(jiǎn)單說(shuō)明了哈夫曼樹(shù)的原理,并結(jié)合具體實(shí)例形式分析了C++實(shí)現(xiàn)哈夫曼樹(shù)的相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • C++常見(jiàn)獲取隨機(jī)數(shù)的方法小結(jié)

    C++常見(jiàn)獲取隨機(jī)數(shù)的方法小結(jié)

    這篇文章主要介紹了C++常見(jiàn)獲取隨機(jī)數(shù)的方法,結(jié)合實(shí)例形式總結(jié)分析了C++獲取隨機(jī)數(shù)的幾種常見(jiàn)方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-05-05
  • matlab遺傳算法求解車間調(diào)度問(wèn)題分析及實(shí)現(xiàn)源碼

    matlab遺傳算法求解車間調(diào)度問(wèn)題分析及實(shí)現(xiàn)源碼

    這篇文章主要為大家介紹了matlab遺傳算法求解車間調(diào)度問(wèn)題解析,文中附含詳細(xì)實(shí)現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • C++實(shí)現(xiàn)單例模式的方法

    C++實(shí)現(xiàn)單例模式的方法

    這篇文章主要為大家介紹了C++實(shí)現(xiàn)單例模式的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C語(yǔ)言實(shí)現(xiàn)井字棋游戲(人機(jī)對(duì)弈)

    C語(yǔ)言實(shí)現(xiàn)井字棋游戲(人機(jī)對(duì)弈)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)井字棋人機(jī)對(duì)弈游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語(yǔ)言中基礎(chǔ)小問(wèn)題詳細(xì)介紹

    C語(yǔ)言中基礎(chǔ)小問(wèn)題詳細(xì)介紹

    這篇文章詳細(xì)介紹了C語(yǔ)言中基礎(chǔ)小問(wèn)題,有需要的朋友可以參考一下
    2013-10-10

最新評(píng)論

襄城县| 旬邑县| 仁化县| 健康| 贺州市| 新巴尔虎右旗| 新丰县| 多伦县| 临清市| 阳高县| 襄樊市| 会同县| 郧西县| 晋中市| 库伦旗| 石泉县| 永川市| 黎川县| 探索| 青河县| 南郑县| 蓬安县| 万盛区| 射洪县| 阳谷县| 原平市| 巴南区| 合作市| 饶平县| 临漳县| 星子县| 岳普湖县| 定襄县| 蓝山县| 泽库县| 将乐县| 阳曲县| 池州市| 洱源县| 玉树县| 宁波市|