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 ' ';  //若无输赢,返回空格,表示游戏继续
}
运行结果如下:


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