1. 程式人生 > >三子棋------小遊戲c語言實現(超清晰邏輯)

三子棋------小遊戲c語言實現(超清晰邏輯)

今天用c語言來實現一個簡單有趣的小遊戲————三子棋

三子棋的規則應該都不陌生吧 -_- .......
我一步,你(電腦)一步,無論是誰,每下完一步,就判斷是否有三顆棋子在一條直線上,若在,則誰WIN!!
這句話有待會寫程式碼的邏輯思路喲!!

好啦,現在開始著手如何實現整個程式碼    0.0   --------  0.0

該程式分三個檔案來完成    test.c(存放main函式)     game.c(存放各種遊戲函式)       game.h(存放函式宣告等)

先分析一下邏輯:
一:玩一個遊戲,肯定得放在一個迴圈裡,玩完一次又來一次,知道選擇退出為止>>>>>>
所以我們在main函式裡提供一個迴圈,進入迴圈就選擇輸入選單,決定是否進入遊戲,選擇遊戲開始則進入playgame()函式,選擇退出就退出這個迴圈,程式結束。這裡我們要保證main函式裡的簡潔性,現在,main函式就搭建好了----------程式碼1---------test.c

int main()
{
	srand((unsigned int)time(NULL)); //產生隨機數種子
	int key = 0;
	do
	{
		menu();
		scanf("%d", &key);
		if (key)
		{
			playgame();
		}
		else
		{
			printf("遊戲結束\n");
			break;
		}
	} while (key);
	return 0;
}

二:首先,我們需要提供一個遊戲選單--------------程式碼2--------game.c

void menu()
{
	printf("**************   歡迎光臨  ******************\n");
	printf("**************** 請選擇 *********************\n");
	printf("*****************1.開始遊戲  ****************\n");
	printf("*****************0.結束遊戲  ****************\n");
}

三:進入遊戲後,得列印一個棋盤吧,這就得思考一下了,棋盤用什麼列印呢?待會棋盤還得放棋子呢,到底如何建立棋盤呢。嘿嘿,這裡就得用到我們的二維陣列了,想一想很nice吧!!建立棋盤二維陣列後,則應該初始化吧(全初始化為空格
),則需要一個初始化函式-------------程式碼三-------game.c
memset為一個提供記憶體初始化的庫函式,需引入標頭檔案string.h

void arr_init(char arr[ROW][CLO], int row, int clo)
{
	memset(&arr[0][0],' ',row*clo*sizeof(arr[0][0]));
}

四:棋盤建立好了得打印出來吧,so,列印棋盤為一個函式-----------------程式碼4-------game.c

void print(char arr[ROW][CLO], int row, int clo)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < clo; j++)
		{
			printf(" %c ", arr[i][j]);
			if (j <(clo - 1))
			{
				printf("|");
			}
		}

		printf("\n");

		for (j = 0; j < clo; j++)
		{
			printf("---");
			if (j <(clo - 1))
			{
				printf("|");
			}
		}
		printf("\n");
	}
	printf("\n");
}

五:每下一部棋之前,我們是不是得判斷棋盤是否已經滿了,若滿了,則遊戲結束,為平局,所以需要一個判斷是否滿盤的函式--------程式碼五------test.c

int judge_full(char arr[ROW][CLO],int row, int clo)
{
	int i = 0;
	int j = 0;
	int num = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < clo; j++)
		{
			if (arr[row][clo] == ' ')
			{
				num++;
				break;
			}
		}
	}
	if (num > 0)
		return 1;
	else
		return 0;
}

六:判斷完是否滿盤後,若遊戲沒結束,則該玩家下棋啦,則需要一個玩家下棋的函式----------程式碼六--------test.c

void play_man(char arr[ROW][CLO])
{
	int row = 0;
	int clo = 0;
	do
	{
		printf("請輸入你要下的行和列:\n");
		scanf("%d%d", &row, &clo);
		if (row > 3 || clo > 3 || row < 0 || clo < 0)
		{
			printf("輸入有誤,請重新輸入\n");
			continue;
		}
		else if (arr[row-1][clo-1] != ' ')    //坑二,不要寫成arr[row][clo];
		{
			printf("這裡有棋了,請重新輸入\n");
			continue;
		}
		else
		{
			arr[row - 1][clo - 1] = '0';
			break;
		}

	} while (1);
	
}

七:玩家下完棋,是不是得判斷是否贏了(此時也得判斷是否盤滿),若贏了,則遊戲結束,若沒贏,遊戲繼續,所以需要一個判斷是否贏的函式---------程式碼七--------test.c

int judge(char arr[ROW][CLO])
{
	int i = 0;
	for (i = 0; i < 3; i++)   //檢測行
	{
		if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][2] != ' '))
		{
			return 1;
		}
	}

	for (i = 0; i < 3; i++)   //檢測列
	{
		if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[2][i] != ' '))
		{
			return 1;
		}
	}

	if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[0][0] != ' '))
	{
		return 1;
	}
	if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && ((arr[0][2] != ' ')))
	{
		return 1;
	}
	return 0;
}

八:若遊戲沒有結束,是不是得有一個電腦下棋的函式,此時則需要引入隨機數的生成來完成電腦的下棋步驟---------程式碼八------------test.c

void play_computer(char arr[ROW][CLO])
{
	while (1)
	{
		int row = rand() % 3;
		int clo = rand() % 3;
		if (arr[row][clo] == ' ')
		{
			arr[row][clo] = '1';
			break;
		}
	}
}

九:(重點)上面二到八介紹了每一個步驟所需要的函式模組,此時,我們需要寫一個playgame()函式來將二到八所有程式碼銜接到一起,來完成:
                                                                                while(1)
<><><><><>列印棋盤------判斷滿盤------玩家輸入------判斷輸贏、判斷滿盤-----電腦輸入------判斷輸贏<><><><><><>
                                                                            這樣一個大迴圈
同樣放入game.c檔案中

void playgame()
{
	char arr[ROW][CLO] = { 0 };  
	arr_init(arr,ROW,CLO);
	int flag = 0;
	print(arr, 3, 3);
	while (1)
	{
		if (judge_full(arr, 3, 3))
		{
			printf("平局\n");
			break;
		}

		play_man(arr);
		print(arr, 3, 3);
		flag = judge(arr);
		if (flag)
		{
			printf("玩家贏\n");
			break;
		}

		else if (judge_full(arr, 3, 3))
		{
			printf("平局\n");
			break;
		}

		play_computer(arr);
		Sleep(2000);
		print(arr, 3, 3);
		flag = judge(arr);
		if (flag)
		{
			printf("電腦贏\n");
			break;
		}
			
	}
}

最後,完成game.h標頭檔案,提供每個函式的原型(聲名)

#include<stdio.h>
#include<Windows.h>
#include<string.h>
#define ROW 3
#define CLO 3
void playgame();
void arr_init(char arr[ROW][CLO], int row, int clo);
void print(char arr[ROW][CLO], int row, int clo);       //列印棋盤
void menu();                                            //列印選單
void play_man(char arr[ROW][CLO]);                      //人類下棋
int judge(char arr[ROW][CLO]);                          //判斷輸贏
void play_computer(char arr[ROW][CLO]);                 //電腦下棋           都可以寫成char arr[][3],但不能寫成char arr[][];
int judge_full(char arr[ROW][CLO], int row, int clo);   //判斷棋盤是否已滿

嘿,大功告成,三子棋小遊戲基礎版ok啦!!!!
嘿,當然有人會想這要是我來玩一局,那不穩贏嘛,呵呵,所以電腦下棋那一塊可以自己去新增一些小演算法,形成簡單、中等、困難多種模式!!這裡就不再去一一分析了,下一章將引入