c語言簡單實現三子棋(五子棋)

c語言簡單實現三子棋(五子棋)

此版本三子棋,我將其命名爲三子棋1.0,其特點在於玩家無法贏取電腦,最大可能是和電腦平局,否則就是電腦贏
若想讓玩家取勝,也可以。只需將代碼中的函數game()裏面玩家的走動放在電腦前面即可,即讓玩家先手移動。

話不多說,直接上代碼:
1.三子棋:
 
#define _CRT_SECURE_NO_WARNINGS 1

#ifndef _GAME_H_
#define _GAME_H_


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define ROW  3  //定義行寬
#define COL  3  //定義列高


void init_tic(char arr[ROW][COL], int row, int col);  //初始化數組 
void stamp_tic(char arr[ROW][COL], int row, int col);  //打印數組  
void computer_move(char arr[ROW][COL], int row, int col);  //電腦走  
void player_move(char arr[ROW][COL], int row, int col);  //玩家走
char judge_win(char arr[ROW][COL], int row, int col);   //判斷是否有勝出  
char is_full(char arr[ROW][COL], int row, int col);  //判斷棋盤是否已滿
char check_tic(char arr[ROW][COL], int row, int col);  //電腦判斷是否可以勝出 
char judge_tic(char arr[ROW][COL], int row, int col, int k);  //電腦判斷玩家是否可以勝出

#endif // _GAME_H_

void game()
{
	char arr[ROW][COL];
	char ret = 0;
	init_tic(arr, ROW, COL);

	while (1)
	{
		stamp_tic(arr, ROW, COL);
		computer_move(arr, ROW, COL);
		if ((ret = judge_win(arr, ROW, COL)) != ' ')
			break;

		stamp_tic(arr, ROW, COL);
		player_move(arr, ROW, COL);
		if ((ret = judge_win(arr, ROW, COL)) != ' ')
			break;
	}

	stamp_tic(arr, ROW, COL);
	if ('X' == ret)  //返回X,表示玩家贏
	{
		printf("\n恭喜你,你贏啦!\n\n");
	}

	else if ('0' == ret)  //返回0,表示電腦贏
	{
		printf("\n呵呵,電腦贏了!\n\n");
	}

	else if ('Q' == ret)  //返回Q,表示平局
	{
		printf("\n平局哦!\n\n");
	}
}


void menu()   //menu爲創建菜單函數
{
	printf("*****************************************************\n");
	printf("*****************     歡迎來到三子棋     ************\n");
	printf("********************     1. play     ****************\n");
	printf("********************     0. exit     ****************\n");
	printf("*****************************************************\n");
}

int main()
{
	int input = 0;
	srand((unsigned)time(NULL));//產生隨機數
	do
	{
		menu();
		printf("\n請輸入:<");
		scanf("%d", &input);
		printf("\n");
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("輸入錯誤!\n");
			break;
		}
	} while (input);
	system("pause");
	return 0;
}

//初始化數組內容爲空格

void init_tic(char arr[ROW][COL], int row, int col) 
{
	memset(arr, ' ', row*col*sizeof(char));
}

void stamp_tic(char arr[ROW][COL], int row, int col) //打印數組
{
	int i = 0;
	printf("-------------\n");
	for (i = 0; i < row; i++)
	{
		printf("| %c | %c | %c |\n", arr[i][0], arr[i][1], arr[i][2]);
		if (i != 2)
		{
			printf("|---|---|---|\n");
		}
	}
	printf("-------------\n\n");
}

//玩家移動

void player_move(char arr[ROW][COL], int row, int col) 
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("玩家走!\n");
		printf("請輸入座標:<");
		scanf("%d%d", &x, &y); //玩家選擇座標
		printf("\n");
		if ((x > 0 && x <= 3) && (y > 0 && y <= 3)) //判斷輸入座標是否正確,若正確則移動
		{
			x--;
			y--;
			if (arr[x][y] == ' ')
			{
				arr[x][y] = 'X';
				break;
			}
			else
			{
				printf("下表有誤,請重新輸入:<");
			}
		}
		else
		{
			printf("下表有誤,請重新輸入:<");
		}
	}
}

//電腦判斷玩家是否會贏,會贏取的話,則堵截玩家

char judge_tic(char arr[ROW][COL], int row, int col, int k) 
{
	int i = 0;
	int j = 0;
	while (0 == k)
	{
		for (i = 0; i < row; i++)  //判斷玩家在橫行上是否會贏
		{
			if ((arr[i][0] == arr[i][1])
				&& (arr[i][1] == 'X')
				&& (arr[i][2] == ' '))
			{
				arr[i][2] = '0';
				k = 1;
				break;
			}

			if ((arr[i][0] == arr[i][2])
				&& (arr[i][0] == 'X')
				&& (arr[i][1] == ' '))
			{
				arr[i][1] = '0';
				k = 1;
				break;
			}

			if ((arr[i][1] == arr[i][2])
				&& (arr[i][1] == 'X')
				&& (arr[i][0] == ' '))
			{
				arr[i][0] = '0';
				k = 1;
				break;
			}
		}

		if (k != 0)
			break;

		for (j = 0; j < col; j++)  //判斷玩家在豎列上是否會贏
		{
			if ((arr[0][j] == arr[1][j])
				&& (arr[1][j] == 'X')
				&& (arr[2][j] == ' '))
			{
				arr[2][j] = '0';
				k = 1;
				break;
			}

			if ((arr[0][j] == arr[2][j])
				&& (arr[2][j] == 'X')
				&& (arr[1][j] == ' '))
			{
				arr[1][j] = '0';
				k = 1;
				break;
			}

			if ((arr[1][j] == arr[2][j])
				&& (arr[2][j] == 'X')
				&& (arr[0][j] == ' '))
			{
				arr[0][j] = '0';
				k = 1;
				break;
			}
		}
		break;
	}

	while (0 == k)  //判斷玩家在對角線上是否會贏
	{
		if ((arr[0][0] == arr[1][1])
			&& (arr[1][1] == 'X')
			&& (arr[2][2] == ' '))
		{
			arr[2][2] = '0';
			k = 1;
			break;
		}

		if ((arr[0][0] == arr[2][2])
			&& (arr[2][2] == 'X')
			&& (arr[1][1] == ' '))
		{
			arr[1][1] = '0';
			k = 1;
			break;
		}

		if ((arr[1][1] == arr[2][2])
			&& (arr[1][1] == 'X')
			&& (arr[0][0] == ' '))
		{
			arr[0][0] = '0';
			k = 1;
			break;
		}

		if ((arr[0][2] == arr[1][1])
			&& (arr[0][2] == 'X')
			&& (arr[2][0] == ' '))
		{
			arr[2][0] = '0';
			k = 1;
			break;
		}

		if ((arr[0][2] == arr[2][0])
			&& (arr[2][0] == 'X')
			&& (arr[1][1] == ' '))
		{
			arr[1][1] = '0';
			k = 1;
			break;
		}

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

//電腦判斷是否可以勝出

char check_tic(char arr[ROW][COL], int row, int col) 
{
	int i = 0;
	int j = 0;
	int k = 0;
	while (0 == k)
	{
		for (i = 0; i < row; i++)
		{
			if ((arr[i][0] == arr[i][1])
				&& (arr[i][1] == '0')
				&& (arr[i][2] == ' '))
			{
				arr[i][2] = '0';
				k = 1;
				break;
			}

			if ((arr[i][0] == arr[i][2])
				&& (arr[i][0] == '0')
				&& (arr[i][1] == ' '))
			{
				arr[i][1] = '0';
				k = 1;
				break;
			}

			if ((arr[i][1] == arr[i][2])
				&& (arr[i][1] == '0')
				&& (arr[i][0] == ' '))
			{
				arr[i][0] = '0';
				k = 1;
				break;
			}
		}
		if (k != 0)
			break;
		for (j = 0; j < col; j++)
		{
			if ((arr[0][j] == arr[1][j])
				&& (arr[1][j] == '0')
				&& (arr[2][j] == ' '))
			{
				arr[2][j] = '0';
				k = 1;
				break;
			}

			if ((arr[0][j] == arr[2][j])
				&& (arr[2][j] == '0')
				&& (arr[1][j] == ' '))
			{
				arr[1][j] = '0';
				k = 1;
				break;
			}

			if ((arr[1][j] == arr[2][j])
				&& (arr[2][j] == '0')
				&& (arr[0][j] == ' '))
			{
				arr[0][j] = '0';
				k = 1;
				break;
			}
		}
		break;
	}

	while (0 == k)
	{
		if ((arr[0][0] == arr[1][1])
			&& (arr[1][1] == '0')
			&& (arr[2][2] == ' '))
		{
			arr[2][2] = '0';
			k = 1;
			break;
		}

		if ((arr[0][0] == arr[2][2])
			&& (arr[2][2] == '0')
			&& (arr[1][1] == ' '))
		{
			arr[1][1] = '0';
			k = 1;
			break;
		}

		if ((arr[1][1] == arr[2][2])
			&& (arr[1][1] == '0')
			&& (arr[0][0] == ' '))
		{
			arr[0][0] = '0';
			k = 1;
			break;
		}

		if ((arr[0][2] == arr[1][1])
			&& (arr[0][2] == '0')
			&& (arr[2][0] == ' '))
		{
			arr[2][0] = '0';
			k = 1;
			break;
		}

		if ((arr[0][2] == arr[2][0])
			&& (arr[2][0] == '0')
			&& (arr[1][1] == ' '))
		{
			arr[1][1] = '0';
			k = 1;
			break;
		}

		if ((arr[1][1] == arr[2][0])
			&& (arr[2][0] == '0')
			&& (arr[0][2] == ' '))
		{
			arr[0][2] = '0';
			k = 1;
			break;
		}
		break;
	}
	k = judge_tic(arr, row, col, k);
	return k;
}

//電腦產生隨機座標,移動

void computer_move(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	int z = 0;
	printf("電腦走!\n\n");
	z = check_tic(arr, row, col);

	while (0 == z)
	{
		x = rand() % 3;
		y = rand() % 3;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '0';
			z = 1;
			break;
		}
	}
}

//判斷棋盤是否已經下滿

char is_full(char arr[ROW][COL], int row, int col) 
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

//判斷是否有勝出

char judge_win(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;

	for (i = 0; i < row; i++)  //判斷行是否有三個一致
	{
		if ((arr[i][0] == arr[i][1])
			&& (arr[i][1] == arr[i][2])
			&& (arr[i][1] != ' '))
		{
			return arr[i][1];
		}
	}

	for (j = 0; j < col; j++)  //判斷列是否有三個一致
	{
		if ((arr[0][j] == arr[1][j])
			&& (arr[1][j] == arr[2][j])
			&& (arr[1][j] != ' '))
		{
			return arr[1][j];
		}
	}

	if ((arr[0][0] == arr[1][1])  //判斷正對角線是否三個一致 
		&& (arr[1][1] == arr[2][2])
		&& (arr[1][1] != ' '))
		return arr[1][1];

	if ((arr[0][2] == arr[1][1]) //判斷斜對角線是否三個一致
		&& (arr[1][1] == arr[2][0])
		&& (arr[1][1] != ' '))
		return arr[1][1];

	if (is_full(arr, row, col))  //判斷棋盤上是否還有空格
	{
		return 'Q'; //返回Q,表示平局
	}
	return ' ';  //返回空格,表示遊戲繼續
}


 運行結果如下:


 2.五子棋
此版本的五子棋,極爲低端,因爲我並未在五子棋中加入電腦判斷,所以電腦會笨一些,所以就比較Low一點。
  代碼如下:
#define _CRT_SECURE_NO_WARNINGS 1

#ifndef _GAME_H_
#define _GAME_H_


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define ROW  5
#define COL  5


void init_tic(char arr[ROW][COL], int row, int col);
void stamp_tic(char arr[ROW][COL], int row, int col);
void computer_move(char arr[ROW][COL], int row, int col);
void player_move(char arr[ROW][COL], int row, int col);
char judge_win(char arr[ROW][COL], int row, int col);
char is_full(char arr[ROW][COL], int row, int col);

#endif // _GAME_H_


void game()
{
	char arr[ROW][COL];
	char ret = 0;
	init_tic(arr, ROW, COL);  //初始化數組
	stamp_tic(arr, ROW, COL); //打印數組
	while (1)
	{
		player_move(arr, ROW, COL);  //玩家走
		if ((ret = judge_win(arr, ROW, COL)) != ' ')  //判斷是否有勝出
			break;
		stamp_tic(arr, ROW, COL);
		computer_move(arr, ROW, COL); //電腦走
		if ((ret = judge_win(arr, ROW, COL)) != ' ')
			break;
		stamp_tic(arr, ROW, COL);
	}
	stamp_tic(arr, ROW, COL);
	if ('X' == ret)   //返回X,表示玩家贏
	{
		printf("\n恭喜你,你贏啦!\n\n");
	}
	else if ('0' == ret)  //返回0,表示電腦贏
	{
		printf("\n呵呵,電腦贏了!\n\n");
	}
	else if ('Q' == ret)  //返回Q,表示平局 
	{
		printf("\n平局哦!\n\n");
	}
}


void menu()   //menu爲創建菜單函數
{
	printf("*****************************************************\n");
	printf("****************       歡迎來到五子棋    ************\n");
	printf("********************     1. play     ****************\n");
	printf("********************     0. exit     ****************\n");
	printf("*****************************************************\n");
}

int main()
{
	int input = 0;
	srand((unsigned)time(NULL));
	do
	{
		menu();
		printf("\n請輸入:<");
		scanf("%d", &input);
		printf("\n");
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("輸入錯誤!\n");
			break;
		}
	} while (input);
	system("pause");
	return 0;
}


void init_tic(char arr[ROW][COL], int row, int col)
{
	memset(arr, ' ', row*col*sizeof(char));  //初始化數組內容爲空格
}

void stamp_tic(char arr[ROW][COL], int row, int col) //打印數組
{
	int i = 0;
	printf("---------------------\n");
	for (i = 0; i < row; i++)
	{
		printf("| %c | %c | %c | %c | %c |\n",
			arr[i][0], arr[i][1], arr[i][2], arr[i][3], arr[i][4]);
		if (i != 4)
		{
			printf("|---|---|---|---|---|\n");
		}
	}
	printf("---------------------\n\n");
}

void player_move(char arr[ROW][COL], int row, int col) //玩家移動
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("請輸入座標:<");
		scanf("%d%d", &x, &y); //玩家選擇座標
		printf("\n");
		if ((x > 0 && x <= 5) && (y > 0 && y <= 5)) //判斷輸入座標是否正確,若正確則移動
		{
			x--;
			y--;
			if (arr[x][y] == ' ')
			{
				arr[x][y] = 'X';
				break;
			}
			else
			{
				printf("下表有誤,請重新輸入:<");
			}
		}
		else
		{
			printf("下表有誤,請重新輸入:<");
		}
	}
}

void computer_move(char arr[ROW][COL], int row, int col) //電腦移動
{
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % 5;  //電腦產生隨機座標,並移動
		y = rand() % 5;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '0';
			break;
		}
	}
}

char is_full(char arr[ROW][COL], int row, int col) //判斷棋盤是否已經下滿
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] == ' ')  //判斷棋盤是否還有空格
				return 0;
		}
	}
	return 1;
}

char judge_win(char arr[ROW][COL], int row, int col) //判斷勝負
{
	int i = 0;
	int j = 0;

	for (i = 0; i < row; i++)  //判斷橫行是否有勝出
	{
		if ((arr[i][0] == arr[i][1])
			&& (arr[i][1] == arr[i][2])
			&& (arr[i][2] == arr[i][3])
			&& (arr[i][3] == arr[i][4])
			&& (arr[i][1] != ' '))
		{
			return arr[i][1];
		}
	}

	for (j = 0; j < col; j++) //判斷豎列是否有勝出
	{
		if ((arr[0][j] == arr[1][j])
			&& (arr[1][j] == arr[2][j])
			&& (arr[2][j] == arr[3][j])
			&& (arr[3][j] == arr[4][j])
			&& (arr[1][j] != ' '))
		{
			return arr[1][j];
		}
	}

	//判斷正對角線是否有勝出

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

	//判斷斜對角線是否有勝出

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

	if (is_full(arr, row, col))   //判斷棋盤是否還有空格
	{
		return 'Q';
	}
	return ' ';  //若無輸贏,返回空格,表示遊戲繼續
}
運行結果如下:


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