三子棋程序

1、完成三子棋程序
2、程序:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void Init();
void PrintfChessBoard();
void PlayerMove();
void ComputerMove();
char CheckWinner();
int IsFull();
#define MAX_ROW 3
#define MAX_COL 3

char chess_board[MAX_ROW][MAX_COL];//用来定义棋盘的初始化
char winner;
int main()
{
	//1、初始化一个3*3的期盼,用空格表示
	Init();
	while (1)
	{
		//2、打印当前的棋盘
		PrintfChessBoard();
		//3、玩家落子,输入坐标(用x表示玩家落子)
		PlayerMove();
		//4、判断胜负,打印棋盘
		winner = CheckWinner();
		if (winner != ' ')
		{
			break;
		}
		PrintfChessBoard();
		//5、电脑随机落子(用o表示玩家落子)
		ComputerMove();
		//6、判断胜负
		//用'x'表示玩家赢,用'o'表示电脑赢,用' '(空格)表示胜负未分,用q表示和棋
		winner = CheckWinner();
		if (winner != ' ')
		{
			break;
		}
	}
	//7、回到第二步
	PrintfChessBoard();
	if (winner == 'x')
	{
		printf("恭喜你,你赢了!\n");
	}
	else if (winner == 'o')
	{
		printf("很遗憾,你输了!\n");
	}
	else
	{
		printf("和棋!\n");
	}
 system("pause");
 return 0;
}
void Init()
{
	int i, j;
	for (i = 0; i < MAX_ROW; i++)
	{
		for (j = 0; j < MAX_COL; j++)
		{
			chess_board[i][j] = ' ';
		}
	}
}


void PrintfChessBoard()
{
	for (int i = 0; i < MAX_ROW; i++)
	{
		printf("+---+---+---+\n");
		printf("| %c | %c | %c |\n", chess_board[i][0], chess_board[i][1], chess_board[i][2]);
	}
	printf("+---+---+---+\n");
}


void PlayerMove()
//两种情况:一种是输入越界,另一种是输入有子,需重新输入
{
	printf("请玩家落子!\n");
	while (1)
	{
		int row = 0, col = 0;
		//row表示行,col表示列
		scanf("%d %d", &row, &col);
		if (row < 0 || row > MAX_ROW || col < 0 || col > MAX_COL)
		{
			printf("输入有误,请重新输入!\n");
			continue;//跳出当前这一次的循环,进入下一次循环
		}
		if (chess_board[row][col] != ' ')
		{
			printf("输入位置有子,需重新输入!\n");
			continue;
		}
		chess_board[row][col] = 'x';
		break;
	}
}

void ComputerMove()
{
	printf("电脑落子!\n");
	while (1)
	{
		int row = 0, col = 0;
		//种子数
		srand((unsigned int) time( 0));
		row = rand() % MAX_ROW;
		col = rand() % MAX_COL;
		//row表示行,col表示列
		if (chess_board[row][col] != ' ')
		{
			//printf("输入位置有子,需重新输入!\n");
			//无需提醒电脑输入有误!
			continue;
		}
		chess_board[row][col] = 'o';
		break;
	}
}

char CheckWinner()
{
	//1、检测所有行
	for (int row = 0; row < MAX_ROW; row++)
	{
		if (chess_board[row][0] != ' '
			&&chess_board[row][0] == chess_board[row][1] && chess_board[row][0]==chess_board[row][2])
		{
			return chess_board[row][0];
		}
	}

	//2、检测所有列
	for (int col = 0; col < MAX_COL; col++)
	{
		if (chess_board[0][col] != ' '
			&&chess_board[0][col] == chess_board[1][col] && chess_board[0][col]==chess_board[2][col])
		{
			return chess_board[0][col];
		}
	}
	//3、检测对角线元素
	if (chess_board[0][0] != ' '
		&&chess_board[0][0] == chess_board[1][1] && chess_board[0][0]==chess_board[2][1])
	{
		return chess_board[0][0];
	}
	if (chess_board[2][0] != ' '
		&&chess_board[2][0] == chess_board[1][1] && chess_board[2][0]==chess_board[0][2])
	{
		return chess_board[0][0];
	}
	//4、和棋
	else if (IsFull())
	{
		return  'q';
	}
	return ' ';
}
int IsFull()
{
//和棋返回1,否则返回0
	for (int row = 0; row < MAX_ROW; row++)
	{
		for (int col = 0; col < MAX_COL; col++)
		{
			if (chess_board[row][col] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

3、结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值