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

C語言輕松實現(xiàn)掃雷小游戲

 更新時間:2022年08月03日 16:48:00   作者:我要上岸~  
掃雷是一款經(jīng)典的小游戲,這篇文章主要為大家詳細介紹了C語言輕松實現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

掃雷是一款經(jīng)典的小游戲,那么如何用c語言來實現(xiàn)呢?下面我將帶你搞定掃雷小游戲。

注:本此游戲所用到的文件與上篇三子棋類似,最后附有代碼展示。

1.游戲設計邏輯

1.布置雷—10個

2.掃雷

輸入坐標;

如果是雷—就炸死了,游戲結(jié)束;

 如果不是雷—就告訴你這個坐標周圍8個坐標上總共有多少個雷;

直到把所有非雷區(qū)的位置全部找到,游戲結(jié)束,掃雷成功。

2.游戲思考及實現(xiàn)過程 

2.1符號與棋盤的建立

我們就拿9*9的棋盤來舉例,那么這樣我們就需要用一個字符型的二維數(shù)組來實現(xiàn)。這當中要用到兩個字符數(shù)組的想法是實現(xiàn)邏輯不想那么麻煩。只是想一個mine數(shù)組打印布置好的雷的信息,一個show數(shù)組打印排查出雷的信息。 

‘1’- 雷,‘0’- 非雷 用‘*’- 已排查的位置,數(shù)字字符來表示未排查的位置。

在數(shù)字字符顯示的周圍8個坐標上,如果是靠近邊緣的位置,有的坐標則會超出坐標范圍,會發(fā)生數(shù)組越界的現(xiàn)象。我們所要寫的是一個9*9的棋盤,那么我們就將行列各自加一,成為11*11的棋盤我們只用中間的9*9的棋盤。那么我們的數(shù)組就要變成這樣了。

在game.h中宏定義二維數(shù)組的行列。 

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

創(chuàng)建二維數(shù)組,也就是掃雷所需要的棋盤

char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };

2.2棋盤的初始化與打印 

初始化棋盤,我們想要的效果是mine數(shù)組中一開始全是‘0’,show數(shù)組中全是‘*’

函數(shù)的具體實現(xiàn)是在game.c中

init_board(mine, ROWS, COLS,'0');
init_board(show, ROWS, COLS, '*');
void init_board(char arr[][], int rows, int cols, char set)
{
?? ?int i = 0;
?? ?for (i = 0; i < rows; i++)
?? ?{
?? ??? ?int j = 0;
?? ??? ?for (j = 0; j < cols; j++)
?? ??? ?{
?? ??? ??? ?arr[i][j] = set;
?? ??? ?}
?? ?}
}

打印棋盤,我們?nèi)绻胍焖僦老碌奈恢檬悄睦铮梢詫⑿辛刑柦o打印出來,

show_board(mine, ROW, COL);
show_board(show, ROW, COL);
void show_board(char arr[ROWS][COLS], int row, int col)
{
?? ?int i = 0;
?? ?printf("------------掃雷------------\n");
?? ?for (i = 0; i<= col; i++)//打印列號
?? ?{
?? ??? ?printf("%d ", i);
?? ?}
?? ?printf("\n");
?? ?for (i = 1; i <= row; i++)
?? ?{
?? ??? ?printf("%d ",i);//打印行號
?? ??? ?int j = 0;
?? ??? ?for (j = 1; j <=col; j++)
?? ??? ?{
?? ??? ??? ?printf("%c ", arr[i][j]);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}
?? ?printf("------------掃雷------------\n");
}

2.3布置雷

set_mine(mine, ROW, COL);
#define EASY_COUNT 10
void set_mine(char mine[ROWS][COLS], int row, int col)
{
?? ?int x = 0;
?? ?int y = 0;
?? ?int count = EASY_COUNT;
?? ?while (count)
?? ?{
?? ??? ?x = rand() % 9 + 1;
?? ??? ?y = rand() % 9 + 1;
?? ??? ?if (mine[x][y] == '0')
?? ??? ?{
?? ??? ??? ?mine[x][y] = '1';
?? ??? ??? ?count--;
?? ??? ?}
?? ?}
}

使用了一個宏定義常量是為了以后可以為了方便修改。有了方面的打印函數(shù),你可以嘗試著將棋盤打印出來看看,就明白是否把雷給布置好了。

2.4 排查雷并設置結(jié)束標志

排查雷的時候,我們要弄清楚這要用到兩個數(shù)組,我們是將mine數(shù)組中的信息放到show數(shù)組中去,排查是兩個數(shù)組都要涉及到。

find_mine(mine, show, ROW, COL);

因為1’- 雷,‘0’- 非雷,我們要顯示出周圍的雷的數(shù)量,首先要選一個坐標落子,然后在遍歷周圍的八個坐標

我們要知道一件事 ‘1’-‘0’ == 1。這也是為什么我們要用‘1’和‘0’來表示雷的信息,很方便我們排查雷。我們要返回周圍八個坐標的信息,只要將周圍八個坐標的字符(ascll值)加在一起,再減去8*‘0’,即可以得到周圍有幾顆雷的信息了。我們還知道這個游戲我們一共設置10個雷,當我們把所有非雷的位置找到我們就贏了。我用了一個win來標記游戲贏了的狀態(tài)。教你一個游戲測試的方法,我們知道將宏定義常量EASY_COUNT改成80,在布好雷區(qū)后,先將mine數(shù)組打印出來,照著排就可以了,因為這時我們設置了80個雷,只有一個位置沒有雷,我們可以很快地就測試出贏了的結(jié)果。

void find_mine(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("請輸入坐標:>");
?? ??? ?scanf("%d %d", &x, &y);
?
?? ??? ?if (x >= 1 && x <= row && y >= 1 && y <= col)
?? ??? ?{
?? ??? ??? ?if (mine[x][y] == '1')
?? ??? ??? ?{
?? ??? ??? ??? ?printf("你被炸死了\n");
?? ??? ??? ??? ?show_board(mine, ROW, COL);
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?int count = get_mine_count(mine, x, y);
?? ??? ??? ??? ?show[x][y] = count + '0';
?? ??? ??? ??? ?show_board(show, ROW, COL);
?? ??? ??? ??? ?win++;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?printf("坐標非法,請重新輸入\n");
?? ??? ?}
?? ?}
?
?? ?if (win == row * col - EASY_COUNT)
?? ?{
?? ??? ?printf("恭喜你,你贏了\n");
?? ??? ?show_board(mine, ROW, COL);
?? ?}
}
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
?? ?return mine[x - 1][y - 1] +
?? ??? ?mine[x - 1][y] +?
?? ??? ?mine[x - 1][y + 1] +?
?? ??? ?mine[x][y - 1] +?
?? ??? ?mine[x][y + 1] +?
?? ??? ?mine[x + 1][y - 1] +
?? ??? ?mine[x + 1][y] +?
?? ??? ?mine[x + 1][y + 1] - 8 * '0';
}

3.代碼展示 

test.c 

#include "game.h"
?
void menu()
{
?? ?printf("******************\n");
?? ?printf("***** 1.play *****\n");
?? ?printf("***** 0.exit *****\n");
?? ?printf("******************\n");
}
//掃雷游戲的實現(xiàn)
void game()
{
?? ?char mine[ROWS][COLS] = { 0 };
?? ?char show[ROWS][COLS] = { 0 };
?? ?//初始化
?? ?init_board(mine, ROWS, COLS, '0');
?? ?init_board(show, ROWS, COLS, '*');
?
?? ?//打印棋盤
?
?? ?//show_board(show, ROW, COL);
?? ?//?
?? ?//布置雷
?? ?set_mine(mine, ROW, COL);
?? ?//show_board(mine, ROW, COL);
?? ?show_board(show, ROW, COL);
?
?? ?//排查雷
?? ?find_mine(mine, show, ROW, COL);
?
}
?
?
int main()
{
?? ?srand((unsigned int)time(NULL));
?? ?int input = 0;
?? ?do
?? ?{
?? ??? ?menu();
?? ??? ?printf("請輸入:>");
?? ??? ?scanf("%d", &input);
?? ??? ?switch (input)
?? ??? ?{
?? ??? ?case 1:
?? ??? ??? ?game();
?? ??? ??? ?break;
?? ??? ?case 0:
?? ??? ??? ?printf("退出游戲\n");
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?printf("選擇錯誤,重新選擇\n");
?? ??? ??? ?break;
?
?? ??? ?}
?? ?} while (input);
?? ?return 0;
}

game.c

#include "game.h"
//初始化棋盤
void init_board(char arr[ROWS][COLS], int rows, int cols, char set)
{
?? ?int i = 0;
?? ?for (i = 0; i < rows; i++)
?? ?{
?? ??? ?int j = 0;
?? ??? ?for (j = 0; j < cols; j++)
?? ??? ?{
?? ??? ??? ?arr[i][j] = set;
?? ??? ?}
?? ?}
}
//打印棋盤
void show_board(char arr[ROWS][COLS], int row, int col)
{
?? ?int i = 0;
?? ?printf("------------掃雷------------\n");
?? ?for (i = 0; i <= col; i++)//打印列號
?? ?{
?? ??? ?printf("%d ", i);
?? ?}
?? ?printf("\n");
?? ?for (i = 1; i <= row; i++)
?? ?{
?? ??? ?printf("%d ",i);//打印行號
?? ??? ?int j = 0;
?? ??? ?for (j = 1; j <= col; j++)
?? ??? ?{
?? ??? ??? ?printf("%c ", arr[i][j]);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}
?? ?printf("------------掃雷------------\n");
}
?
//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col)
{
?? ?int x = 0;
?? ?int y = 0;
?? ?int count = EASY_COUNT;
?? ?while (count)
?? ?{
?? ??? ?x = rand() % 9 + 1;
?? ??? ?y = rand() % 9 + 1;
?? ??? ?if (mine[x][y] == '0')
?? ??? ?{
?? ??? ??? ?mine[x][y] = '1';
?? ??? ??? ?count--;
?? ??? ?}
?? ?}
}
?
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
?? ?return mine[x - 1][y - 1] +
?? ??? ?mine[x - 1][y] +?
?? ??? ?mine[x - 1][y + 1] +?
?? ??? ?mine[x][y - 1] +?
?? ??? ?mine[x][y + 1] +?
?? ??? ?mine[x + 1][y - 1] +
?? ??? ?mine[x + 1][y] +?
?? ??? ?mine[x + 1][y + 1] - 8 * '0';
}
?
//排查雷
void find_mine(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("請輸入坐標:>");
?? ??? ?scanf("%d %d", &x, &y);
?
?? ??? ?if (x >= 1 && x <= row && y >= 1 && y <= col)
?? ??? ?{
?? ??? ??? ?if (mine[x][y] == '1')
?? ??? ??? ?{
?? ??? ??? ??? ?printf("你被炸死了\n");
?? ??? ??? ??? ?show_board(mine, ROW, COL);
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?int count = get_mine_count(mine, x, y);
?? ??? ??? ??? ?show[x][y] = count + '0';
?? ??? ??? ??? ?show_board(show, ROW, COL);
?? ??? ??? ??? ?win++;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?printf("坐標非法,請重新輸入\n");
?? ??? ?}
?? ?}
?
?? ?if (win == row * col - EASY_COUNT)
?? ?{
?? ??? ?printf("恭喜你,你贏了\n");
?? ??? ?show_board(mine, ROW, COL);
?? ?}
}

game.h

#pragma once
?
#include <stdio.h>
?
#define ROW 9
#define COL 9
?
#define ROWS ROW+2
#define COLS COL+2
?
#define EASY_COUNT 10
?
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char set);
?
//打印棋盤
void show_board(char arr[ROWS][COLS], int row, int col);
?
//布置雷
void set_mine(char arr[ROWS][COLS], int row, int col);
?
//排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

這就是一個簡單的掃雷游戲的實現(xiàn)。

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

相關文章

  • 在C++?Qt中實現(xiàn)異步散列器的代碼示例

    在C++?Qt中實現(xiàn)異步散列器的代碼示例

    在很多工作中,我們需要計算數(shù)據(jù)或者文件的散列值,例如登錄或下載文件,而在?Qt?中,負責這項工作的類為?QCryptographicHash,本文給大家介紹了在C++?Qt中實現(xiàn)異步散列器的代碼示例,需要的朋友可以參考下
    2024-09-09
  • C語言內(nèi)存泄漏常見情況及解決方案詳解

    C語言內(nèi)存泄漏常見情況及解決方案詳解

    這篇文章主要為大家介紹了C語言內(nèi)存泄漏常見情況及解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • C語言結(jié)構(gòu)體成員賦值的深拷貝與淺拷貝詳解

    C語言結(jié)構(gòu)體成員賦值的深拷貝與淺拷貝詳解

    C語言中的淺拷貝是指在拷貝過程中,對于指針型成員變量只拷貝指針本身,而不拷貝指針所指向的目標,它按字節(jié)復制的。深拷貝除了拷貝其成員本身的值之外,還拷貝成員指向的動態(tài)內(nèi)存區(qū)域內(nèi)容。本文將通過示例和大家詳細說說C語言的深拷貝與淺拷貝,希望對你有所幫助
    2022-09-09
  • C語言動態(tài)與靜態(tài)分別實現(xiàn)通訊錄詳細過程

    C語言動態(tài)與靜態(tài)分別實現(xiàn)通訊錄詳細過程

    這篇文章主要為大家介紹了C語言動態(tài)與靜態(tài)分別實現(xiàn)通訊錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 淺談c++ hook 鉤子的使用介紹

    淺談c++ hook 鉤子的使用介紹

    本篇文章主要介紹了淺談c++ hook 鉤子的使用介紹,詳細的介紹了c++ hook 鉤子的原理和運行機制,有興趣的可以了解一下
    2017-11-11
  • C++模擬實現(xiàn)list功能

    C++模擬實現(xiàn)list功能

    list的底層是一個循環(huán)雙向鏈表結(jié)構(gòu),雙向鏈表中每個元素存儲在互不相關的獨立節(jié)點中,在節(jié)點中通過指針指向其前一個元素和后一個元素,接下來通過本文給大家分享C++模擬實現(xiàn)list的示例代碼,需要的朋友可以參考下
    2021-08-08
  • C語言中的結(jié)構(gòu)體的入門學習教程

    C語言中的結(jié)構(gòu)體的入門學習教程

    這篇文章主要介紹了C語言中的結(jié)構(gòu)體的入門學習教程,以struct語句定義的結(jié)構(gòu)體是C語言編程中的重要基礎,需要的朋友可以參考下
    2015-12-12
  • Dijkstra算法與Prim算法的異同案例詳解

    Dijkstra算法與Prim算法的異同案例詳解

    這篇文章主要介紹了Dijkstra算法與Prim算法的異同案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C語言實現(xiàn)二叉樹層次遍歷介紹

    C語言實現(xiàn)二叉樹層次遍歷介紹

    大家好,本篇文章主要講的是C語言實現(xiàn)二叉樹層次遍歷介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C++自定義函數(shù)示例詳解

    C++自定義函數(shù)示例詳解

    在數(shù)學中,函數(shù)是一種基本的數(shù)學對象,它建立了一個集合(稱為定義域)中的每個元素與另一個集合(稱為值域)中的唯一元素之間的對應關系,這篇文章主要介紹了C++自定義函數(shù)示例詳解,需要的朋友可以參考下
    2025-03-03

最新評論

教育| 安义县| 靖江市| 象山县| 棋牌| 武义县| 阳春市| 察雅县| 凤阳县| 白玉县| 达州市| 黔南| 嘉义市| 金昌市| 延长县| 柘城县| 常宁市| 胶南市| 涞水县| 马尔康县| 延长县| 龙口市| 乌苏市| 东明县| 叶城县| 蓬莱市| 施甸县| 嘉兴市| 个旧市| 潍坊市| 遂宁市| 新宾| 双城市| 陵水| 汕头市| 苏尼特左旗| 兰溪市| 伊宁县| 象山县| 万山特区| 天长市|