- 魔王的介紹:??????一名雙非本科大一小白。
- 魔王的目標(biāo):??努力趕上周圍卷王的腳步。
- 魔王的主頁:??????大魔王.??????
?????大魔王與你分享:人生人山人海人來人往,自己自尊自愛自由自在。
一、前言
小時(shí)候我們在家里剛買電腦的時(shí)候,網(wǎng)絡(luò)還不是很發(fā)達(dá)(兩三年紀(jì)吧),每次斷網(wǎng)我們都除了電腦自帶的那一點(diǎn)單機(jī)游戲外沒什么玩的,其中最好玩的便是掃雷,那么你可以用代碼實(shí)現(xiàn)掃雷嗎?這里我們添加了兩個(gè)功能:第一個(gè)是標(biāo)記功能,如果確定為雷我們可以標(biāo)記為!,如果不確定,我們可以標(biāo)記為?,第二個(gè)功能是遞歸展開:我們知道如果我們我們所點(diǎn)的那個(gè)位置一周都不是雷,那么它會(huì)自動(dòng)擴(kuò)開,如果我們點(diǎn)的地方有雷,那么會(huì)顯示出周圍雷的個(gè)數(shù),如果想嘗試玩一下,點(diǎn)擊掃雷可以跳轉(zhuǎn)過去,那么接下來就學(xué)習(xí)以下如何代碼實(shí)現(xiàn)吧!
二、文件介紹
test.c:測試文件
game.c:源文件,進(jìn)行函數(shù)的定義
game.h:頭文件(只進(jìn)行聲明)
我們用測試文件調(diào)用game.h聲明、game.c文件中實(shí)現(xiàn)的函數(shù),這就是三個(gè)文件的關(guān)系。
為了使三者聯(lián)系起來,我們需要讓兩個(gè)源文件(.c)文件都包含頭文件,這樣他們中的函數(shù)就可以一起使用了。
三、代碼實(shí)現(xiàn)
1.創(chuàng)建基本的框架
void menu()
{
printf("************************\n");
printf("******** 1.play ********\n");
printf("******** 0.exit ********\n");
printf("************************\n");
}
void test()
{
int input = 0;
do
{
menu();
printf("請選擇:> ");
scanf("%d", &input);
switch (input)
{
case 1:
printf("開始游戲\n");
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯(cuò)誤,請重新輸入\n");
}
} while (input);
}
int main()
{
test();
return 0;
}
2.#define定義常量
因?yàn)槲覀冊邳c(diǎn)擊一個(gè)位置后如果附近有雷,那么就需要顯示周圍有幾個(gè)雷,所以我們需要訪問這個(gè)位置一周的內(nèi)容,所以如果我們創(chuàng)建的表格大小和玩的時(shí)候打印出來的一樣大,那么當(dāng)訪問邊上那些位置周圍雷的個(gè)數(shù)時(shí),就會(huì)數(shù)組越界,所以我們?nèi)绻?×9雷盤,我們需要讓行和列都寬一個(gè)位置,也就是創(chuàng)建11×11的雷盤,不過打印的話只打印中間的9×9格。所以為了方便我們先定義常量。
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_num 10
3.創(chuàng)建和初始化二維數(shù)組
和三子棋一樣,我們要實(shí)現(xiàn)選中那個(gè)位置出現(xiàn)什么效果,只能是通過二維數(shù)組,讓二位數(shù)組里的元素發(fā)生變化,在玩家視角就是自己操作了這個(gè)地方,我們需要?jiǎng)?chuàng)建兩個(gè)二維數(shù)組,一個(gè)是布置雷區(qū)的二維數(shù)組,只在后臺(tái)存在,并不顯示出來,另一個(gè)則是給玩家展示的二維數(shù)組,至于為什么是兩個(gè),有很多原因,最容易說的就是:總不能把布置的雷展示給玩家吧,這樣還怎么玩,不就開掛了。所以規(guī)定:讓埋雷區(qū)初始化為字符0,展示區(qū)初始化為字符*,字符0是因?yàn)槲覀兿胗靡粋€(gè)函數(shù)來初始化這兩個(gè)雷盤,傳的參數(shù)只需要最后傳的字符不一樣(一個(gè)是字符0,一個(gè)是字符*),其他都是一樣的,所以為了方便之后的操作(兩個(gè)雷盤間的聯(lián)系),我們把兩個(gè)數(shù)組都定義為char類型。
//初始化
void init_board(char board[ROWS][ROWS], int rows, int cols, char a)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = a;
}
}
}
char mine[ROWS][COLS];
char show[ROWS][COLS];
//初始化雷區(qū)
init_board(mine, ROWS,COLS,'0');
//初始化展示區(qū)
init_board(show,ROWS,COLS, '*');
4.埋雷
在上篇智能三子棋博客中已經(jīng)用到了隨機(jī)數(shù)生成函數(shù),點(diǎn)擊智能三子棋可以跳轉(zhuǎn)到該博客,里面有隨機(jī)數(shù)的講解。雷盤里我們初始化的是字符0,我們把埋雷的地方初始化為字符1,到計(jì)算的時(shí)候只需要讓某個(gè)位置一周(8個(gè))的數(shù)字字符相加減去7個(gè)字符0即可得到表示該位置有多少個(gè)雷的數(shù)字字符。
//放雷
void put_mine(char mine[ROWS][COLS], int rows, int cols)
{
int num = 0;
for (num = 0; num < mine_num; num++)
{
while (1)
{
int i = rand() % ROW + 1;
int j = rand() % COL + 1;
if (mine[i][j] == '0')
{
mine[i][j] = '1';
break;
}
}
}
}
//埋雷
put_mine(mine,ROWS, COLS);
5.打印雷盤
做完這些操作,我們就需要讓玩家看到雷盤了,打印的時(shí)候因?yàn)樾信c列比較多,所以我們進(jìn)行了排序,讓玩家一看就知道自己要選擇的地方的坐標(biāo)。
//打印
void print_board(char board[ROWS][COLS], int rows, int cols)
{
int i = 0;
printf(" ");//為了對其每行,因?yàn)槊啃械拈_頭加了下標(biāo),所以要先空出來下標(biāo)所占的位置
for (i = 1; i < cols-1; i++)//打印每列的下標(biāo)
{
printf("%d ", i);
}
printf("\n");
printf(" ");//為了對其每行,因?yàn)槊啃械拈_頭加了下標(biāo),所以要先空出來下標(biāo)所占的位置
for (i = 1; i < cols-1; i++)//讓每列的下標(biāo)和其下面的元素隔開
{
printf("- ");
}
printf("\n");
for (i = 1; i < rows-1; i++)
{
printf("%d| ", i);//標(biāo)記每行
int j = 0;
for (j = 1; j < cols-1; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//打印雷盤
//print_board(mine, ROWS, COLS);//上帝視角,打印雷區(qū)
//printf("\n");
print_board(show, ROWS, COLS);
6.玩家標(biāo)記
顯示出展示區(qū)后玩家就開始下棋了,每次玩家在下棋前,我們都要問是否進(jìn)行標(biāo)記,然后標(biāo)記一次后繼續(xù)問是要標(biāo)記還是要退出標(biāo)記進(jìn)行掃雷。標(biāo)記的時(shí)候我們需要先判斷玩家選擇的位置是否在范圍內(nèi)(1~9),然后還要判斷是否該位置已經(jīng)被掃過了(如果沒被掃過,該位置坐標(biāo)只能是’*‘,’!‘,’?')
//玩家標(biāo)記
void mark_board(char show[ROWS][COLS], int rows, int cols)
{
int flag = 0;
while (1)
{
printf("選擇標(biāo)記方式:按1標(biāo)記為雷(!),按2標(biāo)記為不確定(?),按3取消標(biāo)記(*),選擇4進(jìn)入排雷環(huán)節(jié)\n");
printf("請玩家選擇標(biāo)記方式:> ");
scanf("%d", &flag);
if (flag == 1)
{
int i = 0;
int j = 0;
printf("玩家選擇標(biāo)記位置:> ");
scanf("%d %d", &i, &j);
if (i > 0 && i <= ROW && j > 0 && j <= COL)
{
if (show[i][j] != '*'&&show[i][j]!='?')
{
printf("該位置已經(jīng)掃過或者已經(jīng)被標(biāo)記了該種符號,請重新選擇\n");
continue;
}
show[i][j] = '!';
}
}
else if (flag == 2)
{
int i = 0;
int j = 0;
printf("玩家選擇:> ");
scanf("%d %d", &i, &j);
if (i > 0 && i <= ROW && j > 0 && j <= COL)
{
if (show[i][j] != '*' && show[i][j] != '!')
{
printf("該位置已經(jīng)掃過或者已經(jīng)被標(biāo)記了該種符號,請重新選擇\n");
continue;
}
show[i][j] = '?';
}
}
else if (flag == 3)//取消標(biāo)記,變?yōu)樵瓉淼?
{
int i = 0;
int j = 0;
printf("玩家選擇:> ");
scanf("%d %d", &i, &j);
if (i > 0 && i <= ROW && j > 0 && j <= COL)
{
if (show[i][j] == '?' || show[i][j] == '!')
{
show[i][j] = '*';
}
else
{
printf("該位置已經(jīng)掃過或者已經(jīng)被標(biāo)記了該種符號,請重新選擇\n");
continue;
}
}
}
else if (flag == 4)
return;
else
printf("選擇錯(cuò)誤,請重新選擇\n");
system("cls");
print_board(show, ROWS, COLS);
}
}
mark_board(show, ROWS, COLS);//每次輸入前的標(biāo)記環(huán)節(jié)
7.玩家下棋
因?yàn)橥婕蚁缕搴瓦f歸展開、判斷周圍雷個(gè)數(shù)以及輸贏是連起來的,所以這個(gè)部分比較多。
- 當(dāng)掃的雷的個(gè)數(shù)等于(玩家看到的整個(gè)雷盤的個(gè)數(shù)減去雷的個(gè)數(shù))的時(shí)候,如果程序還沒有結(jié)束(也就是這期間沒被炸死),那么就說明玩家掃雷成功,游戲勝利。
- 玩家在進(jìn)行選擇排雷位置時(shí),選擇的位置需要合理(1~9),然后還需要沒被掃過。
- 當(dāng)玩家選擇的位置一周都沒有雷時(shí),該位置由*變?yōu)榭崭瘢ㄒ簿褪钦f只有這個(gè)位置一周都沒有雷,才變?yōu)榭崭?,并且展開一周,否則變?yōu)橹車椎膫€(gè)數(shù)),并且周圍全部展開(每展開一個(gè)都要讓掃雷的個(gè)數(shù)+1,否則就不能勝利了),然后繼續(xù)判斷,直到附近有雷時(shí),顯示出雷的個(gè)數(shù)。
- 當(dāng)玩家選擇的坐標(biāo)正好是雷時(shí),游戲結(jié)束,掃雷失敗。
- 我們第三個(gè)所提到的展開一片所用到的就是遞歸:當(dāng)我們輸入的坐標(biāo)周圍不是雷時(shí),展開周圍的全部然后再在周圍的這八個(gè)里面依次判斷是否符合,如果符合就變?yōu)榭崭癫⑶依^續(xù)展開一篇,如果周圍有雷,就不再展開,該位置變?yōu)橹車椎膫€(gè)數(shù)。
- 上面的這個(gè)如果不經(jīng)處理就會(huì)導(dǎo)致死循環(huán),因?yàn)槲覀冞x的這個(gè)如果周圍沒雷,就會(huì)展開一片,那么這一片又與我們選的這個(gè)相鄰,那么又會(huì)回去判斷我們選擇的這個(gè)位置,然后就這樣重復(fù),最終會(huì)導(dǎo)致內(nèi)存崩了。所以我們在進(jìn)行遞歸時(shí)加一個(gè)限制條件,它必須是!、?或*才可以,因?yàn)槿绻菙?shù)字字符或空格,說明這個(gè)地方已經(jīng)判斷過了,那么就不能再判斷這個(gè)位置。
判斷周圍雷的個(gè)數(shù)時(shí),因?yàn)槲覀冏罱K想要的是一個(gè)數(shù)字字符形式,所以我們在讓要判斷的這個(gè)位置周圍雷的個(gè)數(shù)時(shí),我們需要讓周圍相加減去7個(gè)字符0,而不是8個(gè)。- 我們在表達(dá)某個(gè)位置一周的坐標(biāo)的時(shí)候,采取的是遍歷法,用兩個(gè)for循環(huán)找到這個(gè)位置一周的坐標(biāo)并判斷他們是顯示數(shù)字還是再展開一片。
- 遞歸展開是根據(jù)安 度 因的掃雷博客自己寫出來的,點(diǎn)擊安度因可以跳轉(zhuǎn)過去。
//周圍雷個(gè)數(shù)
char around_mine(char mine[ROWS][COLS], int i, int j)
{
return mine[i][j - 1] + mine[i][j + 1] + mine[i + 1][j] + mine[i - 1][j] + mine[i - 1][j - 1] + mine[i + 1][j + 1] + mine[i - 1][j + 1] + mine[i + 1][j - 1] - 7 * '0';
//一共是8個(gè)字符0,但因?yàn)槲覀円玫揭粋€(gè),所以減掉7個(gè),用的那一個(gè)是因?yàn)槲覀兿胍宰址麛?shù)字的形式賦過去,因?yàn)閿?shù)組是字符類型的
}
//遞歸展開
void recursion(char mine[ROWS][COLS], char show[ROWS][COLS], int i, int j, int* p)
{
int x = 0;
int y = 0;
for (x = -1; x <= 1; x++)
{
for (y = -1; y <= 1; y++)
{
if (x + i > 0 && x + i <= ROW && y + j > 0 && y + j <= COL)//防止越界
{
if (mine[i + x][j + y] == '0' && (show[i + x][j + y] == '*' || show[i + x][j + y] == '?' || show[i + x][j + y] == '!'))
{
(*p)++;
if (around_mine(mine, i + x, j + y) == '0')
{
show[i + x][j + y] = ' ';
recursion(mine, show, i + x, j + y, p);
}
else
{
show[i + x][j + y] = around_mine(mine, i + x, j + y);
//recursion(mine, show, i + x, j + y, p);
}
}
else
continue;
}
}
}
}
//玩家選擇坐標(biāo)
int player_option(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols,int* p)
{
int i = 0;
int j = 0;
printf("玩家選擇:> ");
scanf("%d %d", &i, &j);
if (i > 0 && i <= ROW && j > 0 && j <= COL)
{
if (mine[i][j] == '1')
{
return 0;
}
if (show[i][j] == '*'||show[i][j]=='!'||show[i][j]=='?')
{
(*p)++;
show[i][j] = around_mine(mine, i, j);
if (show[i][j] == '0')
{
show[i][j] = ' ';
recursion(mine, show, i, j, p);//遞歸展開
}
/*else
recursion(mine, show, i, j, p);*/
return 1;
}
else
{
printf("該位置已經(jīng)排過,請重新選擇位置\n");
Sleep(1500);
return 1;
}
}
}
//玩家進(jìn)行標(biāo)記和排雷
int num = 0;
int ret = 0;
while (num<ROW*COL-mine_num)//當(dāng)重復(fù)的次數(shù)為所有非雷個(gè)數(shù)后跳出循環(huán),勝利
{
mark_board(show, ROWS, COLS);//每次輸入前的標(biāo)記環(huán)節(jié)
ret = player_option(mine, show, ROWS, COLS, &num);
system("cls");
print_board(show, ROWS, COLS);
if (ret == 0)
{
printf("很遺憾,你被炸死了,雷區(qū)如下:\n");
print_board(mine, ROWS, COLS);//讓玩家死后看到這盤掃雷游戲中雷都在哪里
break;
}
//print_board(show, ROWS, COLS);
}
if (num == ROW * COL - mine_num)
printf("恭喜你掃除了全部的雷?。。n");
四、總代碼如下
game.h
#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_num 10
//初始化
void init_board(char board[ROWS][ROWS], int rows, int cols, char a);
//埋雷
void put_mine(char mine[ROWS][COLS],int rows, int cols);
//打印
void print_board(char board[ROWS][COLS], int rows, int cols);
//玩家選擇坐標(biāo)
int player_option(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
//玩家標(biāo)記
void mark_board(char show[ROWS][COLS], int rows, int cols);
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化
void init_board(char board[ROWS][ROWS], int rows, int cols, char a)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = a;
}
}
}
//放雷
void put_mine(char mine[ROWS][COLS], int rows, int cols)
{
int num = 0;
for (num = 0; num < mine_num; num++)
{
while (1)
{
int i = rand() % ROW + 1;
int j = rand() % COL + 1;
if (mine[i][j] == '0')
{
mine[i][j] = '1';
break;
}
}
}
}
//打印
void print_board(char board[ROWS][COLS], int rows, int cols)
{
int i = 0;
printf(" ");//為了對其每行,因?yàn)槊啃械拈_頭加了下標(biāo),所以要先空出來下標(biāo)所占的位置
for (i = 1; i < cols-1; i++)//打印每列的下標(biāo)
{
printf("%d ", i);
}
printf("\n");
printf(" ");//為了對其每行,因?yàn)槊啃械拈_頭加了下標(biāo),所以要先空出來下標(biāo)所占的位置
for (i = 1; i < cols-1; i++)//讓每列的下標(biāo)和其下面的符號隔開
{
printf("- ");
}
printf("\n");
for (i = 1; i < rows-1; i++)
{
printf("%d| ", i);//標(biāo)記每行
int j = 0;
for (j = 1; j < cols-1; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//周圍雷個(gè)數(shù)
char around_mine(char mine[ROWS][COLS], int i, int j)
{
return mine[i][j - 1] + mine[i][j + 1] + mine[i + 1][j] + mine[i - 1][j] + mine[i - 1][j - 1] + mine[i + 1][j + 1] + mine[i - 1][j + 1] + mine[i + 1][j - 1] - 7 * '0';
//一共是8個(gè)字符0,但因?yàn)槲覀円玫揭粋€(gè),所以減掉7個(gè),用的那一個(gè)是因?yàn)槲覀兿胍宰址麛?shù)字的形式賦過去,因?yàn)閿?shù)組是字符類型的
}
//遞歸展開
void recursion(char mine[ROWS][COLS], char show[ROWS][COLS], int i, int j, int* p)
{
int x = 0;
int y = 0;
for (x = -1; x <= 1; x++)
{
for (y = -1; y <= 1; y++)
{
if (x + i > 0 && x + i <= ROW && y + j > 0 && y + j <= COL)//防止越界
{
if (mine[i + x][j + y] == '0' && (show[i + x][j + y] == '*' || show[i + x][j + y] == '?' || show[i + x][j + y] == '!'))
{
(*p)++;
if (around_mine(mine, i + x, j + y) == '0')
{
show[i + x][j + y] = ' ';
recursion(mine, show, i + x, j + y, p);
}
else
{
show[i + x][j + y] = around_mine(mine, i + x, j + y);
//recursion(mine, show, i + x, j + y, p);
}
}
else
continue;
}
}
}
}
//玩家選擇坐標(biāo)
int player_option(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols,int* p)
{
int i = 0;
int j = 0;
printf("玩家選擇:> ");
scanf("%d %d", &i, &j);
if (i > 0 && i <= ROW && j > 0 && j <= COL)
{
if (mine[i][j] == '1')
{
return 0;
}
if (show[i][j] == '*'||show[i][j]=='!'||show[i][j]=='?')
{
(*p)++;
show[i][j] = around_mine(mine, i, j);
if (show[i][j] == '0')
{
show[i][j] = ' ';
recursion(mine, show, i, j, p);//遞歸展開
}
/*else
recursion(mine, show, i, j, p);*/
return 1;
}
else
{
printf("該位置已經(jīng)排過,請重新選擇位置\n");
Sleep(1500);
return 1;
}
}
}
//玩家標(biāo)記
void mark_board(char show[ROWS][COLS], int rows, int cols)
{
int flag = 0;
while (1)
{
printf("選擇標(biāo)記方式:按1標(biāo)記為雷(!),按2標(biāo)記為不確定(?),按3取消標(biāo)記(*),選擇4進(jìn)入排雷環(huán)節(jié)\n");
printf("請玩家選擇標(biāo)記方式:> ");
scanf("%d", &flag);
if (flag == 1)
{
int i = 0;
int j = 0;
printf("玩家選擇標(biāo)記位置:> ");
scanf("%d %d", &i, &j);
if (i > 0 && i <= ROW && j > 0 && j <= COL)
{
if (show[i][j] != '*'&&show[i][j]!='?')
{
printf("該位置已經(jīng)掃過或者已經(jīng)被標(biāo)記了該種符號,請重新選擇\n");
continue;
}
show[i][j] = '!';
}
}
else if (flag == 2)
{
int i = 0;
int j = 0;
printf("玩家選擇:> ");
scanf("%d %d", &i, &j);
if (i > 0 && i <= ROW && j > 0 && j <= COL)
{
if (show[i][j] != '*' && show[i][j] != '!')
{
printf("該位置已經(jīng)掃過或者已經(jīng)被標(biāo)記了該種符號,請重新選擇\n");
continue;
}
show[i][j] = '?';
}
}
else if (flag == 3)
{
int i = 0;
int j = 0;
printf("玩家選擇:> ");
scanf("%d %d", &i, &j);
if (i > 0 && i <= ROW && j > 0 && j <= COL)
{
if (show[i][j] == '?' || show[i][j] == '!')
{
show[i][j] = '*';
}
else
{
printf("該位置已經(jīng)掃過或者已經(jīng)被標(biāo)記了該種符號,請重新選擇\n");
continue;
}
}
}
else if (flag == 4)
return;
else
printf("選擇錯(cuò)誤,請重新選擇\n");
system("cls");
print_board(show, ROWS, COLS);
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("************************\n");
printf("******** 1.play ********\n");
printf("******** 0.exit ********\n");
printf("************************\n");
}
void game()
{
char mine[ROWS][COLS];
char show[ROWS][COLS];
//初始化雷區(qū)
init_board(mine, ROWS,COLS,'0');
//初始化展示區(qū)
init_board(show,ROWS,COLS, '*');
//埋雷
put_mine(mine,ROWS, COLS);
//打印雷盤
//print_board(mine, ROWS, COLS);//上帝視角,打印雷區(qū)
//printf("\n");
print_board(show, ROWS, COLS);
//玩家進(jìn)行標(biāo)記和排雷
int num = 0;
int ret = 0;
while (num<ROW*COL-mine_num)//當(dāng)重復(fù)的次數(shù)為所有非雷個(gè)數(shù)后跳出循環(huán),勝利
{
mark_board(show, ROWS, COLS);//每次輸入前的標(biāo)記環(huán)節(jié)
ret = player_option(mine, show, ROWS, COLS, &num);
system("cls");
print_board(show, ROWS, COLS);
if (ret == 0)
{
printf("很遺憾,你被炸死了,雷區(qū)如下:\n");
print_board(mine, ROWS, COLS);//讓玩家死后看到這盤掃雷游戲中雷都在哪里
break;
}
//print_board(show, ROWS, COLS);
}
if (num == ROW * COL - mine_num)
printf("恭喜你掃除了全部的雷?。?!\n");
}
void test()
{
int input = 0;
do
{
menu();
printf("請選擇:> ");
scanf("%d", &input);
switch (input)
{
case 1:
printf("開始游戲\n");
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯(cuò)誤,請重新輸入\n");
}
} while (input);
}
int main()
{
srand((unsigned int)time(NULL));
test();
return 0;
}
效果展示圖
五、總結(jié)
文章來源:http://www.zghlxwxcb.cn/news/detail-413157.html
?請點(diǎn)擊下面進(jìn)入主頁關(guān)注大魔王
如果感覺對你有用的話,就點(diǎn)我進(jìn)入主頁關(guān)注我吧!文章來源地址http://www.zghlxwxcb.cn/news/detail-413157.html
到了這里,關(guān)于童年回憶--掃雷(包括標(biāo)記功能和遞歸展開)--萬字講解讓你學(xué)會(huì)掃雷制作的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!