锁月寻香丶 2021-04-23 21:12 采纳率: 25%
浏览 32

大佬帮忙改一下,好像判断胜负的代码有点问题!

#include<iostream>
#include<windows.h>
#include<stdlib.h>
#include<conio.h>
#define N 15
using namespace std;
class Chess
{
public:
	void Init();
	int Play();
	void Print();
	int Put();
	int Judge();
	int Attack();
	int Defend();
	int aiPut();
	void Test();
	int Winner();
private:
	int p[N][N];
	int score1[N][N];
	int score2[N][N];
	int X; int Y;
	int Gamer;
	int count;
};
int main()
{
	Chess che;
	che.Test();
	che.Init();
	return 0;
}
int Chess::Play()
{
	Init();
	count = 0;
	while (1)
	{
		Print();
		char ch = _getch();
		switch (ch)
		{
		case 32:
			if (1 == Put())
			{
				Attack();
				Defend();
				aiPut();
				Judge();
				Winner();
			};
			break;
		case 72:
			X--; if (X < 0)X = 14;
			break;
		case 80:
			X++; if (X > 14)X = 0;
			break;
		case 75:
			Y--; if (Y < 0)Y = 14;
			break;
		case 77:
			Y++; if (Y > 14)Y = 0;
			break;
		}
	}
	return 0;
}
void Chess::Init()
{
	memset(p, 0, sizeof(p));
	memset(score1, 0, sizeof(score1));
	memset(score2, 0, sizeof(score2));
	X = Y = 7;
}
void Chess::Print()
{
	system("cls");
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (X == i && Y == j)cout << "╬";
			else if (p[i][j] == 1)cout << "●";
			else if (p[i][j] == 2)cout << "○";
			else if (i == 0 && j == 0)cout << "┏";
			else if (i == 0 && j == 14)cout << "┓";
			else if (i == 14 && j == 0)cout << "┗";
			else if (i == 14 && j == 14)cout << "┛";
			else if (i == 0)cout << "┯";
			else if (i == 14)cout << "┷";
			else if (j == 0)cout << "┠";
			else if (j == 14)cout << "┨";
			else cout << "┼";
		}
		cout << endl;
	}
}
int Chess::Put()
{
	if (p[X][Y] == 0)
	{
		p[X][Y] = 1;
		return 1;
	}
	else
		return 0;
}
int Chess::Judge()
{
	int h_b = 1; int v_b = 1; int ps_b = 1; int sd_b = 1;
	int h_w = 1; int v_w = 1; int ps_w = 1; int sd_w = 1;
	for (int i = 1; i < 5; i++)
	{
		if (Y + i < 15 && p[X][Y + i] == 1)
			h_b++;
		if (Y + i < 15 && p[X][Y + i] == 2)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		if (Y - i > 0 && p[X][Y - i] == 1)
			h_b++;
		if (Y - i > 0 && p[X][Y - i] == 2)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		if (X + i < 15 && p[X + i][Y] == 1)
			v_b++;
		if (X + i < 15 && p[X + i][Y] == 2)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		if (X - i > 0 && p[X - i][Y] == 1)
			v_b++;
		if (X - i > 0 && p[X - i][Y] == 2)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		if (X + i < 15 && Y + i < 15 && p[X + i][Y + i] == 1)
			ps_b++;
		if (X + i < 15 && Y + i < 15 && p[X + i][Y + i] == 2)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		if (X - i > 0 && Y - i > 0 && p[X - i][Y - i] == 1)
			ps_b++;
		if (X - i > 0 && Y - i > 0 && p[X - i][Y - i] == 2)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		if (X - i > 0 && Y + i < 15 && p[X - i][Y + i] == 1)
			sd_b++;
		if (X - i > 0 && Y + i < 15 && p[X - i][Y + i] == 2)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		if (X + i < 15 && Y - i>0 && p[X + i][Y - i] == 1)
			sd_b++;
		if (X + i < 15 && Y - i>0 && p[X + i][Y - i] == 2)
			break;
	}
	if (h_b == 5 || v_b == 5 || ps_b == 5 || sd_b == 5)
	{
		return 1;
	}

	//白子胜利判断
	for (int i = 1; i < 5; i++)
	{
		if (Y + i < 15 && p[X][Y + i] == 2)
			h_w++;
		if (Y + i < 15 && p[X][Y + i] == 1)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		if (Y - i > 0 && p[X][Y - i] == 2)
			h_w++;
		if (Y - i > 0 && p[X][Y - i] == 1)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		if (X + i < 15 && p[X + i][Y] == 2)
			v_w++;
		if (X + i < 15 && p[X + i][Y] == 1)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		if (X - i > 0 && p[X - i][Y] == 2)
			v_w++;
		if (X - i > 0 && p[X - i][Y] == 1)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		if (X + i < 15 && Y + i < 15 && p[X + i][Y + i] == 2)
			ps_w++;
		if (X + i < 15 && Y + i < 15 && p[X + i][Y + i] == 1)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		if (X - i > 0 && Y - i > 0 && p[X - i][Y - i] == 2)
			ps_w++;
		if (X - i > 0 && Y - i > 0 && p[X - i][Y - i] == 1)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		if (X - i > 0 && Y + i < 15 && p[X - i][Y + i] == 2)
			sd_w++;
		if (X - i > 0 && Y + i < 15 && p[X - i][Y + i] == 1)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		if (X + i < 15 && Y - i>0 && p[X + i][Y - i] == 2)
			sd_w++;
		if (X + i < 15 && Y - i>0 && p[X + i][Y - i] == 1)
			break;
	}
	if (h_w == 5 || v_w == 5 || ps_w == 5 || sd_w == 5)
	{
		return 2;
	}
}
int Chess::Winner()
{
	int winner = Judge();
	if (winner == 1)
	{
		count = 0;
		system("cls");
		MessageBox(NULL, L"黑子赢了", L"提示", MB_OK);
		return 0;
	}
	else if (winner == 2)
	{
		count = 0;
		system("cls");
		MessageBox(NULL, L"白子赢了", L"提示", MB_OK);
		return 0;
	}
	else if (count == 225)
	{
		count = 0;
		system("cls");
		MessageBox(NULL, L"平局", L"提示", MB_OK);
		return 0;
	}
}
void Chess::Test()
{
	SetConsoleTitleA("五子棋人机对战");
	system("mode con cols=50 lines=20");
	system("color 70");
	while (1)
	{
		Play();
	}
}
int Chess::Attack()
{
	int i1, j1;
	int k1, k2, k;
	for (int i = 0; i < 15; i++)
	{
		for (int j = 0; j < 15; j++)
		{
			if (p[i][j])
				score1[i][j] = 0;
			if (p[i][j] == 0)
			{
				k1 = k2 = 0;
				for (i1 = i, j1 = j - 1; j1 >= 0; j1--)//往左数寻找电脑棋子数
				{
					if (p[i1][j1] == 2)
						k1++;
					else
						break;
				}
				for (i1 = i, j1 = j + 1; j1 < 15; j1++)//往右数寻找电脑棋子数
				{
					if (p[i1][j1] == 2)
						k2++;
					else
						break;
				}
				k = k1 > k2 ? k1 : k2;
				k1 = k2 = 0;
				for (i1 = i - 1, j1 = j; i1 >= 0; i1--)//往上数寻找电脑棋子数
				{
					if (p[i1][j1] == 2)
						k1++;
					else
						break;
				}
				for (i1 = i + 1, j1 = j; i1 < 15; i1++)//往下数寻找电脑棋子数
				{
					if (p[i1][j1] == 2)
						k2++;
					else
						break;
				}
				k1 = k1 > k2 ? k1 : k2;
				k = k > k1 ? k : k1;
				k1 = k2 = 0;
				for (i1 = i - 1, j1 = j - 1; i1 >= 0 && j1 >= 0; i1--, j1--)//往左上数寻找电脑棋子数
				{
					if (p[i1][j1] == 2)
						k1++;
					else
						break;
				}
				for (i1 = i + 1, j1 = j + 1; i1 < 15 && j1 < 15; i1++, j1++)//往右下数寻找电脑棋子数
				{
					if (p[i1][j1] == 2)
						k2++;
					else
						break;
				}
				k1 = k1 > k2 ? k1 : k2;
				k = k > k1 ? k : k1;
				k1 = k2 = 0;
				for (i1 = i + 1, j1 = j - 1; i1 < 15 && j1 >= 0; i1++, j1--)//往左下数寻找电脑棋子数
				{
					if (p[i1][j1] == 2)
						k1++;
					else
						break;
				}
				for (i1 = i - 1, j1 = j + 1; i1 >= 0 && j1 < 15; i1--, j1++)//往右上数寻找电脑棋子数
				{
					if (p[i1][j1] == 2)
						k2++;
					else
						break;
				}
				k1 = k1 > k2 ? k1 : k2;
				k = k > k1 ? k : k1;
				switch (k)    //根据连子数赋予权值
				{
				case 1:
					score1[i][j] = 15; break;
				case 2:
					score1[i][j] = 60; break;
				case 3:
					score1[i][j] = 240; break;
				case 4:
					score1[i][j] = 3000; break;
				default:
					score1[i][j] = 0; break;
				}
			}
		}
	}
	return 0;
}
int Chess::Defend()                     //电脑在棋盘各个位置的防守权值 
{
	int i1, j1;
	int k1, k2, k;
	for (int i = 0; i < 15; i++)
	{
		for (int j = 0; j < 15; j++)
		{
			if (p[i][j])
				score2[i][j] = 0;
			if (p[i][j] == 0)
			{
				k1 = k2 = 0;
				for (i1 = i, j1 = j - 1; j1 >= 0; j1--)//往左数寻找玩家棋子数
				{
					if (p[i1][j1] == 1)
						k1++;
					else
						break;
				}
				for (i1 = i, j1 = j + 1; j1 < 15; j1++)//往右数寻找玩家棋子数
				{
					if (p[i1][j1] == 1)
						k2++;
					else
						break;
				}
				k = k1 > k2 ? k1 : k2;
				k1 = k2 = 0;
				for (i1 = i - 1, j1 = j; i1 >= 0; i1--)//往上数寻找玩家棋子数
				{
					if (p[i1][j1] == 1)
						k1++;
					else
						break;
				}
				for (i1 = i + 1, j1 = j; i1 < 15; i1++)//往下数寻找玩家棋子数
				{
					if (p[i1][j1] == 1)
						k2++;
					else
						break;
				}
				k1 = k1 > k2 ? k1 : k2;
				k = k > k1 ? k : k1;
				k1 = k2 = 0;
				for (i1 = i - 1, j1 = j - 1; i1 >= 0 && j1 >= 0; i1--, j1--)//往左上数寻找玩家棋子数
				{
					if (p[i1][j1] == 1)
						k1++;
					else
						break;
				}
				for (i1 = i + 1, j1 = j + 1; i1 < 15 && j1 < 15; i1++, j1++)//往右下数寻找玩家棋子数
				{
					if (p[i1][j1] == 1)
						k2++;
					else
						break;
				}
				k1 = k1 > k2 ? k1 : k2;
				k = k > k1 ? k : k1;
				k1 = k2 = 0;
				for (i1 = i + 1, j1 = j - 1; i1 < 15 && j1 >= 0; i1++, j1--)//往左下数寻找玩家棋子数
				{
					if (p[i1][j1] == 1)
						k1++;
					else
						break;
				}
				for (i1 = i - 1, j1 = j + 1; i1 >= 0 && j1 < 15; i1--, j1++)//往右上数寻找玩家棋子数
				{
					if (p[i1][j1] == 1)
						k2++;
					else
						break;
				}
				k1 = k1 > k2 ? k1 : k2;
				k = k > k1 ? k : k1;
				switch (k)   //根据连子数赋予权值
				{
				case 1:
					score2[i][j] = 10; break;
				case 2:
					score2[i][j] = 40; break;
				case 3:
					score2[i][j] = 160; break;
				case 4:
					score2[i][j] = 4000; break;
				default:
					score2[i][j] = 0; break;
				}
			}
		}
	}
	return 0;
}
int Chess::aiPut()
{
	int k1 = 0, k2 = 0;
	int i, j, max = 0;
	for (i = 0; i < 15; i++)
	{
		for (j = 0; j < 15; j++)
		{
			if (max <= score1[i][j])
			{
				max = score1[i][j];
				k1 = i;
				k2 = j;
			}
		}
	}
	for (i = 0; i < 15; i ++)
	{
		for (j = 0; j < 15; j++)
		{
			if (max <= score2[i][j])
			{
				max = score2[i][j];
				k1 = i;
				k2 = j;
			}
		}
	}
	p[k1][k2] = 2;
	if (p[k1][k2] == 2)
	{
		cout << "○";
		count++;
	}
	return 0;
}
  • 写回答

3条回答 默认 最新

  • 关注

    你这么长的代码最好有点比较明确的说明,比如那个函数或者第几行开始的代码。

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器