[C++ program] Gobang game (human VS Lv1 computer) (ideas and framework, content to be filled)

Ideas

The first is the most important level, that is, you can win in the next step, first yourself and then the opponent.
Then comes the second most important level, that is, the next step will be a killer situation. At the same time, it is necessary to carry out quantitative statistics for this kind of position, and choose the most effective one, first oneself and then the other party.
Finally, importance is scored. Score based on the eight directions of an empty point. Down in the high-scoring position.
But the situation is too complicated, I can't write more than 800 lines, and I use the to_string function incorrectly, and then it blows up.
So memorize your ideas first, and adjust later if you have the opportunity.

Procedure (unfinished)

//This program is an unfinished simple gobang game.

#include <iostream>
#include <string>
#include <vector>
#include <cstddef>
#include <ctime>
using namespace std;

char player = 'X';
char computer_player = 'X';
unsigned step_count = 0;
vector<vector<char>> p_n; // struct an undefined board;

void def_empty_board(vector<vector<char>>& p) // define an empty 15X15 board
{
    
    
	vector<char> p_n_temp;
	for (size_t i = 0; i != 15; i++) p_n_temp.push_back(' '); // the inner vector
	for (size_t i = 0; i != 15; i++) p.push_back(p_n_temp);   // the outer vector(i.e. the board)
}

void print_board(vector<vector<char>> p)
{
    
    
	char ch_15[15];
	for (size_t i = 0; i != 15; i++) ch_15[i] = 65 + i; // A-O ~ 65-79 (according to ASCII)
	cout << "| |0|0|0|0|0|0|0|0|0|1|1|1|1|1|1|" << endl;
	cout << "| |1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|" << endl;
	for (size_t i = 0; i != 15; i++) // print 15 lines from A to O
	{
    
    
		cout << '|' << ch_15[i] << '|';
		for (size_t j = 0; j != 15; j++)
			cout << p[i][j] << '|';
		cout << endl;
	}
	cout << endl;
}

int change_board(vector<vector<char>>& p, string l)
{
    
    
	size_t location_letter, location_number;
	if (l.size() == 2)
	{
    
    
		if (toupper(l[0]) >= 65 && l[1] >= 48)
		{
    
    
			location_letter = toupper(l[0]) - 65; // row
			location_number = l[1] - 48 - 1;      // column
			if (location_letter > 14 || location_number > 9) return -1; // PASS
		}
		else return -1; // no change is made, i.e. PASS
	}
	else if (l.size() == 3)
		if (toupper(l[0]) >= 65 && l[1] >= 48 && l[2] >= 48)
		{
    
    
			location_letter = toupper(l[0]) - 65;                 // row
			location_number = 10 * (l[1] - 48) + (l[2] - 48) - 1; // column
			if (location_letter > 14 || location_number > 14) return -1; // PASS
		}
		else return -1; // no change is made, i.e. PASS
	else return -1;     // no change is made, i.e. PASS
	if (p[location_letter][location_number] == ' ')
	{
    
    
		p[location_letter][location_number] = player; // change the board
		return 0; // indicate success
	}
	else return -1; // no change is made, i.e. PASS
}

int win_lose(vector<vector<char>> p, int n)
{
    
    
	char c = 'X';
	for (int k = 1; k != 3; k++) // k = 1(check 'X') ; k = 2(check '0')
	{
    
    
		for (size_t i = 0; i <= 14; i++)
		{
    
    
			for (size_t j = 0; j <= 10; j++)
			{
    
    
				if (p[i][j] == c && p[i][j + 1] == c && p[i][j + 2] == c && p[i][j + 3] == c && p[i][j + 4] == c) // five in a row
					return k;
			}
		}
		for (size_t i = 0; i <= 10; i++)
		{
    
    
			for (size_t j = 0; j <= 14; j++)
			{
    
    
				if (p[i][j] == c && p[i + 1][j] == c && p[i + 2][j] == c && p[i + 3][j] == c && p[i + 4][j] == c) // five in a column
					return k;
			}
		}
		for (size_t i = 0; i <= 10; i++)
		{
    
    
			for (size_t j = 0; j <= 10; j++)
			{
    
    
				if (p[i][j] == c && p[i + 1][j + 1] == c && p[i + 2][j + 2] == c && p[i + 3][j + 3] == c && p[i + 4][j + 4] == c) // five in a diagonal1
					return k;
			}
		}
		for (size_t i = 0; i <= 10; i++)
		{
    
    
			for (size_t j = 4; j <= 14; j++)
			{
    
    
				if (p[i][j] == c && p[i + 1][j - 1] == c && p[i + 2][j - 2] == c && p[i + 3][j - 3] == c && p[i + 4][j - 4] == c) // five in a diagonal2
					return k;
			}
		}
		c = '0'; // Then test player '0'.
		// 'return 1' indicates 'X' wins while 'return 2' indicates '0' wins.	
	}
	if (n == 225) return 3; // the board if full and no win, end 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
}

string priority1(vector<vector<char>> p) // top priority
{
    
    
	// top priority
}

string priority2(vector<vector<char>> p)
{
    
    
	// second priority
}

string signifacance(vector<vector<char>> p)
{
    
    
    // rank by signifance
}

string computer1(vector<vector<char>> p) // Computer Lv.1
{
    
    
	// priority1 -> priority2 -> significance
}

int main(int argc, char* argv[])
{
    
    
	string location;
	cout << "This program is a simple gobang game.\nProgrammer:Teddy van Jerry\n" << endl;
	cout << "If your input is illegal, we define it as you choose to PASS.(Or you can type in Pass to pass)" << endl;
	cout << "You can type in the location like 'B2' or 'B02', and no whitespace is allowed.\n" << endl; // a reminder
	cout << "Please choose 'Man VS Man'(1) or 'Man VS Computer'(2) : ";
	char Man_or_Computer;
	cin >> Man_or_Computer;
	cout << "\nYou go first or the computer? You(1), Computer(2): ";
	char You_or_Computer;
	cin >> You_or_Computer;
	std::cout << endl;
	computer_player = (You_or_Computer == '1') ? '0' : 'X';
	def_empty_board(p_n);
	print_board(p_n);
	while (win_lose(p_n, step_count) == 0) // while the game is unfinished
	{
    
    

		cout << "Player " << player << ", make your move: ";
		if (Man_or_Computer == 1 or player != computer_player)
			cin >> location;
		else
		{
    
    
			location = computer1(p_n);
			cout << location << endl;
		}
		if (change_board(p_n, location) == 0) // change the board and test whether it's a PASS
		{
    
    
			cout << endl;
			print_board(p_n);
			++step_count; // count one more time
		}
		else cout << "Player " << player << " choose PASS.\n" << endl;
		game_player_change(player);
	}
	switch (win_lose(p_n, step_count))
	{
    
    
	case 1:
		cout << "Congratulations! The winner is X." << endl;
		break;
	case 2:
		cout << "Congratulations! The winner is 0." << endl;
		break;
	case 3:
		cout << "The game ended in a draw." << endl;
	default:
		break;
	}

	if (player == computer_player)
		cout << "Computer won!" << endl;
	else cout << "You won!!!" << endl;

	cout << "\nALL RIGHTS RESERVED (c) 2020 Teddy van Jerry" << endl;
	return 0;
}

//Copyright :2020 Teddy van Jerry

Sample output

Output
a total failure!!!


ALL RIGHTS RESERVED © 2020 Teddy van Jerry
welcome to reprint, please indicate the source.


See also

Teddy van Jerry’s navigation page
[C++ program] Gobang game (human VS human)
[C++ program] Tic-Tac-Toe game (human VS human)
[C++ program] Tic-Tac-Toe game (human VS Lv1 computer)
[C++ program] Tic Tac Toe Chess Game (Human VS Lv2 Computer)
[C++ Program] Tic-Tac-Toe Game (Human VS Lv3 Computer)
[C++ Program] Tic-Tac-Toe Game (Human VS Lv3 Computer) (Statistical Version)
[C++ Program] Moving Maze Game
[C++ Program] Snake game
[C++ program] Digital push board game (15-puzzle)
[C++ program] 2048 game
[C++ program] Tic-tac-toe game (human VS human) (EasyX graphical interface)
[C++ program] Tic-Tac-Toe Game (Human VS Lv3 Computer) (Statistics Edition) (EasyX Graphical Interface)

Guess you like

Origin blog.csdn.net/weixin_50012998/article/details/108380352