【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版)(EasyX 图形界面)

这是在之前【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版)的基础上运用 EasyX 图形库完成的可视化程序。

程序

//This program is a simple tic-tac-toe game.

#include <iostream>
#include <string>
#include <cstddef>
#include <stdexcept>
#include <Windows.h>
#include <graphics.h>
#include <conio.h>
#include <ctime>
#include <vector>
using namespace std;

IMAGE imageX, image0, imageXt, image0t, imageXw, image0w, imageD;

vector<vector<char>> point_now{ { ' ', ' ', ' '},{' ', ' ', ' '},{ ' ', ' ', ' '} };
const string location_computer[3][3] = { {"A1","A2","A3"},{"B1","B2","B3"},{"C1","C2","C3"} };
char player = 'X';
char computer_player = 'X';
unsigned step_count = 0;

int win_lose(vector<vector<char>> point, int n)
{
	if (point[0][0] == point[0][1] && point[0][1] == point[0][2] && point[0][0] == 'X') return 1; // X wins
	if (point[1][0] == point[1][1] && point[1][1] == point[1][2] && point[1][0] == 'X') return 1; // X wins
	if (point[2][0] == point[2][1] && point[2][1] == point[2][2] && point[2][0] == 'X') return 1; // X wins
	if (point[0][0] == point[1][0] && point[1][0] == point[2][0] && point[0][0] == 'X') return 1; // X wins
	if (point[0][1] == point[1][1] && point[1][1] == point[2][1] && point[0][1] == 'X') return 1; // X wins
	if (point[0][2] == point[1][2] && point[1][2] == point[2][2] && point[0][2] == 'X') return 1; // X wins
	if (point[0][0] == point[1][1] && point[1][1] == point[2][2] && point[1][1] == 'X') return 1; // X wins
	if (point[0][2] == point[1][1] && point[1][1] == point[2][0] && point[1][1] == 'X') return 1; // X wins

	if (point[0][0] == point[0][1] && point[0][1] == point[0][2] && point[0][0] == '0') return 2; // 0 wins
	if (point[1][0] == point[1][1] && point[1][1] == point[1][2] && point[1][0] == '0') return 2; // 0 wins
	if (point[2][0] == point[2][1] && point[2][1] == point[2][2] && point[2][0] == '0') return 2; // 0 wins
	if (point[0][0] == point[1][0] && point[1][0] == point[2][0] && point[0][0] == '0') return 2; // 0 wins
	if (point[0][1] == point[1][1] && point[1][1] == point[2][1] && point[0][1] == '0') return 2; // 0 wins
	if (point[0][2] == point[1][2] && point[1][2] == point[2][2] && point[0][2] == '0') return 2; // 0 wins
	if (point[0][0] == point[1][1] && point[1][1] == point[2][2] && point[1][1] == '0') return 2; // 0 wins
	if (point[0][2] == point[1][1] && point[1][1] == point[2][0] && point[1][1] == '0') return 2; // 0 wins

	if (n == 9) return 3; // end up in a draw
	else return 0; // unfinished
}

void game_player_change(char& player)
{
	if (player == 'X')
		player = '0'; // X -> 0
	else player = 'X';// 0 -> X
}

void init1()
{
	initgraph(1200, 800);
	loadimage(0, _T("Welcome.jpg"), 1200, 800);
	Sleep(3000);
}

void init2()
{
	loadimage(0, _T("Board.jpg"), 1200, 800);// the board
}

string man_input()
{
	int Check = 0;
	string ret = "00";
	while (Check == 0)
	{
		if (MouseHit())
		{
			MOUSEMSG mouse = GetMouseMsg();
			if (mouse.uMsg == WM_LBUTTONDOWN)
			{
				/**/ if (mouse.y > 150 && mouse.y < 350) ret[0] = 'A';
				else if (mouse.y > 350 && mouse.y < 550) ret[0] = 'B';
				else if (mouse.y > 550 && mouse.y < 750) ret[0] = 'C';
				/**/ if (mouse.x > 100 && mouse.x < 300) ret[1] = '1';
				else if (mouse.x > 300 && mouse.x < 500) ret[1] = '2';
				else if (mouse.x > 500 && mouse.x < 700) ret[1] = '3';
			}
		}
		if (ret[0] != '0' && ret[1] != '0')
			if (point_now[ret[0] - 65][ret[1] - 49] == ' ')
				Check = 1; // indicate it's a legal click
	}
	return ret;
}

string computer1(vector<vector<char>> p) // Computer Lv.1
{
	string ret;

	unsigned available_n = 49;
	for (int c_i = 0; c_i != 3; c_i++)
	{
		for (int c_j = 0; c_j != 3; c_j++)
		{
			if ((p[c_i][c_j] != 'X') && (p[c_i][c_j] != '0'))
				p[c_i][c_j] = available_n++; // mark empty places with numbers 1,2,3...
		}
	}
	srand((unsigned)time(NULL));
	int ran = rand() % (available_n - 49) + 49; // generate a random number
	for (int c_i = 0; c_i != 3; c_i++)
	{
		for (int c_j = 0; c_j != 3; c_j++)
		{
			if (p[c_i][c_j] == ran)
				ret = location_computer[c_i][c_j]; // the chosen place
		}
	}
	for (int c_i = 0; c_i != 3; c_i++)
	{
		for (int c_j = 0; c_j != 3; c_j++)
		{
			if ((p[c_i][c_j] != 'X') && (p[c_i][c_j] != '0'))
				p[c_i][c_j] = ' '; // return to Space
		}
	}
	return ret; // this is the copmuter-chosen location
}

string computer2(vector<vector<char>> p) // Computer Lv.2
{
	char man_player = (computer_player == 'X') ? '0' : 'X'; // define man_player

	/**/ if (p[0][0] == computer_player && p[0][2] == computer_player && p[0][1] == ' ') return location_computer[0][1];
	else if (p[0][0] == computer_player && p[0][1] == computer_player && p[0][2] == ' ') return location_computer[0][2];
	else if (p[0][1] == computer_player && p[0][2] == computer_player && p[0][0] == ' ') return location_computer[0][0]; // Row A
	else if (p[1][0] == computer_player && p[1][2] == computer_player && p[1][1] == ' ') return location_computer[1][1];
	else if (p[1][0] == computer_player && p[1][1] == computer_player && p[1][2] == ' ') return location_computer[1][2];
	else if (p[1][1] == computer_player && p[1][2] == computer_player && p[1][0] == ' ') return location_computer[1][0]; // Row B
	else if (p[2][0] == computer_player && p[2][2] == computer_player && p[2][1] == ' ') return location_computer[2][1];
	else if (p[2][0] == computer_player && p[2][1] == computer_player && p[2][2] == ' ') return location_computer[2][2];
	else if (p[2][1] == computer_player && p[2][2] == computer_player && p[2][0] == ' ') return location_computer[2][0]; // Row C
	else if (p[0][0] == computer_player && p[2][0] == computer_player && p[1][0] == ' ') return location_computer[1][0];
	else if (p[0][0] == computer_player && p[1][0] == computer_player && p[2][0] == ' ') return location_computer[2][0];
	else if (p[1][0] == computer_player && p[2][0] == computer_player && p[0][0] == ' ') return location_computer[0][0]; // Column 1
	else if (p[0][1] == computer_player && p[2][1] == computer_player && p[1][1] == ' ') return location_computer[1][1];
	else if (p[0][1] == computer_player && p[1][1] == computer_player && p[2][1] == ' ') return location_computer[2][1];
	else if (p[1][1] == computer_player && p[2][1] == computer_player && p[0][1] == ' ') return location_computer[0][1]; // Column 2
	else if (p[0][2] == computer_player && p[2][2] == computer_player && p[1][2] == ' ') return location_computer[1][2];
	else if (p[0][2] == computer_player && p[1][2] == computer_player && p[2][2] == ' ') return location_computer[2][2];
	else if (p[1][2] == computer_player && p[2][2] == computer_player && p[0][2] == ' ') return location_computer[0][2]; // Column 3
	else if (p[0][0] == computer_player && p[2][2] == computer_player && p[1][1] == ' ') return location_computer[1][1];
	else if (p[0][0] == computer_player && p[1][1] == computer_player && p[2][2] == ' ') return location_computer[2][2];
	else if (p[1][1] == computer_player && p[2][2] == computer_player && p[0][0] == ' ') return location_computer[0][0]; // Diagonal 1
	else if (p[0][2] == computer_player && p[2][0] == computer_player && p[1][1] == ' ') return location_computer[1][1];
	else if (p[0][2] == computer_player && p[1][1] == computer_player && p[2][0] == ' ') return location_computer[2][0];
	else if (p[1][1] == computer_player && p[2][0] == computer_player && p[0][2] == ' ') return location_computer[0][2]; // Diagonal 2

	else if (p[0][0] == man_player && p[0][2] == man_player && p[0][1] == ' ') return location_computer[0][1];
	else if (p[0][0] == man_player && p[0][1] == man_player && p[0][2] == ' ') return location_computer[0][2];
	else if (p[0][1] == man_player && p[0][2] == man_player && p[0][0] == ' ') return location_computer[0][0]; // Row A
	else if (p[1][0] == man_player && p[1][2] == man_player && p[1][1] == ' ') return location_computer[1][1];
	else if (p[1][0] == man_player && p[1][1] == man_player && p[1][2] == ' ') return location_computer[1][2];
	else if (p[1][1] == man_player && p[1][2] == man_player && p[1][0] == ' ') return location_computer[1][0]; // Row B
	else if (p[2][0] == man_player && p[2][2] == man_player && p[2][1] == ' ') return location_computer[2][1];
	else if (p[2][0] == man_player && p[2][1] == man_player && p[2][2] == ' ') return location_computer[2][2];
	else if (p[2][1] == man_player && p[2][2] == man_player && p[2][0] == ' ') return location_computer[2][0]; // Row C
	else if (p[0][0] == man_player && p[2][0] == man_player && p[1][0] == ' ') return location_computer[1][0];
	else if (p[0][0] == man_player && p[1][0] == man_player && p[2][0] == ' ') return location_computer[2][0];
	else if (p[1][0] == man_player && p[2][0] == man_player && p[0][0] == ' ') return location_computer[0][0]; // Column 1
	else if (p[0][1] == man_player && p[2][1] == man_player && p[1][1] == ' ') return location_computer[1][1];
	else if (p[0][1] == man_player && p[1][1] == man_player && p[2][1] == ' ') return location_computer[2][1];
	else if (p[1][1] == man_player && p[2][1] == man_player && p[0][1] == ' ') return location_computer[0][1]; // Column 2
	else if (p[0][2] == man_player && p[2][2] == man_player && p[1][2] == ' ') return location_computer[1][2];
	else if (p[0][2] == man_player && p[1][2] == man_player && p[2][2] == ' ') return location_computer[2][2];
	else if (p[1][2] == man_player && p[2][2] == man_player && p[0][2] == ' ') return location_computer[0][2]; // Column 3
	else if (p[0][0] == man_player && p[2][2] == man_player && p[1][1] == ' ') return location_computer[1][1];
	else if (p[0][0] == man_player && p[1][1] == man_player && p[2][2] == ' ') return location_computer[2][2];
	else if (p[1][1] == man_player && p[2][2] == man_player && p[0][0] == ' ') return location_computer[0][0]; // Diagonal 1
	else if (p[0][2] == man_player && p[2][0] == man_player && p[1][1] == ' ') return location_computer[1][1];
	else if (p[0][2] == man_player && p[1][1] == man_player && p[2][0] == ' ') return location_computer[2][0];
	else if (p[1][1] == man_player && p[2][0] == man_player && p[0][2] == ' ') return location_computer[0][2]; // Diagonal 2

	else return computer1(point_now);
}

string computer3(vector<vector<char>> p) // Computer Lv.3
{
	vector<vector<char>> p001 = { {' ',' ',' '},{' ',' ',' '},{' ',' ',' '} }; // 0
	vector<vector<char>> p002 = { {'X',' ',' '},{' ',' ',' '},{' ',' ',' '} }; // 1
	vector<vector<char>> p003 = { {' ','X',' '},{' ',' ',' '},{' ',' ',' '} }; // 1
	vector<vector<char>> p004 = { {' ',' ','X'},{' ',' ',' '},{' ',' ',' '} }; // 1
	vector<vector<char>> p005 = { {' ',' ',' '},{'X',' ',' '},{' ',' ',' '} }; // 1
	vector<vector<char>> p006 = { {' ',' ',' '},{' ',' ','X'},{' ',' ',' '} }; // 1
	vector<vector<char>> p007 = { {' ',' ',' '},{' ',' ',' '},{'X',' ',' '} }; // 1
	vector<vector<char>> p008 = { {' ',' ',' '},{' ',' ',' '},{' ','X',' '} }; // 1
	vector<vector<char>> p009 = { {' ',' ',' '},{' ',' ',' '},{' ',' ','X'} }; // 1
	vector<vector<char>> p010 = { {' ',' ',' '},{' ','X',' '},{' ',' ',' '} }; // 1
	vector<vector<char>> p011 = { {'X','0',' '},{' ',' ',' '},{' ',' ',' '} }; // 2
	vector<vector<char>> p012 = { {'X',' ','0'},{' ',' ',' '},{' ',' ',' '} }; // 2
	vector<vector<char>> p013 = { {'X',' ',' '},{'0',' ',' '},{' ',' ',' '} }; // 2
	vector<vector<char>> p014 = { {'X',' ',' '},{' ','0',' '},{' ',' ',' '} }; // 2
	vector<vector<char>> p015 = { {'X',' ',' '},{' ',' ','0'},{' ',' ',' '} }; // 2
	vector<vector<char>> p016 = { {'X',' ',' '},{' ',' ',' '},{'0',' ',' '} }; // 2
	vector<vector<char>> p017 = { {'X',' ',' '},{' ',' ',' '},{' ','0',' '} }; // 2
	vector<vector<char>> p018 = { {'X',' ',' '},{' ',' ',' '},{' ',' ','0'} }; // 2
	vector<vector<char>> p019 = { {'X',' ',' '},{' ','0','X'},{' ',' ',' '} }; // 3
	vector<vector<char>> p020 = { {'X',' ',' '},{' ','0',' '},{' ','X',' '} }; // 3
	vector<vector<char>> p021 = { {'X',' ',' '},{' ','0',' '},{' ',' ','X'} }; // 3
	vector<vector<char>> p022 = { {' ',' ','X'},{' ','0',' '},{'X',' ',' '} }; // 3
	vector<vector<char>> p023 = { {' ',' ','X'},{' ','0',' '},{' ','X',' '} }; // 3
	vector<vector<char>> p024 = { {' ',' ','X'},{'X','0',' '},{' ',' ',' '} }; // 3
	vector<vector<char>> p025 = { {' ',' ',' '},{'X','0',' '},{' ',' ','X'} }; // 3
	vector<vector<char>> p026 = { {' ','X',' '},{' ','0',' '},{' ',' ','X'} }; // 3
	vector<vector<char>> p027 = { {' ','X',' '},{' ','0',' '},{'X',' ',' '} }; // 3
	vector<vector<char>> p028 = { {' ',' ',' '},{' ','0','X'},{'X',' ',' '} }; // 3
	vector<vector<char>> p029 = { {' ','X',' '},{'X','0',' '},{' ',' ',' '} }; // 3
	vector<vector<char>> p030 = { {' ','X',' '},{' ','0','X'},{' ',' ',' '} }; // 3
	vector<vector<char>> p031 = { {' ',' ',' '},{' ','0','X'},{' ','X',' '} }; // 3
	vector<vector<char>> p032 = { {' ',' ',' '},{'X','0',' '},{' ','X',' '} }; // 3
	vector<vector<char>> p033 = { {' ','X',' '},{' ','0',' '},{' ','X',' '} }; // 3
	vector<vector<char>> p034 = { {' ',' ',' '},{'X','0','X'},{' ',' ',' '} }; // 3
	vector<vector<char>> p035 = { {'0',' ',' '},{' ','X',' '},{' ',' ','X'} }; // 3
	vector<vector<char>> p036 = { {'X','0',' '},{' ','X',' '},{' ',' ','0'} }; // 4
	vector<vector<char>> p037 = { {'X',' ',' '},{'0','X',' '},{' ',' ','0'} }; // 4
	vector<vector<char>> p038 = { {'X','0','X'},{' ',' ',' '},{'0',' ','X'} }; // 4
	vector<vector<char>> p039 = { {'X',' ','0'},{'0',' ',' '},{'X',' ',' '} }; // 4
	vector<vector<char>> p040 = { {'X',' ',' '},{' ','0','X'},{' ','X','0'} }; // 5
	vector<vector<char>> p041 = { {' ',' ','X'},{'X','0',' '},{'0','X',' '} }; // 5
	vector<vector<char>> p042 = { {'0','X',' '},{'X','0',' '},{' ',' ','X'} }; // 5
	vector<vector<char>> p043 = { {' ','X','0'},{' ','0','X'},{'X',' ',' '} }; // 5

	/**/ if (p == p001 || p == p010 || p == p025 || p == p026 || p == p029 || p == p041 || p == p043) return "A1";
	else if (p == p034) return "A2";
	else if (p == p016 || p == p018 || p == p027 || p == p028 || p == p030 || p == p037 || p == p040) return "A3";
	else if (p == p002 || p == p003 || p == p004 || p == p005 || p == p006 || p == p007 || p == p008 ||
		/* */p == p009 || p == p011 || p == p013 || p == p015 || p == p017) return "B2";
	else if (p == p033) return "B3";
	else if (p == p012 || p == p023 || p == p024 || p == p032 || p == p035 || p == p036 || p == p042) return "C1";
	else if (p == p021 || p == p022) return "C2";
	else if (p == p014 || p == p019 || p == p020 || p == p031 || p == p038 || p == p039) return "C3";
	else return computer2(p);
}

void chess(string str, char c)
{
	if (c == 'X')
	{
		loadimage(&imageX, _T("X.jpg"), 180, 180);
		/**/ if (str == "A1") putimage(110, 160, &imageX);
		else if (str == "A2") putimage(314, 160, &imageX);
		else if (str == "A3") putimage(518, 160, &imageX);
		else if (str == "B1") putimage(110, 360, &imageX);
		else if (str == "B2") putimage(314, 360, &imageX);
		else if (str == "B3") putimage(518, 360, &imageX);
		else if (str == "C1") putimage(110, 560, &imageX);
		else if (str == "C2") putimage(314, 560, &imageX);
		else if (str == "C3") putimage(518, 560, &imageX);
	}
	else
	{
		loadimage(&image0, _T("0.jpg"), 180, 180);
		/**/ if (str == "A1") putimage(110, 160, &image0);
		else if (str == "A2") putimage(314, 160, &image0);
		else if (str == "A3") putimage(518, 160, &image0);
		else if (str == "B1") putimage(110, 360, &image0);
		else if (str == "B2") putimage(314, 360, &image0);
		else if (str == "B3") putimage(518, 360, &image0);
		else if (str == "C1") putimage(110, 560, &image0);
		else if (str == "C2") putimage(314, 560, &image0);
		else if (str == "C3") putimage(518, 560, &image0);
	}
}

void tip(char c)
{
	if (c == 'X')
	{
		loadimage(&imageXt, _T("Xt.jpg"), 100, 100);
		putimage(1040, 190, &imageXt);
	}
	else
	{
		loadimage(&image0t, _T("0t.jpg"), 100, 100);
		putimage(1040, 190, &image0t);
	}
}

char Man_or_Computer_input()
{
	char ret = '0';
	if (MouseHit())
	{
		MOUSEMSG mouse = GetMouseMsg();
		if (mouse.uMsg == WM_LBUTTONDOWN)
		{
			/**/ if (mouse.y > 0 && mouse.y < 450) ret = '1';
			else if (mouse.y > 450 && mouse.y < 800) ret = '2';
		}
	}
	return ret;
}

char difficulty_input()
{
	char ret = '0';
	if (MouseHit())
	{
		MOUSEMSG mouse = GetMouseMsg();
		if (mouse.uMsg == WM_LBUTTONDOWN)
		{
			/**/ if (mouse.y > 0 && mouse.y < 350) ret = '1';
			else if (mouse.y > 350 && mouse.y < 550) ret = '2';
			else if (mouse.y > 550 && mouse.y < 800) ret = '3';
		}
	}
	return ret;
}
/*
vector<char> to_char(unsigned n)
{
	char c[2] = {'0','0'};
	if (n > 9)
	{
		c[0] = n % 10 + 48;
		c[1] = n / 10 + 48;
	}
	return { c[0],c[1] };
}
*/
void total_result(unsigned com_win, unsigned man_win, unsigned draw)
{
	setbkcolor(RGB(253, 236, 166)); // set the background colour
	settextstyle(60, 30, _T("Times New Roman")); // set the sytle
	settextcolor(BLUE); // set the colour
	TCHAR s1[5], s2[5], s3[5], s4[5], s5[5], s6[5];
	swprintf_s(s1, _T("%d"), man_win);
	swprintf_s(s2, _T("%d"), com_win);
	swprintf_s(s3, _T("%d"), draw);
	swprintf_s(s4, _T("%d"), com_win);
	swprintf_s(s5, _T("%d"), man_win);
	swprintf_s(s6, _T("%d"), draw); // change into string first
	outtextxy(165, 340, s1);
	outtextxy(370, 340, s2);
	outtextxy(575, 340, s3);
	outtextxy(165, 565, s4);
	outtextxy(370, 565, s5);
	outtextxy(575, 565, s6); // print
}

int main()
{
	init1();
	char play_again('1');
	unsigned com_win = 0, man_win = 0, draw = 0;
	char Man_or_Computer = '0';
	loadimage(0, _T("Choice1.jpg"), 1200, 800);
	while (Man_or_Computer == '0')
	{
		Man_or_Computer = Man_or_Computer_input();
	}
	while (play_again == '1')
	{
		char difficulty = '0'; // default setup
		if (Man_or_Computer == '2') // for Man VS Computer
		{
			loadimage(0, _T("Choice2.jpg"), 1200, 800);
			while (difficulty == '0')
			{
				difficulty = difficulty_input();
			}
			loadimage(0, _T("Choice3.jpg"), 1200, 800);
			char You_or_Computer = '0';
			while (You_or_Computer == '0')
			{
				You_or_Computer = Man_or_Computer_input();
			}
			if (You_or_Computer == '1')
				computer_player = '0';
			else computer_player = 'X';
		}
		init2();
		while (win_lose(point_now, step_count) == 0)
		{
			string location;
			unsigned location_letter = 0; // A/B/C
			unsigned location_number = 0; // 1/2/3
			tip(player);
			if(Man_or_Computer == '1')
			    location = man_input();
			else
			{
				if (player == computer_player)
				{
					if (difficulty == '1') location = computer1(point_now);
					else if (difficulty == '2') location = computer2(point_now);
					else location = computer3(point_now);
				}
				else location = man_input();
			}
			chess(location, player); // print the chess
			switch (location[0])
			{
			case 'A':
				location_letter = 0;
				break;
			case 'B':
				location_letter = 1;
				break;
			case 'C':
				location_letter = 2;
				break;
			default:
				break;
			}

			switch (location[1])
			{
			case '1':
				location_number = 0;
				break;
			case '2':
				location_number = 1;
				break;
			case '3':
				location_number = 2;
				break;
			default:
				break;
			}
			point_now[location_letter][location_number] = player;

			game_player_change(player); // change the player
			++step_count; // count one more time
		}

		int final_result = win_lose(point_now, step_count);
		char winner = 'N';
		switch (final_result)
		{
		case 1:
			loadimage(&imageXw, _T("Xw.jpg"), 390, 500);
			putimage(780, 100, &imageXw);
			winner = 'X';
			break;
		case 2:
			loadimage(&image0w, _T("0w.jpg"), 390, 500);
			putimage(780, 100, &image0w);
			winner = '0';
			break;
		case 3:
			loadimage(&imageD, _T("D.jpg"), 390, 500);
			putimage(780, 100, &imageD);
			++draw; // draw count
			break;
		}
		if (Man_or_Computer == '2')
		{
			if (winner == computer_player)
				++com_win;
			else if (winner != 'N')
				++man_win;
			Sleep(5000); //wait for a moment 
 		    loadimage(0, _T("Choice4.jpg"), 1200, 800);
		    total_result(com_win, man_win, draw);
		    play_again = '0';
		    while (play_again == '0')
		    {
                play_again = Man_or_Computer_input();
		    }
        }
		else
		{
			Sleep(5000); //wait for a moment 
			loadimage(0, _T("Choice5.jpg"), 1200, 800);
			play_again = '0';
			while (play_again == '0')
			{
				play_again = Man_or_Computer_input();
			}
		}
		point_now = { { ' ', ' ', ' '},{' ', ' ', ' '},{ ' ', ' ', ' '} }; // empyt the board
		player = 'X';
		computer_player = 'X';
		step_count = 0;
	}
	getchar();
	return 0;
}

//Copyright :2020 Teddy van Jerry

输出示例

1
2
以下:Man VS Man
3
4
5
以下是Man VS Computer:
6
7

素材

【C++ 程序】 井字棋游戏(人 VS 人)(Easy-X 图形界面)之外还有以下素材:(Choice1.jpg 到 Choice5.jpg)
1

2
3

4
5

分析

  • 首先,应该建立游戏的逻辑,详见【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版)
  • 其次,最重要的,是下载EasyX。这个百度上搜一下即可。
    安装
    之后有安装提示可以下载。或者直接点击 https://docs.easyx.cn/en-us/intro
    在这里插入图片描述
  • 然后记得要重启一次 Visual Studio 才有效。
  • 然后加入 graphics.h的头文件。
  • 具体使用可在上面提供的介绍网站上找到。
  • 由于我对 EasyX 不是很了解,所以画表格什么全是在 3D Paint 中完成。
    1
    2
  • 关于328行背景颜色也是在 3D Paint 中找到的:
    3
  • 482行防闪屏。
  • 输出数字我搞了好久没成功(注释掉的to_char()函数就是之前的尝试),后来发现网站上说的很清楚:
    1
    编译有错误,按照要求修改即可。
    2
  • 提醒:进行鼠标操作的函数应该嵌套在一个while中,否则会认为没有输入跳一下就没了。

ALL RIGHTS RESERVED © 2020 Teddy van Jerry
欢迎转载,转载请注明出处。


See also

【C++ 程序】 井字棋游戏(人 VS 人)
【C++ 程序】 井字棋游戏(人 VS Lv1电脑)
【C++ 程序】 井字棋游戏(人 VS Lv2电脑)
【C++ 程序】 井字棋游戏(人 VS Lv3电脑)
【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版)
【C++ 程序】 五子棋游戏(人 VS 人)
【C++ 程序】 五子棋游戏(人 VS Lv1电脑)(思路及框架,内容待填充)
【C++ 程序】 随机数
【C++ 程序】 移动迷宫游戏
【C++ 程序】 贪吃蛇游戏
【C++ 程序】 数字推盘游戏(15-puzzle)
【C++ 程序】 2048游戏
【C++ 程序】 井字棋游戏(人 VS 人)(EasyX 图形界面)
【C++ 程序】 2048游戏(EasyX 图形界面)
【C++ 程序】 贪吃蛇游戏(EasyX 图形界面)

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用EasyX图形库实现的井字棋游戏C++代码,你可以在Visual Studio等IDE中运行该代码: ```c++ #include <graphics.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 3 #define COL 3 #define SIZE 100 int board[ROW][COL] = { 0 }; // 棋盘,0表示空,1表示玩家1,2表示玩家2 int player = 1; // 当前玩家,1表示玩家1,2表示玩家2 int step = 0; // 步数,用于判断平局 int win = 0; // 胜利者,0表示未分胜负,1表示玩家1胜利,2表示玩家2胜利 void draw_board(); // 绘制棋盘 void draw_piece(int row, int col); // 绘制棋子 void put_piece(int row, int col); // 下棋 void check_win(); // 判断胜负 void new_game(); // 开始新游戏 int main() { initgraph(450, 450); // 初始化图形界面 new_game(); // 开始新游戏 closegraph(); // 关闭图形界面 return 0; } void draw_board() { setbkcolor(WHITE); // 设置背景颜色为白色 cleardevice(); // 清空画布 setlinecolor(BLACK); // 设置线条颜色为黑色 setlinestyle(PS_SOLID, 5); // 设置线条样式为实线,粗细为5 for (int i = 1; i < ROW; i++) { line(0, i * SIZE, COL * SIZE, i * SIZE); // 绘制横线 } for (int i = 1; i < COL; i++) { line(i * SIZE, 0, i * SIZE, ROW * SIZE); // 绘制竖线 } } void draw_piece(int row, int col) { int x = col * SIZE + SIZE / 2; int y = row * SIZE + SIZE / 2; if (board[row][col] == 1) { setfillcolor(RED); // 设置填充颜色为红色 solidcircle(x, y, SIZE / 2 - 10); // 绘制红色圆形棋子 } else if (board[row][col] == 2) { setfillcolor(BLUE); // 设置填充颜色为蓝色 solidcircle(x, y, SIZE / 2 - 10); // 绘制蓝色圆形棋子 } } void put_piece(int row, int col) { if (board[row][col] == 0) { // 如果该位置为空 board[row][col] = player; // 下棋 draw_piece(row, col); // 绘制棋子 step++; // 步数加1 check_win(); // 判断胜负 if (win == 0) { // 如果未分胜负 player = 3 - player; // 切换玩家 } } } void check_win() { for (int i = 0; i < ROW; i++) { if (board[i][0] != 0 && board[i][0] == board[i][1] && board[i][1] == board[i][2]) { // 判断横向是否连成一线 win = board[i][0]; break; } } for (int j = 0; j < COL; j++) { if (board[0][j] != 0 && board[0][j] == board[1][j] && board[1][j] == board[2][j]) { // 判断竖向是否连成一线 win = board[0][j]; break; } } if (board[0][0] != 0 && board[0][0] == board[1][1] && board[1][1] == board[2][2]) { // 判断左上到右下是否连成一线 win = board[0][0]; } if (board[0][2] != 0 && board[0][2] == board[1][1] && board[1][1] == board[2][0]) { // 判断右上到左下是否连成一线 win = board[0][2]; } if (win != 0) { // 如果分出胜负 settextcolor(BLACK); // 设置文本颜色为黑色 settextstyle(50, 0, _T("宋体")); // 设置文本样式为50号宋体 outtextxy(100, 200, win == 1 ? _T("玩家1胜利!") : _T("玩家2胜利!")); // 输出胜利者 } else if (step == ROW * COL) { // 如果棋盘已满 settextcolor(BLACK); // 设置文本颜色为黑色 settextstyle(50, 0, _T("宋体")); // 设置文本样式为50号宋体 outtextxy(150, 200, _T("平局!")); // 输出平局 } } void new_game() { draw_board(); // 绘制棋盘 memset(board, 0, sizeof(board)); // 初始化棋盘 player = 1; // 初始化玩家 step = 0; // 初始化步数 win = 0; // 初始化胜利者 while (true) { // 循环等待玩家下棋 if (_kbhit()) { // 如果有按键按下 int key = _getch(); // 获取按键 if (key == 27) { // 如果按下ESC键 break; // 退出游戏 } else if (key == ' ') { // 如果按下空格键 new_game(); // 开始新游戏 break; } else if (key >= '1' && key <= '9') { // 如果按下数字键 int row = (key - '1') / COL; // 计算行号 int col = (key - '1') % COL; // 计算列号 put_piece(row, col); // 下棋 } } } } --相关问题--:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值