1. 程式人生 > >三子棋,又稱井字棋的實現

三子棋,又稱井字棋的實現

編寫一個三子棋你需要知道的是需要哪些實現步驟:
首先,你需要有一個棋盤,這樣你就需要編寫一個初始化棋盤的函式,並能夠將棋盤打印出來;

棋盤麼,就像這種樣子:

___|___|___

___|___|___

       |       |

這個採用二維陣列就可以來實現了;

接著,你可以選擇實現pvp或者pve,這裡我實現的是pve,也就是和電腦下,這樣,你需要兩個函式,一個是給步驟,你自己下棋,另一個就是你需要電腦下棋,電腦你可以產生隨機值來實現。在這裡,你自己下棋的話需要輸入對應的格子的座標,比如1.1 2.2 3.3之類的;
另外,你需要判斷到底是誰贏了,又或者是平局。

大體思路就像這樣,接著,你需要思考的更加深入,如果該位置已經放入了棋子,那麼你需要重新輸入;棋盤已經滿了,你又不能再輸入了,那麼此刻你先要判斷到底有人贏了沒,沒有的話就是平局了。

#define _CRT_SECURE_NO_WARINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define ROWS 3//採用巨集讓棋盤大小便於修改
#define COLS 3

void init(char arr[ROWS][COLS])//棋盤初始化
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROWS; i++)
	{
		
		for (j = 0; j < COLS; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

void print(char arr[ROWS][COLS])//列印棋盤
{
	int i = 0;
	for (i = 0; i < ROWS; i++)
	{
		printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
		if (i != 2)
		{
			printf("---|---|---\n");
		}
	}
}

void player(char arr[ROWS][COLS])//人下棋函式
{
	int m, n;
	flag:
	printf("請輸入你要走的位置:");
	scanf_s("%d %d", &m, &n);
	if (arr[m - 1][n - 1] == ' ')
	{
		 arr[m - 1][n - 1] = 'X';
	}
	else
	{
		printf("該位置已有棋子,無效\n");
		goto flag;
	}
	print(arr);
}

void computer(char arr[ROWS][COLS])//電腦下棋
{
	int line = 0;
	int column = 0;
	int count = 0;
	printf("電腦下棋!!\n");
	while (1)
	{
		srand((unsigned)time(NULL));
		line = rand() % ROWS;
		column = rand() % COLS;
		if (arr[line][column] == ' ')
		{
			arr[line][column] = 'O';
				break;
		}
	}
	print(arr);
}

int full(char arr[ROWS][COLS])//判斷棋盤是否滿了
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			if (arr[i][j] == ' ')
				return 1;
		}
	}
	return 0;
}

int judge(char arr[ROWS][COLS])//判斷誰贏了,或者平局
{
	int i = 0;
	if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]))
	{
		if (arr[1][1] == 'X')
		{
			return 1;
		}
		if (arr[1][1] == 'O')
		{
			return -1;
		}
	}
	if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]))
	{
		if (arr[1][1] == 'X')
		{
			return 1;
		}
		if (arr[1][1] == 'O')
		{
			return -1;
		}
	}
	for (i = 0; i < ROWS; i++)
	{
		if ((arr[i][1] == arr[i][0]) && (arr[i][1] == arr[i][2]))
		{
			if (arr[i][1] == 'X')
			{
				return 1;
			}
			if (arr[i][1] == 'O')
			{
				return -1;
			}
		}

	}
	for (i = 0; i < COLS; i++)
	{
		if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]))
		{
			if (arr[0][i] == 'X')
			{
				return 1;
			}
			if (arr[0][i] == 'O')
			{
				return -1;
			}
		}
	}
	return 0;
}

int main()
{
	int m = 0;
	int n = 0;
	int count = 0;
	char arr[ROWS][COLS];
	init(arr);
	print(arr);
	while (1)
	{
		if (count==0)
		{
			player(arr);
			count++;
		}
		else
		{
			computer(arr);
			count--;
		}
		if (full(arr) == 0)
		{
			printf("棋盤滿了\n");
			if (judge(arr) == 1)
			{
				printf("玩家贏了\n");
				break;
			}
			else if (judge(arr) == -1)
			{
				printf("電腦贏了\n");
				break;
			}
			else
			{
				printf("平局\n");
				break;
			}
		}
		if (full(arr) == 1)
		{
			if (judge(arr) == 1)
			{
				printf("玩家贏了\n");
				break;
			}
			else if (judge(arr) == -1)
			{
				printf("電腦贏了\n");
				break;
			}
		}
	}
	system("pause");
	return 0;
}