欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言實現(xiàn)掃雷游戲詳細(xì)代碼實例

 更新時間:2021年02月26日 11:52:34   作者:貧僧愛用飄柔  
這篇文章主要介紹了C語言實現(xiàn)掃雷游戲詳細(xì)代碼實例,有感興趣的同學(xué)可以借鑒參考下

掃雷游戲

思路:先制作一個菜單讓玩家選擇是玩游戲還是退出游戲,菜單做好了,接著我們開始制作掃雷的棋盤并初始化,初始化弄完了我們下一步開始埋雷,雷埋好了就開始掃雷。

大概思路就是這樣具體實現(xiàn)看下面:

菜單的實現(xiàn)代碼:

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));

	do
	{
		printf("**************************\n");
		printf("*** 1. play 0. exit ***\n");
		printf("*** 2. clear ***\n");
		printf("**************************\n");
		printf("請選擇:>");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			game();//游戲?qū)崿F(xiàn)
			break;
		case 2://清屏選項
			system("cls");
			break;
		case 0:
			printf("退出程序!\n");
			break;
		default:
			printf("輸入錯誤,請重新輸入!\n");
			Sleep(1000);
			system("cls");
			break;
		}
	} while (input);

	return 0;
}

這里我們用了Windows庫函數(shù)清屏,如果屏幕上顯示的東西太多了,我們可以選擇2來清屏,還有一個睡眠函數(shù),如果輸出錯誤會短暫的提示你一秒,告訴你選擇錯誤了。

效果展示圖:

image-20210213182334643

制作好菜單那我們開始實現(xiàn)整個游戲的邏輯框架了,定義兩個二維數(shù)組,一個用于顯示,一個用于存放地雷。如果這兩個東西都只用一個二維數(shù)組的話后面的實現(xiàn)邏輯會比較麻煩所以我選擇使用兩個二維數(shù)組。

char mine[ROWS][COLS] = { 0 };//用于埋雷
char show[ROWS][COLS] = { 0 };//用于游戲的畫面顯示

有這兩個二維數(shù)組我們開始初始化

//初始化
void initzeboard(char mine[ROWS][COLS], int rows, int cols, char val)
{
	int i = 0;
	int j = 0;

	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			mine[i][j] = val;
		}
	}
}

我遍歷整個二維數(shù)組來初始化,val這個參數(shù)是用于接收這兩個二維數(shù)組的初始化的內(nèi)容,如果不用這個val參數(shù)我就要再寫一個函數(shù)封裝很麻煩。

接下來,實現(xiàn)個打印棋盤函數(shù)來看看我們的初始化是否正確的初始化成我想要的內(nèi)容

打印棋盤代碼:

//顯示棋盤
void Display_board(char mine[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;

	printf("  掃雷游戲\n");
	printf("---------------------------------\n");
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}

	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", mine[i][j]);
		}

		printf("\n");

	}
}

接下來看看我們初始化的是否正確:

image-20210213183529411

可以看到它正確的初始化了,全0代表埋雷的二維數(shù)組,而*代表的是用戶看到的,正常來說,這個埋雷是不需要顯示出來的,但是我們需要確認(rèn)是否正確初始化所以打印出來看看,下一步我們開始埋雷。

//埋雷
void random_mine(char mine[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = EASILY;

	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;

		if (mine[x][y] == '0')//用于判斷是否正確的埋雷,只有我們這沒被埋過的雷我們才自減
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

埋好雷的效果:

image-20210213184318663

1代表是雷,0代表步是雷,埋好的雷會被賦值成字符1

埋雷我采用隨機(jī)函數(shù)來幫我埋下雷,弄好這步接來的就是掃雷這很關(guān)鍵。

掃雷代碼:

//掃雷
void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;

	while (count < row * col - EASILY)
	{
		system("cls");
		Display_board(show, COL, ROW);
		printf("請輸入坐標(biāo):>");
		scanf("%d %d", &x, &y);

		if ((1 <= x && x <= row) && (1 <= y && y <= col))
		{
			if (mine[x][y] == '0')
			{
				int leng = statistics_mine(mine, x, y);
				show[x][y] = leng + '0';
				count++;
			}
			else
			{
				printf("很遺憾你被炸死了\n");
				Display_board(mine, ROW, COL);
				break;
			}
		}
		else
		{
			printf("請輸入有效數(shù)字!\n");
		}
	}

	if (count == row * col - EASILY)
	{
		printf("恭喜你掃雷成功!\n");
		Display_board(mine, ROW, COL);
	}
}

如果玩家輸入的坐標(biāo)是合法的我們就統(tǒng)計它周圍有多少雷,統(tǒng)計雷的功能我做成了一個內(nèi)部函數(shù)防止重名。

如果全部沒有雷的地方都排查完了,我們就停止循環(huán)。然后打印下雷的棋盤讓玩家知道哪有雷,如果被炸死了,我們也打印下雷的二維數(shù)組讓玩家死得瞑目。

image-20210213185315518

image-20210213185338283

統(tǒng)計雷的函數(shù):

//統(tǒng)計周圍雷的個數(shù)
static int statistics_mine(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';
}

根據(jù)ASCII碼字符1減去字符0就是整形1,所以根據(jù)此方法我們就只用把周圍的雷全部加起來減去字符零就可以得到周圍雷的個數(shù)并返回 。

統(tǒng)計雷效果圖:

image-20210213185148661

周圍沒有雷就是0,如果有就顯示個數(shù)。

通關(guān)也會打印所有雷的位置并提示你是否通關(guān)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-m4tO2ZuP-1613214039851)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\image-20210213185535958.png)]

頭文件:

#pragma once
#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <stdlib.h>

#define ROW 9
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2
#define EASILY 0//雷的數(shù)量

//初始化
void initzeboard(char mine[ROWS][COLS], int rows, int cols, char val);

//顯示棋盤
void Display_board(char mine[ROWS][COLS], int row, int col);

//埋雷
void random_mine(char mine[ROWS][COLS], int row, int col);

//掃雷
void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

游戲?qū)崿F(xiàn)代碼:

#define _CRT_SECURE_NO_WARNINGS 1
#include "Game.h"

int count = 0;//統(tǒng)計還剩多少格子沒被掃


void game()//游戲?qū)崿F(xiàn)
{
	char mine[ROWS][COLS] = { 0 };//用于埋雷
	char show[ROWS][COLS] = { 0 };//用于游戲的畫面顯示

	//初始化
	initzeboard(show, ROWS, COLS, '*');
	initzeboard(mine, ROWS, COLS, '0');

	//顯示棋盤
	Display_board(show, ROW, COL);
	//Display_board(mine, ROW, COL);

	//埋雷
	random_mine(mine, ROW, COL);
	//Display_board(mine, ROW, COL);
	
	//掃雷
	mine_sweeping(mine, show, ROW, COL);
}

//初始化
void initzeboard(char mine[ROWS][COLS], int rows, int cols, char val)
{
	int i = 0;
	int j = 0;

	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			mine[i][j] = val;
		}
	}
}

//顯示棋盤
void Display_board(char mine[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;

	printf("  掃雷游戲\n");
	printf("---------------------------------\n");
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}

	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", mine[i][j]);
		}

		printf("\n");

	}
}

//埋雷
void random_mine(char mine[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = EASILY;

	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;

		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

//統(tǒng)計周圍雷的個數(shù)
static int statistics_mine(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 mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;

	while (count < row * col - EASILY)
	{
		system("cls");
		Display_board(show, COL, ROW);
		printf("請輸入坐標(biāo):>");
		scanf("%d %d", &x, &y);

		if ((1 <= x && x <= row) && (1 <= y && y <= col))
		{
			if (mine[x][y] == '0')
			{
				int leng = statistics_mine(mine, x, y);
				show[x][y] = leng + '0';
				count++;
			}
			else
			{
					printf("很遺憾你被炸死了\n");
					Display_board(mine, ROW, COL);
					break;
			}
		}
		else
		{   
				printf("請輸入有效數(shù)字!\n");
		}
	}

	if (count == row * col - EASILY)
	{
		printf("恭喜你掃雷成功!\n");
		Display_board(mine, ROW, COL);
	}
}

主函數(shù)代碼:

#define _CRT_SECURE_NO_WARNINGS 1
#include "Game.h"

extern void game();

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));

	do
	{
		printf("**************************\n");
		printf("*** 1. play 0. exit ***\n");
		printf("*** 2. clear ***\n");
		printf("**************************\n");
		printf("請選擇:>");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			game();//游戲?qū)崿F(xiàn)
			break;
		case 2://清屏選項
			system("cls");
			break;
		case 0:
			printf("退出程序!\n");
			break;
		default:
			printf("輸入錯誤,請重新輸入!\n");
			Sleep(1000);
			system("cls");
			break;
		}
	} while (input);

	return 0;
}

到此這篇關(guān)于C語言實現(xiàn)掃雷游戲詳細(xì)代碼實例的文章就介紹到這了,更多相關(guān)C語言實現(xiàn)掃雷游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解c++常成員函數(shù)和常對象

    深入理解c++常成員函數(shù)和常對象

    下面小編就為大家?guī)硪黄钊肜斫鈉++常成員函數(shù)和常對象。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
    2016-05-05
  • .h和.cpp文件的區(qū)別(zt)詳細(xì)介紹

    .h和.cpp文件的區(qū)別(zt)詳細(xì)介紹

    特別是對源文件和頭文件的概念,需要深入對它了解,本文將詳細(xì)介紹,需要了解的朋友可以參考下
    2012-11-11
  • C++優(yōu)先級隊列的使用指南與模擬實現(xiàn)

    C++優(yōu)先級隊列的使用指南與模擬實現(xiàn)

    優(yōu)先級隊列是一種特殊的隊列,其中每個元素都有一個與之關(guān)聯(lián)的優(yōu)先級,優(yōu)先級較高的元素會在隊列中較早地被處理,而優(yōu)先級較低的元素會在后續(xù)處理,本文給大家介紹C++優(yōu)先級隊列的使用指南與模擬實現(xiàn),需要的朋友可以參考下
    2023-09-09
  • C++單例設(shè)計模式詳細(xì)講解

    C++單例設(shè)計模式詳細(xì)講解

    單例模式(Singleton Pattern)是最簡單的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式,這種模式涉及到一個單一的類,該類負(fù)責(zé)創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建
    2022-06-06
  • C語言實現(xiàn)通訊錄

    C語言實現(xiàn)通訊錄

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C++ 中dynamic_cast&lt;&gt;的使用方法小結(jié)

    C++ 中dynamic_cast&lt;&gt;的使用方法小結(jié)

    將一個基類對象指針(或引用)cast到繼承類指針,dynamic_cast會根據(jù)基類指針是否真正指向繼承類指針來做相應(yīng)處理
    2013-03-03
  • C++ STL關(guān)聯(lián)式容器自定義排序規(guī)則的2種方法

    C++ STL關(guān)聯(lián)式容器自定義排序規(guī)則的2種方法

    這篇文章主要介紹了C++ STL關(guān)聯(lián)式容器自定義排序規(guī)則的2種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • OpenCV實現(xiàn)平均背景法

    OpenCV實現(xiàn)平均背景法

    這篇文章主要為大家詳細(xì)介紹了OpenCV實現(xiàn)平均背景法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++11并發(fā)編程:多線程std::thread

    C++11并發(fā)編程:多線程std::thread

    今天小編就為大家分享一篇關(guān)于C++11并發(fā)編程:多線程std::thread,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • VC實現(xiàn)批量刪除指定文件的方法

    VC實現(xiàn)批量刪除指定文件的方法

    這篇文章主要介紹了VC實現(xiàn)批量刪除指定文件的方法,是一個比較普遍且實用的功能,需要的朋友可以參考下
    2014-07-07

最新評論