用C语言实现三子棋(井字棋)——电脑下棋具有逻辑性

创建头文件:

#define _CRT_SECURE_NO_WARNINGS
#pragma once

#include 
#include 
#include 

//定义棋盘的行和列
#define ROW 3
#define COL 3

//打印菜单
void menu();

//选择难度
void menu0();

//初始化数组
void InitBoard(char board[ROW][COL], int row, int col);

//展示棋盘
void display_board(char board[ROW][COL], int row, int col);

//玩家落子
void chess_player(char board[ROW][COL], int row, int col);

//电脑落子(难度1)
void chess_computer1(char board[ROW][COL], int row, int col);

//电脑落子(难度2)
void chess_computer2(char board[ROW][COL], int row, int col);

//电脑落子(难度3)
void chess_computer3(char board[ROW][COL], int row, int col);

//局势判断
char judge(char board[ROW][COL], int row, int col);

//实现游戏
void game(int n);

创建game.c文件

#include"game.h"

//一个全局变量,用来标记第一步不能下在中间!
int k = 1;

//打印菜单
void menu()
{
	printf("输入对应的数字后按下回车键\n");
	printf("**************************\n");
	printf("******  1.进行游戏  ******\n");
	printf("******  2.退出游戏  ******\n");
	printf("**************************\n");
}

//选择难度
void menu0()
{
	printf("输入对应的数字后按下回车键\n");
	printf("**************************\n");
	printf("******  1.傻瓜模式  ******\n");
	printf("******  2.新手模式  ******\n");
	printf("******  3.高手模式  ******\n");
	printf("**************************\n");
}

//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}


//展示棋盘
void display_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		printf("-------------\n");
		for (j = 0; j < col; j++)
		{
			printf("| %c ", board[i][j]);
			if (j == COL - 1)
			{
				printf("|\n");
			}
		}
	}
	printf("-------------\n");
}

//玩家落子
void chess_player(char board[ROW][COL], int row, int col)
{
	int x, y;
	do 
	{
		printf("请输入对应落子坐标: ");
		scanf("%d %d", &x, &y);
		if (board[x - 1][y - 1] == ' ') 
		{
			if ((x == 2 && y == 2) && (k == 1))
			{
				
				printf("三子棋第一步不能下在中间!!!\n");
				continue;
			}
			if ((x >= 1 && x <= ROW) && (y >= 1 && y <= COL)) 
			{
				board[x - 1][y - 1] = '*';
				k = 0;
				break;
			}
			else 
			{
				printf("请输入合适的坐标!\n");
			}
		}
		else 
		{
			printf("请输入合适的坐标!\n");
		}
	} while (1);
}

//棋盘备份
static void coppy(char board[ROW][COL], char coppy_board[ROW][COL],int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			coppy_board[i][j] = board[i][j];
		}
	}
}

//电脑落子(难度1)
void chess_computer1(char board[ROW][COL], int row, int col)
{
	if (judge(board, ROW, COL) == 'Q')
		goto flag;
	int x = 0;
	int y = 0;
	
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
flag:
	;
}

//电脑落子(难度2)
void chess_computer2(char board[ROW][COL], int row, int col)
{
	if (judge(board, ROW, COL) == 'Q')
		goto flag;
	int x = 0;
	int y = 0;
	for (x = 0; x < row; x++)
	{
		for (y = 0; y < col; y++)
		{

			if (board[x][y] == ' ')
			{
				char coppy_board[ROW][COL] = { '0' };
				coppy(board, coppy_board, ROW, COL);
				coppy_board[x][y] = '#';
				if (judge(coppy_board, ROW, COL) == '#')
				{
					board[x][y] = '#';
					goto flag;
				}

			}
		}
	}

	for (x = 0; x < row; x++)
	{
		for (y = 0; y < col; y++)
		{
			if (board[x][y] == ' ')
			{
				char coppy_board[ROW][COL] = { '0' };
				coppy(board, coppy_board, ROW, COL);
				coppy_board[x][y] = '*';
				if (judge(coppy_board, ROW, COL) == '*')
				{

					board[x][y] = '#';
					goto flag;
				}

			}
		}
	}
	
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
flag:
	;
}

//电脑落子(难度3)
void chess_computer3(char board[ROW][COL], int row, int col)
{
	if (judge(board, ROW, COL) == 'Q')
		goto flag;
	int x = 0;
	int y = 0;
	int k = 1;

	for (x = 0; x < row; x++)
	{
		for (y = 0; y < col; y++)
		{

			if (board[x][y] == ' ')
			{
				char coppy_board[ROW][COL] = { '0' };
				coppy(board, coppy_board, ROW, COL);
				coppy_board[x][y] = '#';
				if (judge(coppy_board, ROW, COL) == '#')
				{
					board[x][y] = '#';
					goto flag;
				}

			}
		}
	}

	for (x = 0; x < row; x++)
	{
		for (y = 0; y < col; y++)
		{
			if (board[x][y] == ' ')
			{
				char coppy_board[ROW][COL] = { '0' };
				coppy(board, coppy_board, ROW, COL);
				coppy_board[x][y] = '*';
				if (judge(coppy_board, ROW, COL) == '*')
				{
					board[x][y] = '#';
					goto flag;
				}

			}
		}
	}
	if (board[1][1] == ' ')
	{
		board[1][1] = '#';
		k = 0;
		goto flag;
	}

	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
flag:
	;
}

//判断棋盘是否满了
static int IsFull(char board[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 (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

//判断输赢还是平局
char judge(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}

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

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

	//判断平局
	if (IsFull(board, row, col))
	{
		return 'Q';
	}

	return 'C';
}

创建text.c文件,用来放置主函数

#include"game.h"

//一个全局变量,用来标记第一步不能下在中间!
extern k;

void game(int input0)
{
	char board[ROW][COL] = { 0 };
	InitBoard(board, ROW, COL);

	display_board(board, ROW, COL);
	switch (input0)
	{
	case 1:
		do
		{
			chess_player(board, ROW, COL);
			system("cls");
			display_board(board, ROW, COL);
			if (judge(board, ROW, COL) == '*')
				break;

			chess_computer1(board, ROW, COL);
			system("cls");
			display_board(board, ROW, COL);
			if (judge(board, ROW, COL) == '#')
				break;

			if (judge(board, ROW, COL) == 'Q')
				break;

		} while (1);
		if (judge(board, ROW, COL) == '*')
		{
			printf("恭喜你赢了!!!\n");
			int k = 1;
			Sleep(2000);
			system("cls");
			
		}
		else if (judge(board, ROW, COL) == '#')
		{
			printf("很遗憾,你输了\n");
			int k = 1;
			Sleep(3000);
			system("cls");
		}
		else if (judge(board, ROW, COL) == 'Q')
		{
			printf("本局平局!!!\n");
			int k = 1;
			Sleep(3000);
			system("cls");
		}
		break;
	case 2:
		do
		{
			chess_player(board, ROW, COL);
			system("cls");
			display_board(board, ROW, COL);
			if (judge(board, ROW, COL) == '*')
				break;

			chess_computer2(board, ROW, COL);
			system("cls");
			display_board(board, ROW, COL);
			if (judge(board, ROW, COL) == '#')
				break;

			if (judge(board, ROW, COL) == 'Q')
				break;

		} while (1);
		if (judge(board, ROW, COL) == '*')
		{
			printf("恭喜你赢了!!!\n");
			int k = 1;
			Sleep(3000);
			system("cls");
		}
		else if (judge(board, ROW, COL) == '#')
		{
			printf("很遗憾,你输了\n");
			int k = 1;
			Sleep(3000);
			system("cls");
		}
		else if (judge(board, ROW, COL) == 'Q')
		{
			printf("本局平局!!!\n");
			int k = 1;
			Sleep(3000);
			system("cls");
		}
		break;
	case 3:
		do
		{
			chess_player(board, ROW, COL);
			system("cls");
			display_board(board, ROW, COL);
			if (judge(board, ROW, COL) == '*')
				break;

			chess_computer3(board, ROW, COL);
			system("cls");
			display_board(board, ROW, COL);
			if (judge(board, ROW, COL) == '#')
				break;

			if (judge(board, ROW, COL) == 'Q')
				break;

		} while (1);
		if (judge(board, ROW, COL) == '*')
		{
			printf("恭喜你赢了!!!\n");
			int k = 1;
			Sleep(3000);
			system("cls");
		}
		else if (judge(board, ROW, COL) == '#')
		{
			printf("很遗憾,你输了\n");
			int k = 1;
			Sleep(3000);
			system("cls");
		}
		else if (judge(board, ROW, COL) == 'Q')
		{
			printf("本局平局!!!\n");
			int k = 1;
			Sleep(3000);
			system("cls");
		}
		break;
	}
}

int main()
{
	int input = 0;
	int input0 = 0;

	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择是否进行游戏:>>");
		scanf("%d", &input);
		system("cls");
		if (input == 1)
		{
flag:
			printf("\n");
			menu0();
			printf("请选择游戏的难度:>>");
			scanf("%d", &input0);
			system("cls");
			switch(input0)
			{
			case 1:
				printf("\n傻瓜模式,游戏开始!\n");
				game(1);
				k = 1;
				break;
			case 2:
				printf("\n新手模式,游戏开始!\n");
				game(2);
				break;
			case 3:
				printf("\n高手模式,游戏开始!\n");
				game(3);
				break;
			default:
				printf("选择错误,请重新选择!\n");
				goto flag;
			}
		}
		else if (input == 2)
		{
			printf("已退出游戏。\n");
			break;
		}
		else
		{
			printf("选择错误,请重新选择!\n");
		}
	} while (input - 2);
	return 0;
}

游戏的运动:

用C语言实现三子棋(井字棋)——电脑下棋具有逻辑性_第1张图片

用C语言实现三子棋(井字棋)——电脑下棋具有逻辑性_第2张图片

用C语言实现三子棋(井字棋)——电脑下棋具有逻辑性_第3张图片

用C语言实现三子棋(井字棋)——电脑下棋具有逻辑性_第4张图片

 高手模式赢不了,最多只能和电脑平局

你可能感兴趣的:(c语言)