亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

【C語(yǔ)言實(shí)現(xiàn)游戲】(二)掃雷(遞歸實(shí)現(xiàn)排雷)

U2FsdGVkX1x / 3384人閱讀

摘要:玩家選擇開始游戲后,出現(xiàn)雷盤,并且隨機(jī)布置雷。雷盤的數(shù)組大小為,方便計(jì)算掃雷時(shí)周圍雷的數(shù)量,并防止數(shù)組越界。放置布置的雷的信息放置排查出雷的信息初始化雷盤初始化展示界面打印展示界面效果如下布置雷隨機(jī)在數(shù)組中讓十個(gè)變成作為雷。

目錄

前言

一、游戲思路

二、游戲框架

1.菜單界面

1.菜單:

2.菜單的選擇:

3.實(shí)際效果:

2.游戲主體

1.初始化雷盤及展示界面

2.布置雷

?3.排雷

3.游戲函數(shù)

三、游戲運(yùn)行

四、所有代碼

1.game.h

2.game.c

3.test.c

總結(jié)




前言

掃雷,相信各位都不陌生,以前每臺(tái)電腦上面都會(huì)自帶這個(gè)小游戲。因此,它可以說(shuō)是我們的童年回憶了,今天來(lái)用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲。




一、游戲思路

1、程序開始時(shí)出現(xiàn)菜單,讓玩家選擇開始游戲或者退出游戲。

2、玩家選擇開始游戲后,出現(xiàn)雷盤,并且隨機(jī)布置雷。

3、玩家進(jìn)行排雷



二、游戲框架



1.菜單界面

1.菜單:

void menu(){	printf("**************************/n");	printf("*****按 1 開 始 游 戲*****/n");	printf("*****按 0 退 出 游 戲*****/n");	printf("**************************/n");}

2.菜單的選擇

int main(){	int input = 0;		do	{		menu();		printf("做出你的選擇:");		scanf("%d", &input);		switch (input)		{		case 1:			game();			break;		case 0:			printf("退出游戲~)/n");			break;		default:			printf("請(qǐng)重新選擇/n");			break;		}	} while (input);	return 0;}

3.實(shí)際效果:



2.游戲主體

1.初始化雷盤及展示界面

建立兩個(gè)二維數(shù)組作為雷盤,一個(gè)用于初始化雷盤,即埋雷;另一個(gè)雷盤用于作展示界面,顯示玩家的排雷過(guò)程。雷盤的數(shù)組大小為11*11,方便計(jì)算掃雷時(shí)周圍雷的數(shù)量,并防止數(shù)組越界。展示界面的數(shù)組大小9*9即可。

void game(){	char mine[ROWS][COLS] = { 0 }; //放置布置的雷的信息	char show[ROWS][COLS] = { 0 }; //放置排查出雷的信息	InitBoard(mine, ROWS, COLS, "0"); //初始化雷盤	InitBoard(show, ROWS, COLS, "*"); //初始化展示界面	DisplayBoard(show, ROW, COL); //打印展示界面}

void InitBoard(char board[ROWS][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++)			board[i][j] = set;	}}void DisplayBoard(char board[ROWS][COLS], int row, int col){	int i = 0;	int j = 0;	for (i = 0; i <= col; i++)	{		printf("%d ", i);	}	printf("/n");	for (i = 1; i <= row; i++)	{		printf("%d ", i);		for (j = 1; j <= col; j++)		{			printf("%c ", board[i][j]);		}		printf("/n");	}}

效果如下

2.布置雷

隨機(jī)在mine數(shù)組中讓十個(gè)‘0’變成‘1’作為雷。

void SetMine(char mine[ROWS][COLS], int row, int col){	int count = 10;    		while (count)	{				int x = rand() % row + 1;   				int y = rand() % col + 1;			if (mine[x][y] == "0")			{				mine[x][y] = "1";					count--;			}	}}

?打印下展示界面和雷盤看下效果,可以看到剛好出現(xiàn)了十個(gè)1,且每次新游戲的位置都是不一樣的。

? ? ? ? ? ? ? ??

?3.排雷

?玩家輸入要排查的坐標(biāo),如果是雷,游戲結(jié)束;如果不是雷,顯示周圍一圈雷的數(shù)量,如果周圍一圈沒有雷,則自動(dòng)繼續(xù)向外排查(通過(guò)簡(jiǎn)單的遞歸實(shí)現(xiàn))。當(dāng)所有雷都被排查出時(shí),游戲勝利。

void FindMine(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("請(qǐng)輸入要排查的坐標(biāo):");		scanf("%d %d", &x, &y);		if (x >= 1 && x <= row && y >= 1 && y <= col)		{			if (mine[x][y] == "1")			{				printf("你涼了哈哈哈哈哈哈哈哈哈哈/n");				DisplayBoard(mine, row, col);				break;			}			else			{				int n = get_mine_count(mine, x, y);				show[x][y] = n + "0";								system("cls"); //美觀				DisplayBoard(show, row, col);				win++;			}		}		else		{			printf("往哪排雷呢你,重新來(lái)/n");		}	}	if (win == row * col - EASY_COUNT)	{		printf("不錯(cuò)哦,贏了");		DisplayBoard(mine, row, col);	}	}
static int get_mine_count(char mine[ROWS][COLS], int x,int y){	return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x - 1][y + 1] +		mine[x][y - 1] + mine[x][y + 1] + 		mine[x + 1][y] + mine[x + 1][y - 1] + mine[x + 1][y + 1] - 8 * "0";}

但是這樣子出來(lái)的掃雷無(wú)法自動(dòng)向外排查,于是我選擇用遞歸來(lái)實(shí)現(xiàn),當(dāng)然勝利的條件也會(huì)隨著發(fā)生變化,變成了統(tǒng)計(jì)未排查數(shù)量是否與雷數(shù)量相等。

于是我將判斷勝負(fù)的代碼換成了如下代碼。

int i = 0;int j = 0;int mines = 0;		for (i = 1; i <= ROW; i++)		{						for (j = 1; j <= COL; j++)			{				if (show[i][j] == "*")					mines++;			}		}		if (EASY_COUNT == mines)		{			printf("不錯(cuò)哦,你贏了!/n");			break;		}

然后用遞歸實(shí)現(xiàn)自動(dòng)排查

void count(char show[ROWS][COLS], char mine[ROWS][COLS], int x, int y){	int i = 0;	int j = 0;	if (get_mine_count(mine, x, y) == 0)	{		show[x][y] = " ";		for (i = x - 1; i <= x + 1; i++)		{						for (j = y - 1; j <= y + 1; j++)			{				if (i > 0 && i <= ROW && j > 0 && j <= COL && mine[i][j] != "1" && show[i][j] == "*")				{					count(show, mine, i, j);				}			}		}	}	else		show[x][y] = "0" + get_mine_count(mine, x, y);}

3.游戲函數(shù)

當(dāng)然還需要游戲函數(shù)將上述結(jié)合起來(lái)

void game(){	char mine[ROWS][COLS] = { 0 }; //放置布置的雷的信息	char show[ROWS][COLS] = { 0 }; //放置排查出雷的信息	InitBoard(mine, ROWS, COLS, "0"); //初始化雷盤	InitBoard(show, ROWS, COLS, "*"); //初始化展示界面	SetMine(mine, ROW, COL);	DisplayBoard(show, ROW, COL); //打印展示界面	/*DisplayBoard(mine, ROW, COL);*/	FindMine(mine, show,ROW, COL);}

三、游戲運(yùn)行

?來(lái)看看實(shí)際效果,由于清屏的存在,界面也算是整潔美觀。

??

四、所有代碼

按照慣例,貼出所有代碼

1.game.h

#pragma once#include #include #include #include #define ROW 9 #define COL 9#define ROWS ROW+2#define COLS COL+2#define EASY_COUNT 10//初始化雷盤或展示界面void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//打印展示界面void DisplayBoard(char board[ROWS][COLS], int row, int col);//布置雷void SetMine(char mine[ROWS][COLS], int row, int col);//排雷void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

2.game.c

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void InitBoard(char board[ROWS][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++)			board[i][j] = set;	}}void DisplayBoard(char board[ROWS][COLS], int row, int col){	int i = 0;	int j = 0;	printf("----------掃雷---------/n");	for (i = 0; i <= col; i++)	{		printf("%d ", i);	}	printf("/n");	for (i = 1; i <= row; i++)	{		printf("%d ", i);		for (j = 1; j <= col; j++)		{			printf("%c ", board[i][j]);		}		printf("/n");	}	printf("----------掃雷---------/n");}void SetMine(char mine[ROWS][COLS], int row, int col){	int count = EASY_COUNT;	while (count)	{				int x = rand() % row + 1;   				int y = rand() % col + 1;			if (mine[x][y] == "0")			{				mine[x][y] = "1";					count--;			}	}}static int get_mine_count(char mine[ROWS][COLS], int x,int y){	return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x - 1][y + 1] +		mine[x][y - 1] + mine[x][y + 1] + 		mine[x + 1][y] + mine[x + 1][y - 1] + mine[x + 1][y + 1] - 8 * "0";}void count(char show[ROWS][COLS], char mine[ROWS][COLS], int x, int y){	int i = 0;	int j = 0;	if (get_mine_count(mine, x, y) == 0)	{		show[x][y] = " ";		for (i = x - 1; i <= x + 1; i++)		{						for (j = y - 1; j <= y + 1; j++)			{				if (i > 0 && i <= ROW && j > 0 && j <= COL && mine[i][j] != "1" && show[i][j] == "*")				{					count(show, mine, i, j);				}			}		}	}	else		show[x][y] = "0" + get_mine_count(mine, x, y);}void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){	int x = 0;	int y = 0;	int i = 0;    int j = 0;	while (1)	{		printf("請(qǐng)輸入要排查的坐標(biāo):");		scanf("%d %d", &x, &y);		if (x >= 1 && x <= row && y >= 1 && y <= col)		{			if (mine[x][y] == "1")			{				printf("你涼了哈哈哈哈哈哈哈哈哈哈/n");				DisplayBoard(mine, row, col);				break;			}			else			{				int n = get_mine_count(mine, x, y);				show[x][y] = n + "0";				count(show, mine, x, y);				system("cls");				DisplayBoard(show, row, col);			}		}		else		{			printf("往哪排雷呢你,重新來(lái)/n");		}		int mines = 0;		for (i = 1; i <= ROW; i++)		{			for (j = 1; j <= COL; j++)			{				if (show[i][j] == "*")					mines++;			}		}		if (EASY_COUNT == mines)		{			printf("不錯(cuò)哦,你贏了!/n");			break;		}	}}

3.test.c

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu(){	printf("**************************/n");	printf("*****按 1 開 始 游 戲*****/n");	printf("*****按 0 退 出 游 戲*****/n");	printf("**************************/n");}void game(){	char mine[ROWS][COLS] = { 0 }; //放置布置的雷的信息	char show[ROWS][COLS] = { 0 }; //放置排查出雷的信息	InitBoard(mine, ROWS, COLS, "0"); //初始化雷盤	InitBoard(show, ROWS, COLS, "*"); //初始化展示界面	SetMine(mine, ROW, COL);	DisplayBoard(show, ROW, COL); //打印展示界面	/*DisplayBoard(mine, ROW, COL);*/	FindMine(mine, show,ROW, COL);}int main(){	int input = 0;	srand((unsigned int)time(NULL));	do	{		menu();		printf("做出你的選擇:");		scanf("%d", &input);		switch (input)		{		case 1:			game();			break;		case 0:			printf("退出游戲~)/n");			break;		default:			printf("請(qǐng)重新選擇/n");			break;		}	} while (input);	return 0;}



總結(jié)

好累,去睡覺了。

當(dāng)然這個(gè)游戲可以在頭文件中改變數(shù)值達(dá)到不同的雷盤大小,以及不同的雷數(shù)量,達(dá)成不同難度的掃雷游戲,當(dāng)然我也可以直接將這個(gè)做成簡(jiǎn)單模式、困難模式之類的,但是我懶!

歡迎大家一起交流心得!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/123188.html

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)掃雷游戲】拓展版

    摘要:作者時(shí)間網(wǎng)站地址摘要語(yǔ)言實(shí)現(xiàn)我們小時(shí)候玩過(guò)的掃雷游戲,最近看到了一些掃雷游戲的簡(jiǎn)單實(shí)現(xiàn),但是總有功能上的缺失,玩起來(lái)不那么的原汁原味,因此我增加了一些新功能確保玩家首次排雷一定不會(huì)炸死。 ...

    JayChen 評(píng)論0 收藏0
  • 掃雷1.0(遞歸實(shí)現(xiàn)

    摘要:頭文件部分進(jìn)行符號(hào)常量的聲明,宏定義等源文件和用時(shí)需要引用。包括布置雷區(qū),埋雷,掃雷,判斷輸贏等。游戲規(guī)則掃雷就是要把所有非地雷的格子揭開即勝利踩到地雷格子就算失敗。一次就可以完成兩次函數(shù)調(diào)用的實(shí)現(xiàn)。這是因?yàn)榉乐乖趻呃椎臅r(shí)候數(shù)組越界。 ...

    CoderDock 評(píng)論0 收藏0
  • 掃雷連爆(望大佬也可以幫忙優(yōu)化或提出意見)(C語(yǔ)言版)------上

    摘要:新人小白的第一篇博客,有什么不好之處望多提意見。這個(gè)掃雷小游戲主要是基于二維數(shù)組,循環(huán)與基本的函數(shù)知識(shí)等。請(qǐng)輸入坐標(biāo)提示玩家輸入坐標(biāo)。換行是為了看著好看,要不然打印出來(lái)的數(shù)組會(huì)變形的。用來(lái)接收判斷輸贏的函數(shù)的返回值。 ???????新人小白的第一篇博客,有什么不好之處望多提意見。 ? ? ?...

    incredible 評(píng)論0 收藏0
  • c語(yǔ)言實(shí)現(xiàn)掃雷(簡(jiǎn)易版)

    摘要:每成功排一次雷,我們都要展示雷盤當(dāng)場(chǎng)上剩下的格子數(shù)等于雷數(shù)時(shí),游戲勝利,玩家踩雷時(shí),游戲結(jié)束,所以我們這是一個(gè)判斷輸贏的函數(shù)。 前言:寫完三子棋后,慢慢地熟悉了這種...

    walterrwu 評(píng)論0 收藏0
  • C語(yǔ)言實(shí)現(xiàn)初級(jí)掃雷

    摘要:文章目錄一游戲簡(jiǎn)介二代碼實(shí)現(xiàn)調(diào)用函數(shù)打印菜單函數(shù)函數(shù)初始化函數(shù)布置雷函數(shù)排雷函數(shù)三總代碼一游戲簡(jiǎn)介一款小游戲,一張棋盤可以自己設(shè)計(jì),,,都可以,或是添加一些自己喜歡的元素布滿許多未知是雷或是安全的格子,輸入坐標(biāo),若觸雷,游戲結(jié)束,反之,顯 文章目錄 一、游戲簡(jiǎn)介 二、代碼實(shí)現(xiàn) 1.調(diào)用tes...

    Rango 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<