c語言掃雷實現及閒談

閒談

昨天是11.2日,新海誠的《天氣之子》首映的第二天,我跑去看了一場。算是在忙碌的週末中給自己的一次放鬆。在本是首映的1號那天,上午在學校上了一上午的課,下午呢又有自己的日語課,同時又和自己的計算機課程衝突了。沒得辦法二選其一,我去了日語課。晚上回到宿舍就已經是10點了,複習了一下自己
白天學的知識,然後刷牙洗臉躺屍睡覺一氣呵成。第二天起來,喫完早餐,開始補習昨天沒有去的那節計算機課。看完了錄屏,就開始着手掃雷的實現了。
年少無知且懶惰的我,掃雷實現完,一看時間就已經快到電影放映的時間點了。自己一個人坐上了西安的公交,去了影院,取了票,入了座,便開始什麼也不想了,也不用想什麼了。
在這103分鐘,我只用盯着熒幕,開着導演精心準備的畫面和故事。
在我·看來這真的是有點非一般愛情故事。我很喜歡,也很感動,但沒有流淚。
森島帆高離家出走而來到了東京。在遇到麥當勞那個溫暖人心的小禮物之前,一直都在感慨東京很大啊,確實東京對於未入大學的他確實有點太大了。
就好像西安與我一樣。出了校門,就是社會,一切都定會發生翻天覆地的鉅變。我與他一樣都很害怕。
陽菜爲了找到工作謊報年齡,又何嘗不像是我們對外所表現出來的那份堅強呢。
東京很大,夏美卻找不到工作;東京很大,圭介卻有個永遠的遺憾;東京很大,小雨(那隻貓)
曾沒有家。
我在劇中看到了少年少女那種瘋狂的愛情,同時也有着自己獨特的共鳴。
西安很大,我害怕走出校門,門外邊的一切,陌生而害怕。
西安很大,我不知道我會在未來何時,也會被突如其來的事故留下永久的遺憾。
西安很大,我害怕畢業時,找不到工作,只能像帆高那樣在角落裏蜷縮。
西安很大,找不到一隻貓,能給我精神上的慰藉,能在雨夜裏報團取暖。
世界也很大,我不知道我是否想去看看,我也不知道我能否去看看。
我只知道,當下,做好我能做的每一個選擇,然後付出全力,去尊重每一個選擇。
我所喜歡的,望我遲早實現。我所佩服的,願我終將成爲你。

可以直接看這裏,看註釋哦

頭文件

#ifndef _GAME_h
#define _GAME_h
#include<stdio.h>
#include<Windows.h>
#include<time.h>
#include<stdlib.h>
#pragma  warning(disable:4996)
#define ROW 17//可以改變這兩個宏定義的值已達到修改二維矩陣的大小的功能
#define COL 17//這兩個宏定義,在後面都是以傳參的方法傳給後面的函數,因此只要改變和兩個數的大小,就可以實現表格大小的改變
void menu1();//第一個主菜單函數
void init(char a[][COL], char b[][COL], int x, int y);//初始化函數
void hide(char a[][COL], int x, int y,int z,int *x_first,int *y_first);//隨機數藏雷的函數
void show(char a[][COL], int x, int y,int z);//展示函數,這裏的這個int z是爲了避免展示PE表格時,PE表格經過檢索周圍的8各方各正好只有一個雷後,打印出來的1是紅色字體。
int remove(char a[][COL], char b[][COL],int x, int y,int z,int *p,int *q,int defult);//輸入座標的函數,defult參數是前面的難度選擇有關的一個參數
void menu2();//難度選擇的函數

#endif

函數實現

#include"game.h"

void menu2()
{
	printf("       歡迎來到掃雷遊戲!\n");
	printf("########################################\n");
	printf("########################################\n");
	printf("#####     1.偷懶摸魚 (1/4雷)     #####\n");
	printf("#####     2.小心翼翼 (1/3雷)     #####\n");
	printf("#####     3.原地昇天 (1/2雷)     #####\n");
	printf("########################################\n");
	printf("請選擇難度!!\n");
}
void menu1()
{
	printf("       歡迎來到掃雷遊戲!\n");
	printf("################################\n");
	printf("################################\n");
	printf("#####        1.開始        #####\n");
	printf("#####        2.退出        #####\n");
	printf("################################\n");
}
void init(char a[][COL], char b[][COL], int x, int y)//整個錶盤全部初始化。
{
	for (int ab = 0; ab < ROW; ab++)
	{
		for (int cd = 0; cd < COL; cd++)
		{
			a[ab][cd] = '*';//
			b[ab][cd] = '0';//pc
		}
	}
}
void hide(char a[][COL], int x, int y,int z,int *x_first,int *y_first,int defult)
{
	
	int p = 0, q = 0;
	
	do
	{
		p++;
		int x_mine = rand() % (ROW-2) + 1;//隨機數埋雷的埋雷座標,數學算法發的邏輯是,通過該算法,是範圍會默認在中間部位,暨上下左右各少一行一列。
		int y_mine = rand() % (COL-2) + 1;
		if (a[x_mine][y_mine] = '0')
		{
			
			if (p== 1)
			{
				*x_first = x_mine;
				*y_first = y_mine;//第一次踩雷,則傳出第一次的踩雷座標//然後重來
				continue;
			}
			else
			{
				q++;
				a[x_mine][y_mine] = '1';//埋雷
			}
		}
		else
		{
			continue;
		}
	} while (z--);//z是雷的個數,通過z--來判斷埋雷的次數和個數,知道埋玩符合難度設定的雷的個數之後,就停止埋雷
}

	

void show(char a[ROW][COL], int x, int y,int z)//展示與傳入數組相對應的棋盤。病顯示不同的顏色
{
	printf("    ");
	for (int m = 1; m <= x - 2; m++)
	{
		printf(" %2d  |", m);
	}
	printf("\n");
	for (int line = 0; line < x - 2; line++)
		printf("-------");
	printf("\n");

	for (int m = 1; m <= x-2; m++)
	{
		printf(" %2d|", m);
		for (int n = 1; n <= y - 2; n++)
		{
			printf(" ");
			if (a[m][n] == '1'&&z)
			{
				HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
				SetConsoleTextAttribute(hConsole, 0xC);
				printf(" %c  ", a[m][n]);
				SetConsoleTextAttribute(hConsole, 0xF);
			}
			else if (a[m][n] == '*')
			
			{
				HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
				SetConsoleTextAttribute(hConsole, 02);
				printf(" %c  ", a[m][n]);
				SetConsoleTextAttribute(hConsole, 0xF);
			}
			else
			{
				HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
				SetConsoleTextAttribute(hConsole, 0xF);
				printf(" %c  ", a[m][n]);
				SetConsoleTextAttribute(hConsole, 0xC);
			}
			HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
			SetConsoleTextAttribute(hConsole, 0xF);
			printf("|");
			SetConsoleTextAttribute(hConsole, 0xF);
		}
		HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
		SetConsoleTextAttribute(hConsole, 0xF);
		printf("\n");
		for (int line = 0; line < x - 2; line++)
			printf("-------");
		printf("\n");
		SetConsoleTextAttribute(hConsole, 0xF);
	}
}
int remove(char a[][COL], char b[][COL], int x, int y, int z, int *p, int *q,int defult)//ape bpc  
{
	int quit = 0;
	printf("請輸入你確定的座標!(第 行 第 列)\n");
	
	int m = 0, n = 0;
	while (!quit)
	{
		scanf("%d,%d", &m, &n);
		if (m < 1 || m>x-2 || n < 1 || n>y-2)
		{
			printf("輸入座標不合法,請重新輸入\n");
			quit = 0;
		}
		else
		{
			quit = 1;
			break;
		}
	}
	if (b[m][n] == '1')
	{
		if (z == ROW*COL/(5-defult))
		{
			printf("你運氣真好,第一次就踩到了雷!\n饒你一次,5s繼續下!!!\n");
			for (int times = 5; times >= 0; times--)
			{
				Sleep(1000);
				printf("   %d\r", times);
			}
			m = *p;
			n = *q;
			b[m][n] = '0';
		}
		else
		{
			return 0;
		}
	}
	int g = 0;
	g = (b[m - 1][n - 1] + b[m - 1][n] + b[m - 1][n + 1] + b[m][n - 1]
		+ b[m][n + 1] + b[m + 1][n - 1] + b[m + 1][n] + b[m + 1][n + 1]) - 8 * '0';//周圍8個方格相加,-8*‘0‘得到一個int值;
	a[m][n] =  48+g;//int值+48轉換爲ascll碼顯示
		return 1;
	
}

主調邏輯

#include"game.h"
int main()
{
	
	srand((unsigned long)time(NULL));
	char PE[ROW][COL];//創建一張二維數組表,用來存放用戶輸入的座標,並且經輸入座標後,對改座標位置展開。形成嘻信息反饋
	char PC[ROW][COL];//二維數組矩陣用來供電腦以隨機數的形式生成地雷
	int mine_numbers = 0;//地雷的數量。後面會以參數的形式傳給函數,提前聲明方便
	int x_first = 0, y_first = 0;//兩個數形成一個座標,作用是在第一次就出雷的情況下,讓遊戲重新開始。會以參數的形式傳給函數

	int key = 1;
	loop:menu1();
	int quit = 1;//控制後面的do while循環
	do
	{
		int select = 0;
		scanf("%d", &select);//結合菜單輸入功能號,結合switch語句,能夠實現分支選擇。
		switch (select)
		{
		case 1:
			menu2();//難度選擇菜單
			int defult = 0;
			scanf("%d", &defult);//難度選擇
			switch (defult)
			{
			case 1:printf("你選擇的是第1種難度!!\n"); break;
			case 2:printf("你選擇的是第2種難度!!\n"); break;
			case 3:printf("你選擇的是第3種難度!!\n"); break;
			default:printf("輸入錯誤,進行最難模式懲罰!!\n");
				defult = 3;
				break;
			}
			mine_numbers = ROW*COL / (5-defult);//通過整個矩陣的大小,以及難度選擇的難易程度,來決定要藏得雷有多少個,會以參數的形式傳入函數
			init(PE,PC,ROW,COL);//初始化兩個二維數組結合init函數,具體查看初始化的結果
			hide(PC, ROW, COL, mine_numbers,&x_first,&y_first,defult);//根據傳入的參數和對應的二維數組隨機埋入雷,具體請看實現
			printf("\n\t\t##############             PE               ###########\n");
			show(PE, ROW, COL,0);//展示整個二維數組
			do
			{
				
				key=remove(PE, PC, ROW, COL, mine_numbers, &x_first, &y_first,defult);
				if (key != 0)
				{
					system("cls");
				}	
				printf("\n\t\t##############             PE               ###########\n");
				show(PE, ROW, COL,0);
				mine_numbers--;
			} while (mine_numbers > 0 && key!=0);//這個do while相當於一個判斷函數,能判斷掃雷的結果
			printf("\n\t\t##############             PC               ###########\n");
			show(PC, ROW, COL, 1);//同理打印
			if (key == 0)
			{
				printf("boom!boom!boom!boom!boom!\nboom!boom!boom!boom!boom!boom!\n");//你完了炸了
				printf("###################################\n");
				printf("         是否再來一局?\n");
				printf("####1.再來一局       2.退出########\n");
				printf("###################################\n");

				int next = 0;
				scanf("%d", &next);
				do
				switch (next)
				{
				case 1:goto loop; break;
				case 2:printf("BYE BYE!\n");return 0;
				default:
					printf("輸入正確的選項!\n");
					next = 1;
				}while (next);//實現是否繼續遊玩的功能
		}
			break;
		case 2:
			quit = 0;
			break;
		default:
			printf("請輸入合法的功能選項!\n");

		}
	} while (quit&&key);//整個打的dowhile使如果你選擇了繼續遊玩還能繼續循環
	printf("BYE BYE!\n");
	system("pause");
}

今天嘗試一下給代碼寫註釋,而不去寫那麼多的文字分析。我會先試試分享給同學看,問問他們能看看懂不,畢竟寫博客還是要人人看懂的。
另外呢,我也不知道在博客之中寫一些個人的觀點這種對不對,但是我覺得我還是會堅持下去的。我寫博客的初衷就是記錄。
記錄下自己在學習過程中的感悟,思考。我覺得如果在未來我有時間,我能回頭來來看一下我寫的博客,我能找回我當初寫這一篇,或者某一篇博客的時候我能回憶起一些或許美好,或許辛酸的往事。
畢竟,時過境遷,我終究不會再是往年的那個少年

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章