成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

簡(jiǎn)易掃雷游戲

不知名網(wǎng)友 / 1302人閱讀

摘要:相信大家都玩過(guò)掃雷游戲,在學(xué)習(xí)了二維數(shù)組之后,我也用語(yǔ)言寫(xiě)了一個(gè)簡(jiǎn)單的掃雷游戲規(guī)則如下通過(guò)對(duì)宏和宏來(lái)設(shè)置游戲的棋盤(pán)大小如果想玩的掃雷則需設(shè)置和為通過(guò)對(duì)宏來(lái)設(shè)置局中雷的個(gè)數(shù)雷的個(gè)數(shù)需要對(duì)用戶輸入要掃描的坐標(biāo),如果有雷則雷爆炸游戲結(jié)束,如

相信大家都玩過(guò)掃雷游戲,在學(xué)習(xí)了二維數(shù)組之后,我也用c語(yǔ)言寫(xiě)了一個(gè)簡(jiǎn)單的掃雷游戲規(guī)則如下:

1.通過(guò)對(duì)宏Row和宏List來(lái)設(shè)置游戲的棋盤(pán)大?。ㄈ绻胪?0x10的掃雷則需設(shè)置Row和List為12);

2.通過(guò)對(duì) 宏BoomNumber 來(lái)設(shè)置局中雷的個(gè)數(shù)(雷的個(gè)數(shù)需要<=(Row-2)*(List-2));

3.對(duì) 用戶輸入要掃描的坐標(biāo),如果有雷則雷爆炸游戲結(jié)束,如果沒(méi)有雷則統(tǒng)計(jì)出該坐標(biāo)周?chē)睦椎膫€(gè)數(shù),一直循環(huán)此操作,直到棋盤(pán)中未掃描的地方全是雷為止則掃雷成功。

#pragma warning (disable:4996)#pragma once#include#include#include#define Row 12#define List 12#define BoomNumber 20#define Boom "1"http://1為有雷#define nice "0"extern void Game();extern void SetMine(char MineBoard, int row, int list);extern void Select(char MineBoard, int row, int list);extern void Menu();extern void CountBoom(char MineBoard[][List], int row, int list, int x, int y);

這便是掃雷游戲的頭文件,里面聲明的函數(shù)和定義的宏會(huì)在下文中一一解釋

問(wèn)題的關(guān)鍵在于:

1.如何給棋盤(pán)隨機(jī)埋入BoomNumber個(gè)雷

2.用戶選擇掃雷的坐標(biāo)后系統(tǒng)發(fā)現(xiàn)此處沒(méi)有雷如何統(tǒng)計(jì)出周?chē)椎膫€(gè)數(shù)并且讓用戶看到

考慮到只有在雷爆炸后用戶才需要知道系統(tǒng)埋雷的位置,其余時(shí)間不需要讓用戶看見(jiàn)埋雷的位置,為了方便我們需要設(shè)置兩個(gè)棋盤(pán),一個(gè)用來(lái)埋雷另外一個(gè)則展示給用戶,棋盤(pán)有橫有縱,所以我們考慮用 兩個(gè)類(lèi)型相同的二維數(shù)組埋雷的棋盤(pán)為MineBoard[Row][List]展示給用戶的則為ShowBoard[Row][List],考慮到內(nèi)存的問(wèn)題我們?cè)O(shè)置這兩個(gè)數(shù)組都為char類(lèi)型;

棋盤(pán)的問(wèn)題解決了,那么在用戶第一次選擇坐標(biāo)之前我們還需要1.埋雷;2.把ShowBoard數(shù)組展示出來(lái),因?yàn)樾枰S機(jī)埋下BoomNumber個(gè)雷所以我們使用隨機(jī)數(shù)的方法,讓系統(tǒng)隨機(jī)產(chǎn)生坐標(biāo)而且不能有重復(fù)的坐標(biāo),在生成的坐標(biāo)位置埋入Boom,其余位置則為nice(沒(méi)有雷),因?yàn)槁窭资巧贁?shù)操作我們先初始化MineBoard數(shù)組里的元素全為nice;

void SetMine(char MineBoard[][List], int row, int list){	for (int i = 0;i < row;i++)	{		for (int j = 0;j < list;j++)		{			MineBoard[i][j] =nice;		}	}//無(wú)雷為nice	int num = 0;	int _x;	int _y;	while (num < BoomNumber)	{		_x = 1 + rand()%(Row-2);		_y = 1 + rand()%(Row-2);		if (MineBoard[_x][_y] != Boom)		{			MineBoard[_x][_y] = Boom;			num++;		}	}}

埋雷完成后則給用戶展示ShowBoard

void ShowBoards(char ShowBoard[][List], int row, int list){	printf("  ");	for (int x = 1;x < list - 1;x++)	{		printf(" %2d ",x);	}	printf("/n");	for (int i = 1;i < row-1;i++)	{		printf(" %2d",i);		for (int j = 1;j < list-1;j++)		{			printf(" %c |",ShowBoard[i][j]);		}		printf("/n");		printf("   ");		for (int k = 0;k < row - 2;k++)		{			printf("----");		}		printf("/n");	}}

此時(shí)用戶選擇要掃描的坐標(biāo)若該坐標(biāo)沒(méi)有雷則統(tǒng)計(jì)其周?chē)椎膫€(gè)數(shù),要是有雷則中雷游戲結(jié)束

考慮到用戶輸入的坐標(biāo)可能已經(jīng)被掃描或者用戶輸入的坐標(biāo)不在(1.1)~(Row-2,Row-2)這個(gè)范圍內(nèi)我們就要提醒用戶輸入的坐標(biāo)以及被掃描或者輸入的坐標(biāo)不合法,直到用戶為掃描的坐標(biāo)全為Boom為止

void Select(char ShowBoard[Row][List], char MineBoard[][List], int row, int list){	int step = 0;	int x = 0;	int y = 0;	while (step < ((row - 2) * (list - 2) - BoomNumber))	{		printf("請(qǐng)輸入你要排雷的坐標(biāo):(x,y)/n");		scanf("%d,%d", &x, &y);		if (x > 0 && x < (List-1) && y>0 && y < (List-1))		{			if (ShowBoard[x][y] == 42)			{				if (MineBoard[x][y] == nice)				{					CountBoom(ShowBoard, MineBoard, Row, List,x,y);					system("cls");					ShowBoards(ShowBoard, Row, List);					step++;					if (step == ((row - 2) * (list - 2) - BoomNumber))					{						printf("掃雷成功!/n");						Menu();					}				}				else if(MineBoard[x][y] == Boom)				{					system("cls");					printf("你已經(jīng)被炸死了!游戲結(jié)束/n");					ShowMineBoard(MineBoard, Row, List);				}			}			else {				printf("此處已經(jīng)被掃描,請(qǐng)輸入合法的坐標(biāo)/n");			}		}		else {			printf("請(qǐng)輸入合法的坐標(biāo)/n");		}	}}

統(tǒng)計(jì)用戶選擇的坐標(biāo)的周?chē)椎膫€(gè)數(shù)并讓這個(gè)數(shù)字展示在ShowBoard上,我用到了sprintf函數(shù)來(lái)把數(shù)字轉(zhuǎn)換成字符(因?yàn)槲覀兌xShowBoard數(shù)組為char類(lèi)型)統(tǒng)計(jì)雷的個(gè)數(shù)時(shí)因?yàn)镸ineBoard數(shù)組也是char類(lèi)型在把(x,y)周?chē)?個(gè)位置的雷的個(gè)數(shù)加起來(lái)時(shí)用到的是Boom的ascii碼值,又因?yàn)橛欣诪椤?’(ascii碼值為49)沒(méi)有雷為‘0’(ascii碼值為48)所以在運(yùn)算后需要減去8個(gè)‘0’的ASCII碼值,再返回去看定義這兩個(gè)棋盤(pán)時(shí)我們只需要10x10的棋盤(pán)卻定義了12x12的棋盤(pán)這是為了方便統(tǒng)計(jì)邊緣棋盤(pán)周?chē)椎膫€(gè)數(shù)

void CountBoom(char ShowBoard[Row][List],char MineBoard[][List], int row, int list, int x, int y){	int a = MineBoard[x][y + 1]/		+ MineBoard[x + 1][y + 1] + MineBoard[x - 1][y + 1] /		+ MineBoard[x][y - 1] + MineBoard[x + 1][y - 1] /		+ MineBoard[x - 1][y - 1] + MineBoard[x - 1][y] /		+ MineBoard[x + 1][y] - 384;	char  arr[32];//設(shè)置一個(gè)較大的數(shù)組防止溢出   sprintf(arr, "%d", a);//把數(shù)字轉(zhuǎn)成字符	ShowBoard[x][y] = arr[0];}

至此掃雷游戲的主要邏輯已經(jīng)梳理完畢

#include"FindMine.h"void Menu(){	printf("*****1.開(kāi)始游戲*****/n");	printf("*****2.退出游戲*****/n");	printf("請(qǐng)選擇:/n");	int a = 0;	scanf("%d", &a);	system("cls");	if (a == 1)	{		Game();	}	else if (a == 2)	{		exit(0);	}	else {		printf("輸入有誤,請(qǐng)重新選擇/n");		Menu();	}}void Game(){	char ShowBoard[Row][List];	for (int i = 0;i < Row;i++)	{		for (int j = 0;j < List;j++)		{			ShowBoard[i][j] = "*";		}	}	char MineBoard[Row][List];	SetMine(MineBoard, Row, List);	ShowBoards(ShowBoard, Row, List);	Select(ShowBoard, MineBoard, Row, List);}int main(){	srand((unsigned int)time(NULL));	Menu();	return 0;}

這些為用戶可見(jiàn)的函數(shù)

#include"FindMine.h"void ShowBoards(char ShowBoard[][List], int row, int list){	printf("  ");	for (int x = 1;x < list - 1;x++)	{		printf(" %2d ",x);	}	printf("/n");	for (int i = 1;i < row-1;i++)	{		printf(" %2d",i);		for (int j = 1;j < list-1;j++)		{			printf(" %c |",ShowBoard[i][j]);		}		printf("/n");		printf("   ");		for (int k = 0;k < row - 2;k++)		{			printf("----");		}		printf("/n");	}}void ShowMineBoard(char MineBoard[][List], int row, int list){	for (int i = 1;i < row-1;i++)	{		for (int j = 1;j < list-1;j++)		{			printf("%c", MineBoard[i][j]);		}		printf("/n");	}	Menu();}void CountBoom(char ShowBoard[Row][List],char MineBoard[][List], int row, int list, int x, int y){	int a = MineBoard[x][y + 1]/		+ MineBoard[x + 1][y + 1] + MineBoard[x - 1][y + 1] /		+ MineBoard[x][y - 1] + MineBoard[x + 1][y - 1] /		+ MineBoard[x - 1][y - 1] + MineBoard[x - 1][y] /		+ MineBoard[x + 1][y] - 384;	char  arr[32];//設(shè)置一個(gè)較大的數(shù)組防止溢出   sprintf(arr, "%d", a);//把數(shù)字轉(zhuǎn)成字符	ShowBoard[x][y] = arr[0];}void Select(char ShowBoard[Row][List], char MineBoard[][List], int row, int list){	int step = 0;	int x = 0;	int y = 0;	while (step < ((row - 2) * (list - 2) - BoomNumber))	{		printf("請(qǐng)輸入你要排雷的坐標(biāo):(x,y)/n");		scanf("%d,%d", &x, &y);		if (x > 0 && x < (List-1) && y>0 && y < (List-1))		{			if (ShowBoard[x][y] == 42)			{				if (MineBoard[x][y] == nice)				{					CountBoom(ShowBoard, MineBoard, Row, List,x,y);					system("cls");					ShowBoards(ShowBoard, Row, List);					step++;					if (step == ((row - 2) * (list - 2) - BoomNumber))					{						printf("掃雷成功!/n");						Menu();					}				}				else if(MineBoard[x][y] == Boom)				{					system("cls");					printf("你已經(jīng)被炸死了!游戲結(jié)束/n");					ShowMineBoard(MineBoard, Row, List);				}			}			else {				printf("此處已經(jīng)被掃描,請(qǐng)輸入合法的坐標(biāo)/n");			}		}		else {			printf("請(qǐng)輸入合法的坐標(biāo)/n");		}	}}void SetMine(char MineBoard[][List], int row, int list){	for (int i = 0;i < row;i++)	{		for (int j = 0;j < list;j++)		{			MineBoard[i][j] =nice;		}	}//無(wú)雷為nice	int num = 0;	int _x;	int _y;	while (num < BoomNumber)	{		_x = 1 + rand()%(Row-2);		_y = 1 + rand()%(Row-2);		if (MineBoard[_x][_y] != Boom)		{			MineBoard[_x][_y] = Boom;			num++;		}	}}

以上則為Game函數(shù)中需要調(diào)用的函數(shù)

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

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

相關(guān)文章

  • c語(yǔ)言實(shí)現(xiàn)掃雷簡(jiǎn)易版)

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

    walterrwu 評(píng)論0 收藏0
  • C語(yǔ)言實(shí)現(xiàn)入門(mén)級(jí)小游戲——掃雷

    摘要:上一期咱們用語(yǔ)言實(shí)現(xiàn)了三子棋的小游戲語(yǔ)言實(shí)現(xiàn)三子棋今天我們?cè)賮?lái)寫(xiě)個(gè)掃雷的游戲,說(shuō)起掃雷,相信大家都不陌生,可能許多朋友還是玩掃雷的高手。 ? ? ?上一期咱們用C語(yǔ)言實(shí)現(xiàn)了三子棋的小游戲? C語(yǔ)言實(shí)現(xiàn)三子棋? ? ? ?今天我們?cè)賮?lái)寫(xiě)個(gè)掃雷的游戲,說(shuō)起掃雷,相信大家都不陌生,可能許多朋友還是...

    nevermind 評(píng)論0 收藏0
  • [ C語(yǔ)言 ] 掃雷 ------> 用C語(yǔ)言實(shí)現(xiàn)game2

    摘要:函數(shù)游戲菜單請(qǐng)選擇掃雷游戲退出游戲選擇錯(cuò)誤解析函數(shù)內(nèi)部利用時(shí)間戳,形成隨機(jī)數(shù),主要目的是實(shí)現(xiàn)游戲中地雷的隨機(jī)埋放。 前言 本篇文章使用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單小游戲---掃雷。(文章最后有完整代碼鏈接) 想必大多數(shù)人都玩過(guò)或者了解過(guò)掃雷的游戲規(guī)則,但是在這里,我們?cè)谝黄鹬販匾幌聮呃椎挠螒蛞?guī)則,也更好...

    I_Am 評(píng)論0 收藏0
  • 掃雷游戲(C語(yǔ)言實(shí)現(xiàn))

    摘要:寫(xiě)在前面我們已經(jīng)寫(xiě)過(guò)了三子棋小游戲肯定沒(méi)玩過(guò)癮,我們?cè)賹?xiě)個(gè)掃雷小游戲吧目錄寫(xiě)在前面認(rèn)識(shí)游戲游戲規(guī)則游戲框架游戲?qū)崿F(xiàn)效果展示全部代碼文件文件文件認(rèn)識(shí)游戲相信大家對(duì)掃雷都不陌生每臺(tái)電腦必備的小游戲游戲規(guī)則就是在規(guī)定的時(shí)間將 ...

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

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

0條評(píng)論

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