三子棋 AI人机版 多种模式供选择 智能人机代码如下(后手版)

// AI电脑 后手 下棋 (三子棋) (O号棋)
void AI(char qipan[X][Y], int b)
{

	printf("到AI棋圣下棋了:");
	int i = 0, j = 0;


	//找自己的两颗棋
	for (i = 0; i <= 2; ++i)
	{
		if ((qipan[i][0] == qipan[i][1]) && (qipan[i][1] == 'O') && (qipan[i][2] == ' '))
		{
			qipan[i][2] = 'O';
			printf("(%d,3)\n", i + 1);
			return 0;
		}
		if ((qipan[i][1] == qipan[i][2]) && (qipan[i][1] == 'O') && (qipan[i][0] == ' '))
		{
			qipan[i][0] = 'O';
			printf("(%d,1)\n", i + 1);
			return 0;
		}
		if ((qipan[i][0] == qipan[i][2]) && (qipan[i][0] == 'O') && (qipan[i][1] == ' '))
		{
			qipan[i][1] = 'O';
			printf("(%d,2)\n", i + 1);
			return 0;
		}

	}

	for (j = 0; j <= 2; ++j)
	{
		if ((qipan[0][j] == qipan[1][j]) && (qipan[0][j] == 'O') && (qipan[2][j] == ' '))
		{
			qipan[2][j] = 'O';
			printf("(3,%d)\n", j + 1);
			return 0;

		}
		if ((qipan[1][j] == qipan[2][j]) && (qipan[1][j] == 'O') && (qipan[0][j] == ' '))
		{
			qipan[0][j] = 'O';
			printf("(1,%d)\n", j + 1);
			return 0;
		}
		if ((qipan[0][j] == qipan[2][j]) && (qipan[0][j] == 'O') && (qipan[1][j] == ' '))
		{
			qipan[1][j] = 'O';
			printf("(2,%d)\n", j + 1);
			return 0;
		}

	}

	if ((qipan[0][0] == qipan[1][1]) && (qipan[1][1] == 'O') && (qipan[2][2] == ' '))
	{
		qipan[2][2] = 'O';
		printf("(3,3)\n");
		return 0;
	}
	if ((qipan[0][0] == qipan[2][2]) && (qipan[0][0] == 'O') && (qipan[1][1] == ' '))
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	if ((qipan[1][1] == qipan[2][2]) && (qipan[1][1] == 'O') && (qipan[0][0] == ' '))
	{
		qipan[0][0] = 'O';
		printf("(1, 1)\n");
		return 0;
	}
	if ((qipan[0][2] == qipan[1][1]) && (qipan[1][1] == 'O') && (qipan[2][0] == ' '))
	{
		qipan[2][0] = 'O';
		printf("(3, 1)\n");
		return 0;
	}
	if ((qipan[0][2] == qipan[2][0]) && (qipan[0][2] == 'O') && (qipan[1][1] == ' '))
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	if ((qipan[2][0] == qipan[1][1]) && (qipan[1][1] == 'O') && (qipan[0][2] == ' '))
	{
		qipan[0][2] = 'O';
		printf("(1, 3)\n");
		return 0;
	}



	//堵对手的两个棋
	for (i = 0; i <= 2; ++i)
	{
		if ((qipan[i][0] == qipan[i][1]) && (qipan[i][1] == 'X') && (qipan[i][2] == ' '))
		{
			qipan[i][2] = 'O';
			printf("(%d,3)\n", i + 1);
			return 0;
		}
		if ((qipan[i][1] == qipan[i][2]) && (qipan[i][1] == 'X') && (qipan[i][0] == ' '))
		{
			qipan[i][0] = 'O';
			printf("(%d,1)\n", i + 1);
			return 0;
		}
		if ((qipan[i][0] == qipan[i][2]) && (qipan[i][0] == 'X') && (qipan[i][1] == ' '))
		{
			qipan[i][1] = 'O';
			printf("(%d,2)\n", i + 1);
			return 0;
		}

	}

	for (j = 0; j <= 2; ++j)
	{
		if ((qipan[0][j] == qipan[1][j]) && (qipan[0][j] == 'X') && (qipan[2][j] == ' '))
		{
			qipan[2][j] = 'O';
			printf("(3,%d)\n", j + 1);
			return 0;

		}
		if ((qipan[1][j] == qipan[2][j]) && (qipan[1][j] == 'X') && (qipan[0][j] == ' '))
		{
			qipan[0][j] = 'O';
			printf("(1,%d)\n", j + 1);
			return 0;
		}
		if ((qipan[0][j] == qipan[2][j]) && (qipan[0][j] == 'X') && (qipan[1][j] == ' '))
		{
			qipan[1][j] = 'O';
			printf("(2,%d)\n", j + 1);
			return 0;
		}

	}

	if ((qipan[0][0] == qipan[1][1]) && (qipan[1][1] == 'X') && (qipan[2][2] == ' '))
	{
		qipan[2][2] = 'O';
		printf("(3,3)\n");
		return 0;
	}
	if ((qipan[0][0] == qipan[2][2]) && (qipan[0][0] == 'X') && (qipan[1][1] == ' '))
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	if ((qipan[1][1] == qipan[2][2]) && (qipan[1][1] == 'X') && (qipan[0][0] == ' '))
	{
		qipan[0][0] = 'O';
		printf("(1, 1)\n");
		return 0;
	}
	if ((qipan[0][2] == qipan[1][1]) && (qipan[1][1] == 'X') && (qipan[2][0] == ' '))
	{
		qipan[2][0] = 'O';
		printf("(3, 1)\n");
		return 0;
	}
	if ((qipan[0][2] == qipan[2][0]) && (qipan[0][2] == 'X') && (qipan[1][1] == ' '))
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	if ((qipan[2][0] == qipan[1][1]) && (qipan[1][1] == 'X') && (qipan[0][2] == ' '))
	{
		qipan[0][2] = 'O';
		printf("(1, 3)\n");
		return 0;
	}






	//上述情况都没有的话 抢占中间位置
	if (qipan[1][1] == ' ')
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	
	
	if (b == 1)  //AI第一手无中间位置 就抢占四个角
 {
	switch ((rand() % 4 + 1))
	{
	case 1: qipan[0][0] = 'O'; printf("(1,1)"); return 0;
	case 2: qipan[2][2] = 'O'; printf("(3,3)"); return 0;
	case 3: qipan[2][0] = 'O'; printf("(3,1)"); return 0;
	case 4: qipan[0][2] = 'O'; printf("(1,3)"); return 0;
	}
	
  }
	if (b == 3)   //AI第二手.防止玩家偷鸡,抢四个角的位置
	{

		if (qipan[0][0] == ' ')
		{
			qipan[0][0] = 'O';return 0;
		}
		else
		{
				
			if (qipan[2][2] == ' ')
					{
					qipan[2][3] = 'O'; return 0;
					}
				else
				{
					if (qipan[0][2] == ' ')
					{
						qipan[0][2] = 'O'; return 0;
					}

					else 
					{
						if (qipan[2][0] == ' ')
						{
							qipan[2][0] = 'O'; return 0;
						}
					}
				}


		}
	}
	
	
	if (b > 1)// 除了上面的情况 随机下
	{
		int xx = 0, yy = 0;
		do
		{
			xx = rand() % 3;
			yy = rand() % 3;
			if (qipan[xx][yy] == ' ')
			{
				qipan[xx][yy] = 'O';
				printf("(%d,%d)", xx + 1, yy + 1);
				break;
			}
		} while (1);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值