UPD: Теперь алгоритм играбелен, но против тупого рандомайзера. Неокончательная версия.

This commit is contained in:
2024-11-02 18:06:23 +05:00
parent 8268e14e8a
commit ae50933cbb
2 changed files with 101 additions and 58 deletions

1
.gitignore vendored
View File

@ -37,3 +37,4 @@
/.idea/misc.xml
/.idea/modules.xml
/.idea/TicTacToe.iml
/.idea/vcs.xml

View File

@ -3,8 +3,8 @@
#include <ctime>
#include <chrono>
#include <thread>
#include <windows.h>
#include <string>
#include <random>
using namespace std;
typedef unsigned int unint;
@ -16,12 +16,12 @@ int main() {
//МЭЙН
const int LINES = 3, COLUMNS = 3;
bool newgame=true, firstnumber;
int turn, humanwin=0, botwin=0;
int turn, humanwin=0, botwin=0, draw;
string wannaplay="y";
const string INCORRECT="INCORRECT VALUE, TRY AGAIN: ", ENDGAME="\nGame says: ''The game ends here.''";
const string XWON="Game says: ''X wins!''", OWON="O wins!", DRAW="Game says: ''Nobody wins - DRAW!''";
const string XWON="Game says: ''X wins!''", OWON="Game says: ''O wins!''", DRAW="Game says: ''Nobody wins - DRAW!''";
const string BOTLOST="Bot says: ''Shee u beat me, I'm worry.''", HUMANLOST="Bot says: ''nahahaha lamer, look how I beat u!''";
const string SEP(15, '-');
const string SEP(40, '-');
const string BOTTHINK="Bot says: ''Wait, I'm thinking.''";
//
//КЛАССЫ
@ -30,6 +30,7 @@ int main() {
public:
bool Xwonflag=false;
bool Owonflag=false;
int drawcounter=1;
//ИГРОВОЕ ПОЛЕ
//первое число LINES характеризует строку
//второе число COLUMNS характеризует столбик
@ -53,7 +54,15 @@ int main() {
cout << endl;
}
}
void BoardClr() {
for (int countlines = 0; countlines < LINES; ++countlines) {
for (int countcolumns = 0; countcolumns < COLUMNS; ++countcolumns) {
board[countlines][countcolumns] = "e";
}
}
}
void XWon() {
if (drawcounter>=4) {
if ((board[0][0])=="'X'") {
if ((board[0][1])=="'X'" and (board[0][2])=="'X'") {Xwonflag=true;}
else if ((board[1][1])=="'X'" and (board[2][2])=="'X'") {Xwonflag=true;}
@ -67,7 +76,9 @@ int main() {
else if ((board[1][1])=="'X'" and (board[0][2])=="'X'") {Xwonflag=true;}
}
}
}
void OWon() {
if (drawcounter>=4) {
if ((board[0][0])=="'O'") {
if ((board[0][1])=="'O'" and (board[0][2])=="'O'") {Owonflag=true;}
else if ((board[1][1])=="'O'" and (board[2][2])=="'O'") {Owonflag=true;}
@ -81,12 +92,25 @@ int main() {
else if ((board[1][1])=="'O'" and (board[0][2])=="'O'") {Owonflag=true;}
}
}
}
void Draw() {
drawcounter=1;
for (int countlines = 0; countlines < LINES; ++countlines) {
for (int countcolumns = 0; countcolumns < COLUMNS; ++countcolumns) {
if (board[countlines][countcolumns]!="e") {
drawcounter++;
}
}
}
}
};
Board BoardObj;
//Ходы игрока и бота
class Turn {
public:
int turnLINEint, turnCOLint;
string Humancount, turnline, turncol;
Board BoardObj;
void HumanTurn() {
//ХОД ИГРОКА
//алгоритм на вычленение первого и второго значений координат
@ -106,15 +130,15 @@ int main() {
//рандомит второе значение (столбец)
srand((time(0)));
turnLINEint=(rand()%3);
Sleep((rand()/3));
srand((time(0)));
turnCOLint=(rand()%3);
//cout << "lineBOT: " << turnLINEint << " colBOT: " << turnCOLint << endl;
chrono::milliseconds timespan((rand()/9));
this_thread::sleep_for(timespan);
mt19937 rng;
rng.seed(time(nullptr));
turnCOLint=(rng()%3);
cout << "Bot says:''I've occupied this cell:" << turnLINEint << turnCOLint << "''" << endl;
}
};
//Объявление объектов
Turn Game;
Board BoardObj;
//
//
//
@ -142,38 +166,51 @@ int main() {
//Также снимает флаг newgame, который возвращается в конце игры.
cout << "Bot asks: Wanna be an X? (1/0):";
cin >> firstnumber;
if (firstnumber) {cout << "Bot says: ''Well, u'll be an X.''" << endl;}
else {cout << "Bot says: ''OK, I'll be an X.''\n" << endl;}
if (firstnumber) {cout << "Bot says: ''Well, u'll be an X.''" << endl; BoardObj.BoardShow();}
else {cout << "Bot says: ''OK, I'll be an X.''" << endl;}
turn=1;
newgame=false;
}
cout << SEP << endl;
cout << "Game says: ''Now it's " << turn << " turn.''" << endl;
turn++;
//cout << "Game says: ''Now it's " << turn << " turn.''" << endl;
//turn++;
Game.turnLINEint=3;
Game.turnCOLint=3;
//Если первым номером (Х) выступает игрок
if (firstnumber) {
cout << "Enter ur coords:";
while (firstnumber) {
cout << "HUMAN TURN!\n" << "Enter ur coords:";
while ((BoardObj.board[Game.turnLINEint][Game.turnCOLint]!="e")) {
Game.HumanTurn();
if ((BoardObj.board[Game.turnLINEint][Game.turnCOLint]!="e")) {cout << INCORRECT;}
}
BoardObj.board[Game.turnLINEint][Game.turnCOLint] = "'X'";
BoardObj.BoardShow();
cout << SEP << endl;
BoardObj.XWon();
BoardObj.Draw();
if ((BoardObj.Xwonflag) or (BoardObj.drawcounter==9)) {break;}
Game.turnLINEint=3;
Game.turnCOLint=3;
cout << BOTTHINK << endl;
cout << "BOT TURN!\n" << BOTTHINK << endl;
while ((BoardObj.board[Game.turnLINEint][Game.turnCOLint]!="e")) {Game.BotTurn();}
BoardObj.board[Game.turnLINEint][Game.turnCOLint] = "'O'";
BoardObj.BoardShow();
cout << SEP << endl;
BoardObj.OWon();
BoardObj.Draw();
if ((BoardObj.Owonflag) or (BoardObj.drawcounter==9)) {break;}
}
//Если игрок выступает вторым номером (O)
else {
cout << BOTTHINK << endl;
while (!firstnumber) {
cout << "BOT TURN!\n" << BOTTHINK << endl;
while ((BoardObj.board[Game.turnLINEint][Game.turnCOLint]!="e")) {Game.BotTurn();}
BoardObj.board[Game.turnLINEint][Game.turnCOLint] = "'X'";
BoardObj.BoardShow();
cout << "Enter ur coords:";
cout << SEP << endl;
BoardObj.XWon();
BoardObj.Draw();
if ((BoardObj.Xwonflag) or (BoardObj.drawcounter==9)) {break;}
cout << "HUMAN TURN!\n" << "Enter ur coords:";
Game.turnLINEint=3;
Game.turnCOLint=3;
while ((BoardObj.board[Game.turnLINEint][Game.turnCOLint]!="e")) {
@ -181,25 +218,30 @@ int main() {
if ((BoardObj.board[Game.turnLINEint][Game.turnCOLint]!="e")) {cout << INCORRECT;}
}
BoardObj.board[Game.turnLINEint][Game.turnCOLint] = "'O'";
}
BoardObj.XWon();
BoardObj.BoardShow();
cout << SEP << endl;
BoardObj.OWon();
if ((BoardObj.Xwonflag) or (BoardObj.Owonflag) or (turn>=9)) {
BoardObj.Draw();
if ((BoardObj.Owonflag) or (BoardObj.drawcounter==9)) {break;}
}
cout << ENDGAME << endl;
newgame=true;
if (BoardObj.Xwonflag) {cout << XWON << endl;}
else if (BoardObj.Owonflag) {cout << OWON << endl;}
else if ((turn>=9) and (!BoardObj.Xwonflag) and (!BoardObj.Owonflag)) {cout << DRAW << endl;}
else if ((BoardObj.drawcounter==9) and (!BoardObj.Xwonflag) and (!BoardObj.Owonflag)) {cout << DRAW << endl;}
if ((firstnumber) and (BoardObj.Xwonflag)) {cout << BOTLOST << endl; humanwin=+1;}
else if ((!firstnumber) and (BoardObj.Owonflag)) {cout << BOTLOST << endl; humanwin=+1;}
else {cout << HUMANLOST << endl; botwin=+1;}
if ((firstnumber) and (BoardObj.Xwonflag)) {cout << BOTLOST << endl; humanwin++;}
else if ((!firstnumber) and (BoardObj.Owonflag)) {cout << BOTLOST << endl; humanwin++;}
else if (BoardObj.drawcounter==9) {cout << "Bot says: ''yeah dat was fairplay.''" << endl;}
else {cout << HUMANLOST << endl; botwin++;}
BoardObj.BoardClr();
BoardObj.Xwonflag=false;
BoardObj.Owonflag=false;
cout << SEP << endl;
cout << SEP << endl;
cout << "Wanna play another time?(y/n):";
cin >> wannaplay;
}
}
//
//СТАТИСТИКА ПРИ ЗАВЕРШЕНИИ ИГРЫ
cout << SEP << endl;