アイデア
最初は最も重要なレベルです。つまり、次のステップで勝つことができます。まず自分自身、次に対戦相手です。
次に、2番目に重要なレベルになります。つまり、次のステップはキラー状況になります。同時に、この種のポジションについて定量的統計を実行し、最も効果的なものを最初に自分、次に相手を選択する必要があります。
最後に、重要性が記録されます。空のポイントの8つの方向に基づいてスコアを付けます。高得点でダウン。
しかし、状況は複雑すぎて、800行を超えることはできず、to_string関数を誤って使用すると、爆発します。
そのため、最初にアイデアを記憶し、機会があれば後で調整します。
手順(未完成)
//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
出力例
完全な失敗!!!
ALL RIGHTS RESERVED©2020 Teddy van Jerry
転載を歓迎します。出典を明記してください。
こちらもご覧ください
Teddy van Jerryのナビゲーションページ
[C ++プログラム] Gobangゲーム(人間VS人間)
[C ++プログラム] Tic-Tac-Toeゲーム(人間VS人間)
[C ++プログラム] Tic-Tac-Toeゲーム(人間VS Lv1コンピューター)
[C ++プログラム] Tic Tac Toeチェスゲーム(人間VS Lv2コンピューター)
[C ++プログラム]三目並べゲーム(人間VS Lv3コンピューター)
[C ++プログラム]三目並べゲーム(人間VS Lv3コンピューター)(統計バージョン)
[C ++プログラム]動く迷路ゲーム
[C ++プログラム]ヘビゲーム
[C ++プログラム]デジタルプッシュボードゲーム(15パズル)
[C ++プログラム] 2048ゲーム
[C ++プログラム]三目並べゲーム(人間対人間)(EasyXグラフィカルインターフェース)[C ++プログラム] 三目並べ
ゲーム(Human VS Lv3 Computer)(Statistics Edition)(EasyX Graphical Interface)