国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語言:掃雷小游戲

這篇具有很好參考價值的文章主要介紹了C語言:掃雷小游戲。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

文接上一篇博文C語言:三子棋小游戲。本篇博文是使用C語言來實現(xiàn)掃雷小游戲的。這里不對掃雷的規(guī)則進行贅述。玩家通過鍵盤輸入坐標來探雷。博主在實現(xiàn)掃雷之前從未看過掃雷實現(xiàn)的相關視頻,所以這里實現(xiàn)的掃雷完全是博主的原生思路,具有邏輯性。下面詳細介紹一下如何實現(xiàn)掃雷。

(建議在閱讀過上一篇博文再閱讀本文,因為再本文中對重復的問題不會再次解讀。)

步驟一:制定框架

框架是什么?如何制定框架?這些問題在三子棋的實現(xiàn)中就已經(jīng)解答了,這里也不多講。這里的框架與三子棋的框架完全相同。

#include"detect.h"
int main()
{
	srand((unsigned)time(NULL));//這里設置了隨機種子,為了之后隨機生成雷
	int n = 0;
	do
	{
		menu();
		printf("your choice:\n");
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			system("cls");
			game();
			break;
		case 0:
			system("cls");
			printf("exit game\n");
			break;
		default:
			printf("input error,again:\n");
			Sleep(1000);
			system("cls");
		}
	} while (n);
	return 0;
}

menu是什么在三子棋實現(xiàn)中也提過,這里使用了Sleep函數(shù)(程序暫停運行多少毫秒)和system("cls")(清屏)是為了更好的游戲體驗。這里的detect.h代碼如下:

#pragma once
#define ROW 10
#define COL 10
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
void menu();
void game();

步驟二:實現(xiàn)game函數(shù)

跟三子棋的game函數(shù)一樣,我們需要事先想好整個game的流程。

分析過程:既然有雷,我們需要將雷的位置記錄下來,那我們就需要一個字符二維數(shù)組,雷用大寫字符'O'表示,雷的位置就初始化為'O',其他位置為空格。另外,開局時我們一個地方都沒探測,我們難道要將帶雷的數(shù)組直接打印上去嗎?顯然這樣雷就直接被打印出來了。我們可以想到用第二個字符二維數(shù)組,里面初始時全是空格字符,這個數(shù)組是用來打印的。我們在這個數(shù)組中進行探測。

結束條件:如果探的是雷,那么直接宣告失敗,結束本次游戲;如果這一次避開了所有的雷,那么直接宣告成功,結束本次游戲;如果這一次沒探到雷而且沒有結束,那么顯示此處旁邊雷的個數(shù)

那我們怎么知道探出的是不是雷?其實很簡單,在數(shù)組一中此處如果是雷,說明這次探到雷了

下面是game的代碼

void game()
{
	char map1[ROW][COL] = { 0 };
	char map2[ROW][COL] = { 0 };
	mapInit(map1, ROW, COL);//真正存儲炸彈
	mapInit(map2, ROW, COL);//用來打印
	BoomInit(map1, ROW, COL);
	system("cls");
	showMap(map2, ROW, COL);
	while (1)
	{
		int ret=playerMove(map1, map2, ROW, COL,ROW*COL/8);
		if (ret==1)//炸了
		{
			system("cls");
			showMap(map1, ROW, COL);
			printf("game over\n");
			system("pause");
			break;
		}
		else if (ret== 2)//排除了所有炸彈
		{
			system("cls");
			showMap(map1, ROW, COL);//展示所有炸彈位置
			printf("detect successfully\n");
			Sleep(2000);
			break;
		}
		system("cls");
		showMap(map2, ROW, COL);
	}
}

當然只是代碼還是很模糊的,下面依然需要對game中的各個部分進行講解。

map1:即數(shù)組一,用來存放炸彈的

map2:即數(shù)組二,用來打印的

ROW,COL:宏定義,這個宏定義在"detect.h"中,之前已經(jīng)給出

mapInit:用來初始化兩個數(shù)組,將兩個數(shù)組的每一個元素變成空格字符

BoomInit:用來將map1的隨機位置放上炸彈

showMap:將map2打印出來(連帶格子的線條,之后會詳細實現(xiàn))

playerMove:返回值為int類型,玩家在map2中的一個位置進行探測,如果在map1中相應位置是炸彈就返回1,避開所有炸彈就返回2,其他情況返回0;

?步驟三:實現(xiàn)game中的函數(shù)

?
?
void mapInit(char map[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			map[i][j] = ' ';
		}
	}
}//這個函數(shù)很簡單,不作講解
void BoomInit(char map[ROW][COL], int row, int col)
{
	int boomNum = row * col / 6;//6分之一是炸彈
	//設置炸彈進map
	int curNum = 0;
	int x = 0;
	int y = 0;
	while (curNum != boomNum)
	{
		 x = rand() % row;
		 y = rand() % col;
		if (map[x][y] == ' ')//如果是空格才能正常放入,如果已經(jīng)是炸彈就不放,重新生成一個坐標
		{
			map[x][y] = 'O';
			curNum++;
		}
	}
}

void showMap(char map[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", map[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		if (i < row - 1)
		{
			for (int x = 0; x < col; x++)
			{
				printf("---");
				if (x < col - 1)
					printf("|");
			}
			printf("\n");
		}//這一段其實是將畫格子線和棋子一并畫出,
         //需要自己動手操作一下才能明白這段代碼每一句是在做什么
         //不動手再怎么講都不會弄明白
	}
}
//warning函數(shù)是為了完成playerMove函數(shù)而寫的,請先看playerMove函數(shù)
char warning(char map[ROW][COL], int row, int col, int x, int y)
{
	int countBoom = 0;//最大為8,加上'0'變成字符
	for (int i = x - 1; i <= x + 1;i++)
	{
		for (int j = y - 1; j <= y + 1; j++)
		{
			if (i >= 0 && i <= row && j >= 0 && j <= col)//越界了就不判斷是不是雷
			{
				if (map[i][j] == 'O')
					countBoom++;
			}
		}
	}
	return countBoom +'0';
}
int playerMove(char map1[ROW][COL],char map2[ROW][COL], int row, int col,int boomNum)
{
	int x = 0;
	int y = 0;
	static count = 0;//靜態(tài)局部變量,記錄用戶一共開了幾個格子
	while (1)
	{
		printf("input x:\n");
		scanf("%d", &x);
		printf("input y:\n");
		scanf("%d", &y);
		x--;
		y--;//用戶輸入的1就是第一個位置,數(shù)組下標就是0
		if (x < 0 || x >= row || y < 0 || y >= col || map2[x][y] != ' ')
		{
			printf("wrong place,again\n");//非法坐標,重新輸入
		}
		else
		{
			break;//合法,退出循環(huán)
		}
	}
    //如果探到雷了,map2的該位置就改成'O',沒探到雷就顯示旁邊有幾個雷
    //這里的warning函數(shù)就是用來給出map1的相應位置旁邊有幾個雷,返回值是char類型
	map2[x][y] = map1[x][y]=='O'?'O':warning(map1,ROW,COL,x,y);
	if (map2[x][y] == 'O')
		return 1;//探到雷了,返回1
	else//判斷是否排除完
	{
		count++;
		if (count == col * row - boomNum)
		{
			count = 0;//歸零,下一次進行游戲count還是從0開始計數(shù),否則count還是之前的值
			return 2;//避開了所有的雷,返回2
		}
	}
	return 0;//正常進行下一次探測,返回0
}

?

?

?到這里為止,所有的工作就完成了,我們來看看效果

測試:

?配合清屏和睡眠函數(shù)效果還是不錯的,只是和原版的掃雷少了一個功能。我們知道,原版的掃雷在探到一個格子旁邊沒有一個炸彈時,也就這里實現(xiàn)的掃雷顯示'0'時,會自動將旁邊的格子顯示出來,只是這個功能實現(xiàn)起來有點困難。當時想過用遞歸解決這個問題,就是說如果map2中探到一個0雷格,將旁邊八個格子打開,如果這八個格子還有0雷格,就會進行遞歸,繼續(xù)將旁邊的格子打開,只是這樣會有一個問題,0雷格挨在一起的話會陷入死遞歸。個人感覺這個問題使用遞歸是最好解決的,之后想到了解決方案會更新博文。文章來源地址http://www.zghlxwxcb.cn/news/detail-708676.html

到了這里,關于C語言:掃雷小游戲的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • C語言小游戲——掃雷

    C語言小游戲——掃雷

    ????????結合前邊我們所學的C語言知識,本期我們將使用C語言實現(xiàn)一個簡單的小游戲——掃雷 目錄 前言 總體框架設計 多文件分裝程序 各功能模塊化實現(xiàn) 初始化棋盤 ?棋盤打印 埋雷 ?判贏與排雷 游戲邏輯安排 總結 ????????和三子棋相同,游戲開始時不需要任何判

    2024年02月06日
    瀏覽(91)
  • c語言小游戲之掃雷

    c語言小游戲之掃雷

    目錄 一:游戲設計理念及思路 二:初步規(guī)劃的游戲界面 三:開始掃雷游戲的實現(xiàn) 注:1.創(chuàng)建三個文件,test.c用來測試整個游戲的運行,game.c用來實現(xiàn)掃雷游戲的主體,game.h用來函數(shù)聲明和包含頭文件 2.為方便定位坐標,在展示數(shù)組時添加行號和列號 四:謝謝觀看? 聽說看到

    2024年01月23日
    瀏覽(113)
  • C語言:輕松實現(xiàn)掃雷小游戲

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

    目錄 一、前言 二、掃雷步驟 1.創(chuàng)建項目 2.設計整體框架 1.定義數(shù)組長度和雷的個數(shù) 2.game函數(shù)功能 三、頭文件game.h代碼實現(xiàn)? 四、測試文件test.c代碼實現(xiàn) 五、game函數(shù)功能實現(xiàn) 1.初始化棋盤 2.打印棋盤 ?3.布置雷 4. 獲得雷的個數(shù) ?5.排查雷 6.game函數(shù)實現(xiàn)代碼 六、總結 大家好

    2024年02月03日
    瀏覽(90)
  • C語言——掃雷小游戲(遞歸展開版)

    C語言——掃雷小游戲(遞歸展開版)

    哈嘍,大家好,上次我們已經(jīng)學習了三子棋小游戲,今天我們來學習掃雷小游戲了。 目錄 1.游戲介紹 2.函數(shù)部分 2.1菜單 2.2game()函數(shù) 2.3mian()函數(shù) 2.4初始化棋盤 2.5打印棋盤 2.6布置雷 2.7排查雷 2.8統(tǒng)計雷 2.9遞歸,展開一片區(qū)域 3.完整代碼展示? 想必大家都玩過掃雷這款小游戲吧

    2024年02月03日
    瀏覽(89)
  • 【C】C語言實現(xiàn)掃雷小游戲

    相信大家一定都玩過掃雷小游戲,今天我就帶大家來用C語言實現(xiàn)一個簡易版的掃雷小游戲。 這里我們還是需要三個文件來封裝我們的寫的代碼: test.c ----- 用于我們代碼的測試,以及游戲整體框架的實現(xiàn)。 game .c ------ 用來封裝實現(xiàn)我們游戲的相關函數(shù)。 game.h ------ 主要用來

    2024年02月11日
    瀏覽(646)
  • 【C語言】掃雷小游戲(遞歸展開版)

    【C語言】掃雷小游戲(遞歸展開版)

    哈嘍,大家好,上次我們已經(jīng)學習了三子棋小游戲,今天我們來學習掃雷小游戲了。 目錄 1.游戲介紹 2.函數(shù)部分 2.1菜單 2.2game()函數(shù) 2.3mian()函數(shù) 2.4初始化棋盤 2.5打印棋盤 2.6布置雷 2.7排查雷 2.8統(tǒng)計雷 2.9遞歸,展開一片區(qū)域 3.完整代碼展示? 想必大家都玩過掃雷這款小游戲吧

    2024年02月12日
    瀏覽(93)
  • 【C語言】小游戲-掃雷(清屏+遞歸展開+標記)

    【C語言】小游戲-掃雷(清屏+遞歸展開+標記)

    大家好,我是深魚~ 目錄 一、游戲介紹 二、文件分裝 ?三、代碼實現(xiàn)步驟 1.制作簡易游戲菜單 ?2. 初始化棋盤(11*11) ?3.打印棋盤(9*9) 4.布置雷? ?5.計算(x,y)周圍8個坐標的和? 6.排查雷? ?1清屏后打印棋盤 2遞歸展開 3標記雷 四、完整代碼 game.h:相關函數(shù)的聲明,整個代碼要引用

    2024年02月12日
    瀏覽(97)
  • 【C語言實現(xiàn)掃雷小游戲——可展開一片】

    【C語言實現(xiàn)掃雷小游戲——可展開一片】

    學習完了函數(shù)和數(shù)組,讓我們做個掃雷小游戲鞏固一下所學的知識把! 使用控制臺操作 通過菜單實現(xiàn)選擇 棋盤為9×9 默認隨機布置10個雷 排查雷 如果排查的位置不是雷,就顯示周圍有幾個雷 排查位置是雷,游戲結束,玩家失敗 把10個雷全部排除,游戲結束,玩家成功 掃雷

    2024年02月08日
    瀏覽(91)
  • C語言經(jīng)典小游戲之掃雷(超詳解釋+源碼)

    C語言經(jīng)典小游戲之掃雷(超詳解釋+源碼)

    “少年氣,是歷盡千帆舉重若輕的沉淀,也是樂觀淡然笑對生活的豁達!” 今天我們學習一下掃雷游戲怎么用C語言來實現(xiàn)! 一個掃雷盤面由許多方格(cell)組成,方格中隨機分布著一定數(shù)量的雷(mine),一個格子中至多只有1雷。勝利條件是打開所有安全格(非雷格,saf

    2024年02月12日
    瀏覽(96)
  • C語言之掃雷小游戲的實現(xiàn)【含遞歸展開】

    C語言之掃雷小游戲的實現(xiàn)【含遞歸展開】

    掃雷游戲是1992年發(fā)行的一款大眾類益智游戲,對于許多80后、90后來說都是童年的回憶。如今三十年過去了,這款游戲依舊受到很多網(wǎng)友的喜愛,今天我們一起來模擬實現(xiàn)一下掃雷游戲。 本文所用的編譯器是VS2022 這里我們使用模塊化設計,模塊化設計就是把各個模塊的代碼分

    2024年02月02日
    瀏覽(92)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包