最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)掃雷小游戲的示例代碼

 更新時間:2022年10月26日 16:09:16   作者:蝸牛牛啊  
這篇文中主要為大家詳細(xì)介紹了如何利用C語言實現(xiàn)經(jīng)典的掃雷小游戲。掃雷小游戲主要是利用字符數(shù)組、循環(huán)語句和函數(shù)實現(xiàn),感興趣的小伙伴可以了解一下

一、掃雷

掃雷小游戲主要是利用字符數(shù)組、循環(huán)語句和函數(shù)實現(xiàn)。

設(shè)計思路:雷盤大小為9*9,但是為了后續(xù)能更好的統(tǒng)計出雷的個數(shù)在定義數(shù)組的時候定義大小為11*11,先定義兩個字符數(shù)組,一個用來記錄雷的位置,另一個用來展現(xiàn)給玩家,初始化雷盤,將兩個字符數(shù)組分別全部賦值為字符0和字符*,打印棋盤,隨機(jī)設(shè)置雷所在位置,根據(jù)玩家輸入的坐標(biāo)排查上下左右8個格子中的雷,并判斷輸入坐標(biāo)處是否有雷。

玩法:玩家選擇開始游戲之后,輸入坐標(biāo),如果坐標(biāo)處有雷,輸入坐標(biāo)處標(biāo)記為$,并打印出來游戲結(jié)束重新選擇;如果坐標(biāo)處沒有雷,統(tǒng)計出附近8個格子中雷的個數(shù)并在輸入坐標(biāo)處展現(xiàn)出來;如果輸入坐標(biāo)已經(jīng)被排查過了,則提示已排查過。

1.演示效果

為了更好的演示,將雷的個數(shù)設(shè)置為79個,同時將顯示出雷的位置的雷盤也展現(xiàn)出來。

具體效果如下:

2.完整代碼

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9//展現(xiàn)出來的行
#define COL 9//展現(xiàn)出來的列

#define ROWS ROW+2//全部的行
#define COLS COL+2//全部的列

#define MINE 79//雷的個數(shù)
void Init_board(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 Print_board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);//打印出來列號
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ",i);//打印出來行號
		for (j = 1; j <= row; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}
void Set_mine(char mine[ROWS][COLS], int row, int col)
{
	int count = MINE;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}
int Get_mine(char mine[ROWS][COLS], int x, int y)
{
	return (mine[x - 1][y] +
		mine[x - 1][y - 1] +
		mine[x][y - 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] +
		mine[x][y + 1] +
		mine[x - 1][y + 1] - 8 * '0');

}
void Find_mine(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-MINE)
	{
		printf("請輸入坐標(biāo)>:");
		scanf("%d%d",&x,&y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (show[x][y] == '*')
			{
				if (mine[x][y] == '1')
				{
					printf("你被炸死了,通關(guān)失敗!\n");
					show[x][y] = '$';//炸死時用符號$代表所輸入的坐標(biāo)
					Print_board(show, row, col);
					break;
				}
				else
				{
					int count = Get_mine(mine, x, y) + '0';
					show[x][y] = count;
					Print_board(show, row, col);
					win++;
				}
			}
			else
			{
				printf("輸入的坐標(biāo)已被排查過,請重新輸入!\n");
			}
		}
		else
		{
			printf("輸入的坐標(biāo)非法,請重新輸入!\n");
		}
	}
	if (win == row * col - MINE)
	{
		printf("恭喜你,成功通關(guān)!\n");
		Print_board(show, row, col);
	}
}
void game()
{
	//定義兩個數(shù)組,mine用來記錄雷的位置,show展現(xiàn)給玩家
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化雷盤
	//全部初始化為字符0和字符*
	Init_board(mine, ROWS, COLS,'0');
	Init_board(show, ROWS, COLS, '*');

	//打印雷盤
	//Print_board(mine, ROW, COL);
	Print_board(show, ROW, COL);

	//布置雷
	Set_mine(mine, ROW, COL);
	Print_board(mine, ROW, COL);
	
	//排雷
	Find_mine(mine, show, ROW, COL);
}
void menu()
{
	printf("************************\n");
	printf("****  1.開始游戲    ****\n");
	printf("****  0.結(jié)束游戲    ****\n");
	printf("************************\n");
}
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("游戲結(jié)束!\n");
			break;
		default:
			printf("選擇錯誤,請重新選擇!\n");
			break;
		}
	} while (input);
}

二、代碼解析

1.初始化雷盤

//初始化雷盤
void Init_board(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;
		}
	}
}

char set是用來接收傳過來的字符。

2.打印雷盤

//打印雷盤
void Print_board(char board[ROWS][COLS], int row, int col)
{
    int i = 0;
    int j = 0;
    for (j = 0; j <= col; j++)
    {
        printf("%d ", j);//打印出來列號
    }
    printf("\n");
    for (i = 1; i <= row; i++)
    {
        printf("%d ", i);//打印出來行號
        for (j = 1; j <= row; j++)
        {
            printf("%c ", board[i][j]);
        }
        printf("\n");
    }
}

打印雷盤時將其所在的序列號也打印了出來。

3.布置雷

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

通過用rand函數(shù)和srand函數(shù)生成隨機(jī)坐標(biāo)布置雷的位置,一共布置count個雷。

4.排雷

int Get_mine(char mine[ROWS][COLS], int x, int y)
{
    return (mine[x - 1][y] +
        mine[x - 1][y - 1] +
        mine[x][y - 1] +
        mine[x + 1][y - 1] +
        mine[x + 1][y] +
        mine[x + 1][y + 1] +
        mine[x][y + 1] +
        mine[x - 1][y + 1] - 8 * '0');

}
void Find_mine(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 - MINE)
    {
        printf("請輸入坐標(biāo)>:");
        scanf("%d%d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            if (show[x][y] == '*')
            {
                if (mine[x][y] == '1')
                {
                    printf("你被炸死了,通關(guān)失??!\n");
                    show[x][y] = '$';//炸死時用符號$代表所輸入的坐標(biāo)
                    Print_board(show, row, col);
                    break;
                }
                else
                {
                    int count = Get_mine(mine, x, y) + '0';
                    show[x][y] = count;
                    Print_board(show, row, col);
                    win++;
                }
            }
            else
            {
                printf("輸入的坐標(biāo)已被排查過,請重新輸入!\n");
            }
        }
        else
        {
            printf("輸入的坐標(biāo)非法,請重新輸入!\n");
        }
    }
    if (win == row * col - MINE)
    {
        printf("恭喜你,成功通關(guān)!\n");
        Print_board(show, row, col);
    }
}

Get_mine函數(shù)用來計算輸入坐標(biāo)附近的雷的個數(shù),通過附近字符1相加之后減去8個字符0計算出來,減去字符0是因為字符1和字符0的ASCII碼值相差1,利用這個規(guī)則將字符轉(zhuǎn)化為數(shù)字。Find_mine函數(shù)通過輸入的坐標(biāo),判斷坐標(biāo)處是否為雷或展現(xiàn)出附近雷的個數(shù)亦或者結(jié)束游戲。

5.游戲函數(shù)主體

void game()
{
	//定義兩個數(shù)組,mine用來記錄雷的位置,show展現(xiàn)給玩家
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化雷盤
	//全部初始化為字符0和字符*
	Init_board(mine, ROWS, COLS, '0');
	Init_board(show, ROWS, COLS, '*');

	//打印雷盤
	//Print_board(mine, ROW, COL);
	Print_board(show, ROW, COL);

	//布置雷
	Set_mine(mine, ROW, COL);
	Print_board(mine, ROW, COL);

	//排雷
	Find_mine(mine, show, ROW, COL);
}

6.菜單函數(shù)

void menu()
{
    printf("************************\n");
    printf("****  1.開始游戲    ****\n");
    printf("****  0.結(jié)束游戲    ****\n");
    printf("************************\n");
}

7.頭文件、宏定義及主函數(shù)

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9//展現(xiàn)出來的行
#define COL 9//展現(xiàn)出來的列

#define ROWS ROW+2//全部的行
#define COLS COL+2//全部的列

#define MINE 79//雷的個數(shù)
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("游戲結(jié)束!\n");
			break;
		default:
			printf("選擇錯誤,請重新選擇!\n");
			break;
		}
	} while (input);
}

以上就是C語言實現(xiàn)掃雷小游戲的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C語言掃雷游戲的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Opencv實現(xiàn)最小外接矩形和圓

    Opencv實現(xiàn)最小外接矩形和圓

    這篇文章主要為大家詳細(xì)介紹了Opencv實現(xiàn)最小外接矩形和圓,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 淺析C/C++變量在內(nèi)存中的分布

    淺析C/C++變量在內(nèi)存中的分布

    變量在內(nèi)存地址的分布為:堆-棧-代碼區(qū)-全局靜態(tài)-常量數(shù)據(jù)。同一區(qū)域的各變量按聲明的順序在內(nèi)存的中依次由低到高分配空間(只有未賦值的全局變量是個例外)
    2013-09-09
  • C/CPP運算優(yōu)先級的坑及解決

    C/CPP運算優(yōu)先級的坑及解決

    這篇文章主要介紹了C/CPP運算優(yōu)先級的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++踩坑實戰(zhàn)之構(gòu)造和析構(gòu)函數(shù)

    C++踩坑實戰(zhàn)之構(gòu)造和析構(gòu)函數(shù)

    不論是構(gòu)造函數(shù),還是析構(gòu)函數(shù),都是C++、C#語言相對于其他語言而言特殊的地方,它是為了方便類中對象的初始化,這篇文章主要給大家介紹了關(guān)于C++踩坑實戰(zhàn)之構(gòu)造和析構(gòu)函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • C++ const限定符以及頂層const和底層const的案例詳解

    C++ const限定符以及頂層const和底層const的案例詳解

    這篇文章主要介紹了C++ const限定符以及頂層const和底層const的案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C語言實現(xiàn)翻譯功能

    C語言實現(xiàn)翻譯功能

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單的翻譯功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C語言中多維數(shù)組的內(nèi)存分配和釋放(malloc與free)的方法

    C語言中多維數(shù)組的內(nèi)存分配和釋放(malloc與free)的方法

    寫代碼的時候會碰到多維數(shù)組的內(nèi)存分配和釋放問題,在分配和釋放過程中很容易出現(xiàn)錯誤。下面貼上一些示例代碼,以供參考。
    2013-05-05
  • C語言實現(xiàn)簡單圖書管理系統(tǒng)

    C語言實現(xiàn)簡單圖書管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言進(jìn)階之內(nèi)存操作函數(shù)詳解

    C語言進(jìn)階之內(nèi)存操作函數(shù)詳解

    這篇文章主要為大家學(xué)習(xí)介紹了C語言中內(nèi)存操作函數(shù)(memcpy、memmove和memcmp)的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-07-07
  • 使用C語言求解撲克牌的順子及n個骰子的點數(shù)問題

    使用C語言求解撲克牌的順子及n個骰子的點數(shù)問題

    這篇文章主要介紹了使用C語言求解撲克牌的順子及n個骰子的點數(shù)問題的方法,解答實例主要為了突出解題的算法,需要的朋友可以參考下
    2016-03-03

最新評論

乐业县| 鲁山县| 江阴市| 沙坪坝区| 新津县| 海原县| 南陵县| 龙口市| 胶州市| 海安县| 济宁市| 永寿县| 永宁县| 新兴县| 郎溪县| 军事| 永昌县| 冀州市| 靖远县| 玉林市| 郎溪县| 平安县| 宜丰县| 香港 | 太仓市| 阜城县| 兴宁市| 琼海市| 雷州市| 哈密市| 镶黄旗| 通许县| 鹤岗市| 濮阳县| 得荣县| 阿克| 岑巩县| 根河市| 甘洛县| 竹北市| 彰武县|