井字棋代码(C语言)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define ROW  3
#define COL  3



//前面为辅助代码建议从后往前阅读
char compare1(char board[ROW][COL], int row, int col)
{
	//判断横向胜利
	//首先判断电脑赢还是玩家赢
	//玩家赢返回*,电脑赢返回#
	//平局返回q
	//游戏继续返回c
	int n = 0;
	for (n = 0; n < row; n++)
	{
		//三行胜利
		if (board[n][0] == board[n][1] &&
			board[n][1] == board[n][2] &&
			board[n][1] != '0')
		{
			return board[n][1];
			//printf("赢了\n");
		}
	}
	for (n = 0; n < col; n++)
	{
		//三列胜利
		if (board[0][n] == board[1][n] &&
			board[1][n] == board[2][n] &&
			board[1][n] != '0')
		{
			return board[1][n];
		}
	}
	//斜角胜利
	if (board[0][0] == board[1][1] &&
		board[1][1] == board[2][2] &&
        board[1][1] != '0'||
		board[0][2] == board[1][1] &&
		board[1][1] == board[2][0] &&
		board[1][1] != '0')
	{
		return board[1][1];
		//printf("赢了\n");
	}

	{
		int m = 0;
		int count = 0;

		for (n = 0; n < row; n++)
		{
			for (m = 0; m < col; m++)
			{
				if (board[n][m] != '0')
					count++;
			}

		}
		if (count == row * col)
			return 'q';
		else
			return 'c';
	}
}


int compare(char board[ROW][COL], int row, int col)
{
	while (1)
	{
		char ret;
		ret = compare1(board, row, col);
		if (ret == 'c')
			return 0;
		else
		{
			if (ret == '*')
			{
				printf("您赢了\n");
				return 1;
			}
			if (ret == '#')
			{
				printf("电脑赢了\n");
				return 1;
			}
			if (ret == 'q')
			{
				printf("平局\n");
				return 1;
			}
		}
	}

}


void computer(char board[ROW][COL], int row, int col)
{
	printf("电脑开始下棋\n");
	while (1)
	{
		int x = rand() % ROW;
		int y = rand() % COL;

		if (board[x - 1][y - 1] == '0')
			//判断这个位置是否被下过棋
		{
			board[x - 1][y - 1] = '#';
			break;
		}
	}
}



void play(char board[ROW][COL], int row, int col)
{
	printf("请选择你下棋的位置\n");
	while (1)
	{
		int x = 0;
		int y = 0;
		scanf("%d%d", &x, &y);

		if (x <= row && x >= 1 && y <= col && y >= 1)
		{
			if (board[x - 1][y - 1] != '0')
			{
				printf("该位置已经被占用了\n");
			}
			else {
				board[x - 1][y - 1] = '*';
				break;
			}
		}
		else
			printf("输入有误,请重新输入\n");
	}
}
void Print(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		printf("____");
	}
	printf("\n");
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("_%c_", board[i][j]);
			printf("|");
		}
		printf("\n");
	}
}

void Board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = '0';
		}
	}
}
void game()
{
	char arr[ROW][COL];
	Board(arr, ROW, COL);//制作棋盘
	Print(arr, ROW, COL);//打印棋盘
	while (1)
	{
		play(arr, ROW, COL);//玩家下棋
		Print(arr, ROW, COL);//打印棋盘
		int a = compare(arr, ROW, COL);//判断输赢
		if (a == 1)
			break;
		computer(arr, ROW, COL);//电脑下棋
		Print(arr, ROW, COL);//打印棋盘
		int b = compare(arr, ROW, COL);//判断输赢
		if (b == 1)
			break;
	}
}
void start()
{
	int a = 0;
	do {
		printf("--------1开始游戏--------\n");
		printf("--------2结束游戏--------\n");

		scanf("%d", &a);
		if (a == 1)
			game();//开始游戏
		else if (a != 1 && a != 2)
			printf("输入错误,请重新输入\n");
	} while (a != 2);
	printf("结束游戏,感谢游玩");
	return;
}
int main()
{
	//制作开始界面
	start();
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值