TicTacToe Ver.I

TicTacToe Ver.I

#include<iostream>
#include<conio.h>
#include<Windows.h>
#include<cmath>
#include<WinUser.h>
#define _2by1_player -98
#define _2by1_bot -102
using namespace std;
bool computer_first = false;
bool computer_vs_people = true;
int chess;
bool first;
int get_chess()
{
	chess += 1;
	return chess % 2 == 0 ? -1 : 1;
}
void set_chess_false()
{
	chess -= 1;
}
struct Pos
{
	int x;
	int y;
}position = { 1,1 };
Pos player_last_step = { 0 ,0 };
int chessman[3][3] = { {-100,-100,-100},{-100,-100,-100},{-100,-100,-100} };
//1 -1 -100
void set_position(int x, int y)
{
	position.x = x;
	position.y = y;
	COORD pos = { x ,y };
	HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(Out, pos);
}
void left()
{
	if (position.x > 0)
	{
		set_position(position.x - 4, position.y);
	}
}
void right()
{
	if (position.x < 10)
	{
		set_position(position.x + 4, position.y);
	}
}
void up()
{
	if (position.y > 0)
	{
		set_position(position.x, position.y - 2);
	}
}
void down()
{
	if (position.y < 5)
	{
		set_position(position.x, position.y + 2);
	}
}
int mapx()
{
	return (position.x - 2) / 4;
}
int mapy()
{
	return (position.y - 1) / 2;
}
int get_chessman(int x, int y)
{
	return chessman[y][x];
}
bool set_chessman(int x, int y, int value)
{
	if (get_chessman(x, y) != -100)
	{
		return false;
	}
	else
	{
		chessman[y][x] = value;
		return true;
	}
}
int x_sum(int y)
{
	int sum = 0;
	for (int i = 0; i < 3; ++i)
	{
		sum += get_chessman(i, y);
	}
	return sum;
}
int y_sum(int x)
{
	int sum = 0;
	for (int i = 0; i < 3; ++i)
	{
		sum += get_chessman(x, i);
	}
	return sum;
}
int xx_sum()
{
	int sum = 0;
	for (int i = 0; i < 3; ++i)
	{
		sum += get_chessman(i, i);
	}
	return sum;
}
int xx_sum_rev()
{
	return get_chessman(0, 2) + get_chessman(1, 1) + get_chessman(2, 0);
}
bool xy_sum(int value)
{
	if (xx_sum() == value)
	{
		return true;
	}
	if (xx_sum_rev() == value)
	{
		return true;
	}
	else
	{
		return false;
	}
}
bool judge(int value)
{
	for (int i = 0; i < 3; ++i)
	{
		if (x_sum(i)==value)
		{
			return true;
		}
	}
	for (int i = 0; i < 3; ++i)
	{
		if (y_sum(i) == value)
		{
			return true;
		}
	}
	return xy_sum(value);
}
bool dogfall()
{
	for (int i = 0; i < 3; ++i)
	{
		for (int j = 0; j < 3; ++j)
		{
			if (get_chessman(i, j) == -100)
			{
				return false;
			}
		}
	}
	return true;
}
// 1 win 0 normal -1 error 2 dogfall
int decide(int chess)
{
	if (set_chessman(mapx(), mapy(), chess))
	{
		player_last_step.x = mapx();
		player_last_step.y = mapy();
		cout << ((chess == 1) ? "x" : "o");
		set_position(position.x, position.y);
		if (judge(chess * 3) == true)
		{
			cout << "fuck";
			return 1;
		}
		if (dogfall())
		{
			return 2;
		}
		return 0;
	}
	else
	{
		set_chess_false();
		return -1;
	}
}
int bot_decide(int x, int y, int chess)
{
	set_chessman(x, y, chess);
	set_position(2 + 4 * x, 1 + 2 * y);
	cout << ((chess == 1) ? "x" : "o");
	set_position(2 + 4 * x, 1 + 2 * y);
	if (judge(-3) == true)
	{
		cout << "ok";
		return 1;
	}
	if (dogfall())
	{
		return 2;
	}
	return 0;
}
int bot(int chess)
{
	for (int i = 0; i < 3; ++i)
	{
		if (x_sum(i) == _2by1_bot)
		{
			for (int j = 0; j < 3; ++j)
			{
				if (get_chessman(j, i) == -100)
				{
					return bot_decide(j, i, chess);
				}
			}
		}
	}
	for (int i = 0; i < 3; ++i)
	{
		if (y_sum(i) == _2by1_bot)
		{
			for (int j = 0; j < 3; ++j)
			{
				if (get_chessman(i, j) == -100)
				{
					return bot_decide(i, j, chess);
				}
			}
		}
	}
	if (xx_sum() == _2by1_bot)
	{
		for (int i = 0; i < 3; ++i)
		{
			if (get_chessman(i, i) == -100)
			{
				return bot_decide(i, i, chess);
			}
		}
	}
	if (xx_sum_rev() == _2by1_bot)
	{
		if (get_chessman(0, 2) == -100)
		{
			return bot_decide(0, 2, chess);
		}
		if (get_chessman(1, 1) == -100)
		{
			return bot_decide(1, 1, chess);
		}
		if (get_chessman(2, 0) == -100)
		{
			return bot_decide(2, 0, chess);
		}
	}
	for (int i = 0; i < 3; ++i)
	{
		if (x_sum(i) == _2by1_player)
		{
			for (int j = 0; j < 3; ++j)
			{
				if (get_chessman(j, i) == -100)
				{
					return bot_decide(j, i, chess);
				}
			}
		}
	}
	for (int i = 0; i < 3; ++i)
	{
		if (y_sum(i) == _2by1_player)
		{
			for (int j = 0; j < 3; ++j)
			{
				if (get_chessman(i, j) == -100)
				{
					return bot_decide(i, j, chess);
				}
			}
		}
	}
	if (xx_sum() == _2by1_player)
	{
		for (int i = 0; i < 3; ++i)
		{
			if (get_chessman(i, i) == -100)
			{
				return bot_decide(i, i, chess);
			}
		}
	}
	if (xx_sum_rev() == _2by1_player)
	{
		if (get_chessman(0, 2) == -100)
		{
			return bot_decide(0, 2, chess);
		}
		if (get_chessman(1, 1) == -100)
		{
			return bot_decide(1, 1, chess);
		}
		if (get_chessman(2, 0) == -100)
		{
			return bot_decide(2, 0, chess);
		}
	}
	for (int i = 0; i < 3; ++i)
	{
		for (int j = 0; j < 3; ++j)
		{
			if (get_chessman(i, j) == -100)
			{			
				return bot_decide(i, j, chess);
			}
		}
	}
}
bool game()
{
	int d;
	int bd;
	while (true)
	{
		int input = _getch();
		if (GetAsyncKeyState(VK_UP) < 0)
		{
			while (GetAsyncKeyState(VK_UP) < 0)
				1;
			up();
		}
		if (GetAsyncKeyState(VK_DOWN) < 0)
		{
			while (GetAsyncKeyState(VK_DOWN) < 0)
				1;
			down();
		}
		if (GetAsyncKeyState(VK_LEFT) < 0)
		{
			while (GetAsyncKeyState(VK_LEFT) < 0)
				1;
			left();
		}
		if (GetAsyncKeyState(VK_RIGHT) < 0)
		{
			while (GetAsyncKeyState(VK_RIGHT) < 0)
				1;
			right();
		}
		if (GetAsyncKeyState(VK_SPACE) < 0)
		{
			while (GetAsyncKeyState(VK_SPACE) < 0)
				1;
			d = decide(get_chess());
			if (d == 1)
			{
				return true;
			}
			else if (d == 2)
			{
				return false;
			}
			else if (d == 0)
			{
				if (computer_vs_people)
				{
					bd = bot(get_chess());
					if (bd == 1)
					{
						return true;
					}
					else if (bd == 2)
					{
						return false;
					}
				}
			}
		}
	}
}
void init()
{
	system("cls");
	chess = 0;
	first = true;
	position = { 1,1 };
	player_last_step.x = 0;
	player_last_step.y = 0;
	for (int i = 0; i < 3; ++i)
	{
		for (int j = 0; j < 3; ++j)
		{
			chessman[i][j] = -100;
		}
	}
	cout << "+---+---+---+" << endl << "|   |   |   |" << endl << "+---+---+---+" << endl << "|   |   |   |" << endl << "+---+---+---+" << endl << "|   |   |   |" << endl << "+---+---+---+";
	set_position(2, 1);
	if (computer_first&&computer_vs_people)
	{
		bot_decide(1, 1, -1);
	}
	set_position(2, 1);
}
void select()
{
	int inputn;
	cout << "1-人机 2-人人 :";
	cin >> inputn;
	if (inputn == 2)
	{
		computer_vs_people = false;
	}
	char inputc;
	cout << "是否先走(y/n)";
	cin >> inputc;
	if (inputc == 'n')
	{
		computer_first = true;
	}
}
int main()
{
	select();
	while (1)
	{
		init();
		game();
		system("pause");
	}
}

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注