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

C語言實(shí)現(xiàn)掃雷游戲的方法

 更新時(shí)間:2022年06月07日 14:39:01   作者:Jan_ssen  
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)掃雷游戲的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

相信大家對(duì)掃雷一定都不陌生吧!但是你敢信僅僅使用一些C語言的初階基礎(chǔ)知識(shí)就能夠制作一個(gè)掃雷簡(jiǎn)單小游戲?今天,我將帶領(lǐng)大家一起走進(jìn)掃雷,探究其基礎(chǔ)算法奧秘。

一、基本思路

首先,既然是玩游戲,我們應(yīng)該設(shè)計(jì)相應(yīng)的菜單。

輸入1后繼續(xù)讓玩家選擇游戲難度:

我們?cè)谶@里設(shè)計(jì)簡(jiǎn)單模式為6x6大小的面板,雷埋10個(gè);中等模式為10x10大小的面板,雷埋30個(gè);困難模式為14x14大小的面板,雷埋50個(gè)。

為了方便雷的布置與顯示,我們?cè)O(shè)計(jì)了兩張面板:show_board[ROW][COL]和mine_board[ROW][COL],其中show面板負(fù)責(zé)顯示“空格”,mine面板負(fù)責(zé)記錄周圍雷的個(gè)數(shù)。

玩家通過輸入每個(gè)格子所對(duì)應(yīng)的坐標(biāo)進(jìn)行掃雷操作。

char** show_board = (char**)malloc(sizeof(char*) * (ROW + grade * 4));//二維數(shù)組動(dòng)態(tài)內(nèi)存分配
?
for (int i = 0; i < ROW + grade * 4; i++) {
?? ?show_board[i] = (char*)malloc(sizeof(char) * (COL + grade * 4));
?? ?memset(show_board[i], ' ', (COL + grade * 4));//數(shù)組全部賦值為空格
}
?
char** mine_board = (char**)malloc(sizeof(char*) * (ROW + grade * 4));
?
for (int i = 0; i < ROW + grade * 4; i++) {
?? ?mine_board[i] = (char*)malloc(sizeof(char) * (COL + grade * 4));
?? ?memset(mine_board[i], '0', (COL + grade * 4));//數(shù)組全部賦值為‘0'
}?

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

Step1.畫圖

想要進(jìn)行掃雷游戲,首先應(yīng)該有掃雷界面的設(shè)計(jì),如下:

我們建立Showboard函數(shù)進(jìn)行面板的基本繪制:

static void Showboard(char **board,int grade)//面板制作
{
?? ?printf(" ");
?? ?for (int i = 1; i <= ROW-2+4*grade; i++) {
?? ??? ?printf(" %3d", i);
?? ?}
?? ?printf("\n");
?
?? ?for (int i = 1; i <= ROW-2+4*grade; i++){
?? ??? ?printf(" ? ");
?? ??? ?for (int k = 1; k <= COL-2+4*grade; k++) {
?? ??? ??? ?printf("----");
?? ??? ?}
?? ??? ?printf("\n");
?? ??? ?printf("%2d|",i);
?? ??? ?for (int j = 1; j <= COL-2+4*grade; j++){
?? ??? ??? ?printf(" %c |",board[i][j]);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}
?? ?printf(" ? ");
?? ?for (int k = 1; k <= COL-2+4*grade; k++) {
?? ??? ?printf("----");
?? ?}
?? ?printf("\n");
}

成果圖如下:

Step2. 埋雷

埋雷應(yīng)做到一下幾點(diǎn):

1.展示面板show_board(這里傳參后以形參board替代)賦值為1(BOOM宏定義為1) ;

2.為了提高用戶體驗(yàn),在被炸后能夠展示出雷的位置,我們又建立了一個(gè)lei_board數(shù)組用來顯示,并在埋雷時(shí)將對(duì)應(yīng)位置賦值為'*';

3.埋雷要具有隨機(jī)性,所以這里引用rand函數(shù)(主函數(shù)要種隨機(jī)數(shù)種子);

static void SetMines(char **board,char **lei_board,int grade)
{
?? ?int i = 1;
?? ?int x, y;
?? ?while (i <= NUM+grade*20) {
?? ??? ?x = rand() % (ROW-2+4*grade) + 1;
?? ??? ?y = rand() % (COL-2+4*grade) + 1;
?? ??? ?if (board[x][y] != BOOM) {
?? ??? ??? ?board[x][y] = BOOM;
?? ??? ??? ?lei_board[x][y] = '*';
?? ??? ??? ?i++;
?? ??? ?}
?? ?}
}

Step3.計(jì)算周圍雷的個(gè)數(shù)

當(dāng)我們計(jì)算周圍雷的個(gè)數(shù)時(shí),自然而然地就會(huì)想到統(tǒng)計(jì)周圍九宮格的雷的個(gè)數(shù)。如果要搜索的位置在面板中間,這很簡(jiǎn)單,但如果是以下這類情況,比如頂點(diǎn)格或者邊格怎么辦?如何知道該算哪個(gè)格?

 為了避免這種特殊情況所帶來的問題,我們不如直接在外面再套一圈,對(duì)于各類面板(即二維數(shù)組)的建立也直接按照增大的來,這樣就無需討論邊角的特殊性了。

統(tǒng)計(jì)函數(shù)直接通過簡(jiǎn)單的函數(shù)返回來實(shí)現(xiàn):

static int CountMine(char **board,int x,int y)
{
?? ?return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + \
?? ??? ?board[x][y - 1] + board[x][y + 1] + board[x + 1][y - 1] + \
?? ??? ?board[x + 1][y] + board[x + 1][y + 1] - 8 * '0';
}

三、完整代碼

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
?
#define BOOM '1'
#define ROW 8
#define COL 8
#define NUM 10
?
static void SetMines(char **board,char **lei_board,int grade)//埋雷
{
?? ?int i = 1;
?? ?int x, y;
?? ?while (i <= NUM+grade*20) {
?? ??? ?x = rand() % (ROW-2+4*grade) + 1;
?? ??? ?y = rand() % (COL-2+4*grade) + 1;
?? ??? ?if (board[x][y] != BOOM) {
?? ??? ??? ?board[x][y] = BOOM;
?? ??? ??? ?lei_board[x][y] = '*';
?? ??? ??? ?i++;
?? ??? ?}
?? ?}
}
static void Showboard(char **board,int grade)//面板制作
{
?? ?printf(" ");
?? ?for (int i = 1; i <= ROW-2+4*grade; i++) {
?? ??? ?printf(" %3d", i);
?? ?}
?? ?printf("\n");
?
?? ?for (int i = 1; i <= ROW-2+4*grade; i++){
?? ??? ?printf(" ? ");
?? ??? ?for (int k = 1; k <= COL-2+4*grade; k++) {
?? ??? ??? ?printf("----");
?? ??? ?}
?? ??? ?printf("\n");
?? ??? ?printf("%2d|",i);
?? ??? ?for (int j = 1; j <= COL-2+4*grade; j++){
?? ??? ??? ?printf(" %c |",board[i][j]);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}
?? ?printf(" ? ");
?? ?for (int k = 1; k <= COL-2+4*grade; k++) {
?? ??? ?printf("----");
?? ?}
?? ?printf("\n");
}
static int CountMine(char **board,int x,int y)//統(tǒng)計(jì)周圍雷的數(shù)目
{
?? ?return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + \
?? ??? ?board[x][y - 1] + board[x][y + 1] + board[x + 1][y - 1] + \
?? ??? ?board[x + 1][y] + board[x + 1][y + 1] - 8 * '0';
}
?
void Game(int grade)//游戲函數(shù),grade為游戲難度等級(jí)
{
?? ?
?? ?char** show_board = (char**)malloc(sizeof(char*) * (ROW + grade * 4));
?? ?for (int i = 0; i < ROW + grade * 4; i++) {
?? ??? ?show_board[i] = (char*)malloc(sizeof(char) * (COL + grade * 4));
?? ??? ?memset(show_board[i], ' ', (COL + grade * 4));
?? ?}
?? ?char** mine_board = (char**)malloc(sizeof(char*) * (ROW + grade * 4));
?? ?for (int i = 0; i < ROW + grade * 4; i++) {
?? ??? ?mine_board[i] = (char*)malloc(sizeof(char) * (COL + grade * 4));
?? ??? ?memset(mine_board[i], '0', (COL + grade * 4));
?? ?}
?? ?char** lei_board = (char**)malloc(sizeof(char*) * (ROW + grade * 4));
?? ?for (int i = 0; i < ROW + grade * 4; i++) {
?? ??? ?lei_board[i] = (char*)malloc(sizeof(char) * (COL + grade * 4));
?? ??? ?memset(lei_board[i], ' ', (COL + grade * 4));
?? ?}
?? ?
?? ?SetMines(mine_board,lei_board,grade);
?? ?int x = 0, y = 0;
?? ?int total = 0;
?? ?while (1)
?? ?{
?? ??? ?
?? ??? ?Showboard(show_board, grade);
?? ??? ?printf("請(qǐng)輸入坐標(biāo):");
?? ??? ?//printf("%d", '*');
?? ??? ?scanf("%d %d", &x, &y);
?? ??? ?if (!(x > 0 && x <= ROW + 4 * grade - 2 && y > 0 && y <= COL + 4 * grade - 2)) {
?? ??? ??? ?printf("掃雷的位置有問題!\n");
?? ??? ??? ?continue;
?? ??? ?}
?? ??? ?if (show_board[x][y] != ' ') {
?? ??? ??? ?printf("該位置已經(jīng)掃過了!\n");
?? ??? ??? ?continue;
?? ??? ?}
?? ??? ?if (mine_board[x][y] == '1') {
?? ??? ??? ?printf("對(duì)不起,你被炸死了!\n");
?? ??? ??? ?Showboard(lei_board, grade);
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?else {
?? ??? ??? ?int count = CountMine(mine_board, x, y);
?? ??? ??? ?show_board[x][y] = count + '0';
?? ??? ??? ?total++;
?? ??? ??? ?system("cls");
?? ??? ?}
?? ??? ?if ((ROW - 2) * (COL - 2) - total <= NUM) {
?? ??? ??? ?printf("恭喜你,游戲通過!\n");
?? ??? ??? ?break;
?? ??? ?}
?? ?}
?? ?for (int i = 0; i < ROW + grade * 4; i++) {
?? ??? ?free(show_board[i]);
?? ?}
?? ?free(show_board);
?? ?for (int i = 0; i < ROW + grade * 4; i++) {
?? ??? ?free(mine_board[i]);
?? ?}
?? ?free(mine_board);
?? ?for (int i = 0; i < ROW + grade * 4; i++) {
?? ??? ?free(lei_board[i]);
?? ?}
?? ?free(lei_board);
}
?
void Menu()
{
?? ?printf("#########################################\n");
?? ?printf("## ? ? ? ? ? ? ? ? 1.play ? ? ? ? ? ? ?##\n");
?? ?printf("## ? ? ? ? ? ? ? ? 0.exit ? ? ? ? ? ? ?##\n");
?? ?printf("#########################################\n");
}
?
int main()
{
?? ?srand((unsigned long)time(NULL));
?? ?int quit = 0;
?? ?while (!quit)
?? ?{
?? ??? ?int select;
?? ??? ?Menu();
?? ??? ?printf("請(qǐng)輸入游戲選項(xiàng):");
?? ??? ?scanf("%d", &select);
?? ??? ?switch (select)
?? ??? ?{
?? ??? ?case 1:
?? ??? ??? ?printf("#########################################\n");
?? ??? ??? ?printf("## ? ? ? ? ? ? ? ? 1.easy ? ? ? ? ? ? ?##\n");
?? ??? ??? ?printf("## ? ? ? ? ? ? ? ? 2.middle ? ? ? ? ? ?##\n");
?? ??? ??? ?printf("## ? ? ? ? ? ? ? ? 3.difficult ? ? ? ? ##\n");
?? ??? ??? ?printf("#########################################\n");
?? ??? ??? ?printf("請(qǐng)輸入游戲難度:");
?? ??? ??? ?scanf("%d", &select);
?? ??? ??? ?switch (select)
?? ??? ??? ?{
?? ??? ??? ?case 1:
?? ??? ??? ??? ?Game(0);
?? ??? ??? ??? ?break;
?? ??? ??? ?case 2:
?? ??? ??? ??? ?Game(1);
?? ??? ??? ??? ?break;
?? ??? ??? ?case 3:
?? ??? ??? ??? ?Game(2);
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ??? ?break;
?? ??? ?case 0:
?? ??? ??? ?quit = 1;
?? ??? ??? ?printf("感謝使用!");
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?printf("輸入有誤,請(qǐng)重新輸入!\n");
?? ??? ??? ?break;
?? ??? ?}
?
?? ?}
?? ?
}

期待大家在這個(gè)代碼的基礎(chǔ)上加入更多創(chuàng)新與改進(jìn),寫出用戶體驗(yàn)感更好,更加智能高端的掃雷程序!

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

相關(guān)文章

  • C++中 set的用法

    C++中 set的用法

    這篇文章主要介紹了C++中 set的用法,set的內(nèi)部使用了紅黑樹對(duì)所有的元素進(jìn)行了排序。在樹結(jié)構(gòu)當(dāng)中,我們通常使用的都是<key, value>的形式。下面我們來看看該內(nèi)容的具體情況,需要的朋友也可以參考一下
    2021-11-11
  • 構(gòu)造函數(shù)定義為private或者protected的好處

    構(gòu)造函數(shù)定義為private或者protected的好處

    從語法上來講,一個(gè)函數(shù)被聲明為protected或者private,那么這個(gè)函數(shù)就不能從“外部”直接被調(diào)用了。對(duì)于protected的函數(shù),子類的“內(nèi)部”的其他函數(shù)可以調(diào)用之。而對(duì)于private的函數(shù),只能被本類“內(nèi)部”的其他函數(shù)說調(diào)用
    2013-10-10
  • C語言中#define在多行宏定義出錯(cuò)的原因及分析

    C語言中#define在多行宏定義出錯(cuò)的原因及分析

    這篇文章主要介紹了C語言中#define在多行宏定義出錯(cuò)的原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • MySQL的C語言API接口

    MySQL的C語言API接口

    這篇文章主要介紹了MySQL的C語言API接口,需要的朋友可以參考下
    2015-08-08
  • C++中new和delete匹配使用過程詳解

    C++中new和delete匹配使用過程詳解

    關(guān)于 new 和 delete 的使用相信大家并不陌生,可是為什么使用 new 的時(shí)候要用 delete,使用 new[] 的時(shí)候又要用 delete[]呢?本文就來和大家詳細(xì)說說
    2023-02-02
  • C語言控制臺(tái)版2048小游戲

    C語言控制臺(tái)版2048小游戲

    本文給大家分享的是2則使用C語言控制臺(tái)編寫的2048小游戲,各有優(yōu)劣,小伙伴們對(duì)比著參考下吧。
    2015-03-03
  • C語言結(jié)構(gòu)體簡(jiǎn)單入門講解

    C語言結(jié)構(gòu)體簡(jiǎn)單入門講解

    這篇文章主要介紹了C語言結(jié)構(gòu)體簡(jiǎn)單入門講解,本文講述了結(jié)構(gòu)體的基本定義和操作,講解了幾個(gè)比較實(shí)用的函數(shù)和案例,希望對(duì)你有所幫助
    2021-06-06
  • 如何應(yīng)用C++的函數(shù)對(duì)象

    如何應(yīng)用C++的函數(shù)對(duì)象

    C++函數(shù)對(duì)象是C語言程序的主要組成部分,一個(gè)函數(shù)可以調(diào)用其他函數(shù)。在設(shè)計(jì)良好的程序中,每個(gè)函數(shù)都有特定的目的。本文將介紹C++函數(shù)對(duì)象的應(yīng)用,有需要的可以參考學(xué)習(xí)。
    2016-08-08
  • 最新評(píng)論

    龙岩市| 金堂县| 布尔津县| 九龙坡区| 米泉市| 台前县| 关岭| 芮城县| 宜兴市| 宣城市| 本溪市| 曲靖市| 韶关市| 芒康县| 林州市| 九台市| 安宁市| 杭州市| 潼关县| 兴宁市| 阿巴嘎旗| 达州市| 东山县| 逊克县| 金平| 武宁县| 宜城市| 通江县| 四子王旗| 张家港市| 临夏县| 子洲县| 务川| 县级市| 延安市| 永泰县| 安新县| 囊谦县| 宜川县| 乌鲁木齐市| 大理市|