From 8268e14e8a1487b839e40121b4167366672cd866 Mon Sep 17 00:00:00 2001 From: "vadim.bochkov" Date: Fri, 1 Nov 2024 15:52:41 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9A=D1=80=D0=B5=D1=81=D1=82=D0=B8=D0=BA?= =?UTF-8?q?=D0=B8-=D0=BD=D0=BE=D0=BB=D0=B8=D0=BA=D0=B8=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=82=D0=B8=D0=B2=20=D0=B1=D0=BE=D1=82=D0=B0=20=D1=81=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=BC=D0=B8=D1=82=D0=B8=D0=B2=D0=BD=D1=8B?= =?UTF-8?q?=D0=BC=20=D1=80=D0=B0=D0=BD=D0=B4=D0=BE=D0=BC=D0=B0=D0=B9=D0=B7?= =?UTF-8?q?=D0=B5=D1=80=D0=BE=D0=BC=20=D0=B2=20=D1=80=D0=BE=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=98=D0=98.=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20=D0=B4?= =?UTF-8?q?=D0=B2=D1=83=D0=BC=D0=B5=D1=80=D0=BD=D1=8B=D0=B9=20=D0=BC=D0=B0?= =?UTF-8?q?=D1=81=D1=81=D0=B8=D0=B2=20=D0=B8=20=D0=BE=D0=B1=D1=8A=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D1=8B-=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B=20(?= =?UTF-8?q?=D0=BD=D0=B0=D1=81=D0=BA=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=8F?= =?UTF-8?q?=20=D0=B8=D1=85=20=D0=BF=D0=BE=D0=BD=D1=8F=D0=BB).=20=D0=9C?= =?UTF-8?q?=D0=BE=D0=B6=D0=BD=D0=BE=20=D0=B8=D0=B3=D1=80=D0=B0=D1=82=D1=8C?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B2=D1=8B=D0=BC=20=D0=B8=20=D0=B2=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=D0=BC=20=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=D0=BE?= =?UTF-8?q?=D0=BC,=20=D0=B8=D0=B3=D1=80=D0=B0=20=D0=B2=D0=B5=D0=B4=D1=91?= =?UTF-8?q?=D1=82=20=D1=81=D1=87=D1=91=D1=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 39 +++++++++ CMakeLists.txt | 6 ++ main.cpp | 214 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 259 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1c35b99 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +/cmake-build-debug/.cmake/api/v1/query/cache-v2 +/cmake-build-debug/.cmake/api/v1/query/cmakeFiles-v1 +/cmake-build-debug/.cmake/api/v1/query/codemodel-v2 +/cmake-build-debug/.cmake/api/v1/query/toolchains-v1 +/cmake-build-debug/.cmake/api/v1/reply/cache-v2-281607456d1cb183dd29.json +/cmake-build-debug/.cmake/api/v1/reply/cmakeFiles-v1-0029ce9b068fb614e1dc.json +/cmake-build-debug/.cmake/api/v1/reply/codemodel-v2-d0ab181aa7b1350e0211.json +/cmake-build-debug/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +/cmake-build-debug/.cmake/api/v1/reply/index-2024-10-27T06-42-29-0764.json +/cmake-build-debug/.cmake/api/v1/reply/target-TicTacToe-Debug-266a9f9167a4e0d9612b.json +/cmake-build-debug/.cmake/api/v1/reply/toolchains-v1-a2523d1a0a47b8d9fb88.json +/cmake-build-debug/CMakeFiles/3.28.1/CompilerIdC/a.exe +/cmake-build-debug/CMakeFiles/3.28.1/CompilerIdC/CMakeCCompilerId.c +/cmake-build-debug/CMakeFiles/3.28.1/CompilerIdCXX/a.exe +/cmake-build-debug/CMakeFiles/3.28.1/CompilerIdCXX/CMakeCXXCompilerId.cpp +/cmake-build-debug/CMakeFiles/3.28.1/CMakeCCompiler.cmake +/cmake-build-debug/CMakeFiles/3.28.1/CMakeCXXCompiler.cmake +/cmake-build-debug/CMakeFiles/3.28.1/CMakeDetermineCompilerABI_C.bin +/cmake-build-debug/CMakeFiles/3.28.1/CMakeDetermineCompilerABI_CXX.bin +/cmake-build-debug/CMakeFiles/3.28.1/CMakeRCCompiler.cmake +/cmake-build-debug/CMakeFiles/3.28.1/CMakeSystem.cmake +/cmake-build-debug/CMakeFiles/TicTacToe.dir/main.cpp.obj +/cmake-build-debug/CMakeFiles/clion-Debug-log.txt +/cmake-build-debug/CMakeFiles/clion-environment.txt +/cmake-build-debug/CMakeFiles/cmake.check_cache +/cmake-build-debug/CMakeFiles/CMakeConfigureLog.yaml +/cmake-build-debug/CMakeFiles/rules.ninja +/cmake-build-debug/CMakeFiles/TargetDirectories.txt +/cmake-build-debug/Testing/Temporary/LastTest.log +/cmake-build-debug/.ninja_deps +/cmake-build-debug/.ninja_log +/cmake-build-debug/build.ninja +/cmake-build-debug/cmake_install.cmake +/cmake-build-debug/CMakeCache.txt +/cmake-build-debug/TicTacToe.exe +/.idea/.gitignore +/.idea/misc.xml +/.idea/modules.xml +/.idea/TicTacToe.iml diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..c2e5edc --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.28) +project(TicTacToe) + +set(CMAKE_CXX_STANDARD 17) + +add_executable(TicTacToe main.cpp) diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..59860b6 --- /dev/null +++ b/main.cpp @@ -0,0 +1,214 @@ +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +typedef unsigned int unint; + +int main() { + // + //ПЕРЕМЕННЫЕ + // + //МЭЙН + const int LINES = 3, COLUMNS = 3; + bool newgame=true, firstnumber; + int turn, humanwin=0, botwin=0; + 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 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 BOTTHINK="Bot says: ''Wait, I'm thinking.''"; + // + //КЛАССЫ + //Класс, отвечающий за формирование и вывод поля + class Board { + public: + bool Xwonflag=false; + bool Owonflag=false; + //ИГРОВОЕ ПОЛЕ + //первое число LINES характеризует строку + //второе число COLUMNS характеризует столбик + string board[LINES][COLUMNS] = { + {"e", "e", "e"}, + {"e", "e", "e"}, + {"e", "e", "e"} + }; + //Функция вывода поля. + //Пустая клетка ("е") выводится координатами, а занятая - своим знаком. + void BoardShow() { + for (int countlines = 0; countlines < LINES; ++countlines) { + for (int countcolumns = 0; countcolumns < COLUMNS; ++countcolumns) { + if (board[countlines][countcolumns]=="e") { + cout << countlines << countcolumns << " "; + } + else { + cout << board[countlines][countcolumns] << " "; + } + } + cout << endl; + } + } + void XWon() { + 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;} + else if ((board[1][0])=="'X'" and (board[2][0])=="'X'") {Xwonflag=true;} + } + if (((board[1][0])=="'X'") and ((board[1][1])=="'X'") and ((board[1][2]))=="'X'") {Xwonflag=true;} + if (((board[0][1])=="'X'") and ((board[1][1])=="'X'") and ((board[2][1]))=="'X'") {Xwonflag=true;} + if (((board[0][2])=="'X'") and ((board[1][2])=="'X'") and ((board[2][2]))=="'X'") {Xwonflag=true;} + if ((board[2][0])=="'X'") { + if ((board[2][1])=="'X'" and (board[2][2])=="'X'") {Xwonflag=true;} + else if ((board[1][1])=="'X'" and (board[0][2])=="'X'") {Xwonflag=true;} + } + } + void OWon() { + 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;} + else if ((board[1][0])=="'O'" and (board[2][0])=="'O'") {Owonflag=true;} + } + if (((board[1][0])=="'O'") and ((board[1][1])=="'O'") and ((board[1][2]))=="'O'") {Owonflag=true;} + if (((board[0][1])=="'O'") and ((board[1][1])=="'O'") and ((board[2][1]))=="'O'") {Owonflag=true;} + if (((board[0][2])=="'O'") and ((board[1][2])=="'O'") and ((board[2][2]))=="'O'") {Owonflag=true;} + if ((board[2][0])=="'O'") { + if ((board[2][1])=="'O'" and (board[2][2])=="'O'") {Owonflag=true;} + else if ((board[1][1])=="'O'" and (board[0][2])=="'O'") {Owonflag=true;} + } + } + }; + //Ходы игрока и бота + class Turn { + public: + int turnLINEint, turnCOLint; + string Humancount, turnline, turncol; + void HumanTurn() { + //ХОД ИГРОКА + //алгоритм на вычленение первого и второго значений координат + //получает строку вида "XY", первый символ кидает через at в строку для Х, + //второй символ также символ кидает в строку для Y, + //затем переводит обе строки в числа, с которыми можно вести вычисления. + cin >> Humancount; + turnline=Humancount.at(0); + turncol=Humancount.at(1); + turnLINEint=stoi(turnline); + turnCOLint=stoi(turncol); + //cout << "\nlineHUMAN: " << turnLINEint << " colHUMAN: " << turnCOLint << endl; + } + void BotTurn() { + //ХОД БОТА + //рандомит первое значение (строку), засыпает, + //рандомит второе значение (столбец) + srand((time(0))); + turnLINEint=(rand()%3); + Sleep((rand()/3)); + srand((time(0))); + turnCOLint=(rand()%3); + //cout << "lineBOT: " << turnLINEint << " colBOT: " << turnCOLint << endl; + } + }; + //Объявление объектов + Turn Game; + Board BoardObj; + // + // + // + // + //Заглавие игры. Инструкции для игрока. Выводится только при первом запуске. + cout << "Bot says:" << endl; + cout << "''Wolcome to TicTacToe choom." << endl; + cout << "Look at the clear board." << endl; + BoardObj.BoardShow(); + cout << "When u wanna do ur turn - u should type coordinates of the any empty cell." << endl; + cout << "(For example '22' or '10')" << endl; + cout << "I afford I shouldn't explain u rules of the TicTacToe. So let's play brodie.''" << endl; + // + //Основной цикл игры + while (wannaplay=="y") { + //Объявление переменных при старте новой игры на основе булевого флага newgame. + //Флаг newgame становится TRUE на стадии "Заглавие игры", + //становится FALSE в начале цикла после присвоения переменных, + //и снова становится TRUE при окончании цикла (т.е. при чьей-то победе или ничье). + if (newgame) { + // + //Запрос на то, кто первый. 1=игрок, 0=бот. + //Выводит соответствующее сообщение после выбора. + //Обнуляет общие переменные. + //Также снимает флаг 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;} + turn=1; + newgame=false; + } + cout << SEP << endl; + cout << "Game says: ''Now it's " << turn << " turn.''" << endl; + turn++; + Game.turnLINEint=3; + Game.turnCOLint=3; + //Если первым номером (Х) выступает игрок + if (firstnumber) { + cout << "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'"; + Game.turnLINEint=3; + Game.turnCOLint=3; + cout << BOTTHINK << endl; + while ((BoardObj.board[Game.turnLINEint][Game.turnCOLint]!="e")) {Game.BotTurn();} + BoardObj.board[Game.turnLINEint][Game.turnCOLint] = "'O'"; + BoardObj.BoardShow(); + } + //Если игрок выступает вторым номером (O) + else { + cout << 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:"; + Game.turnLINEint=3; + Game.turnCOLint=3; + 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] = "'O'"; + } + BoardObj.XWon(); + BoardObj.OWon(); + if ((BoardObj.Xwonflag) or (BoardObj.Owonflag) or (turn>=9)) { + 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;} + + 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;} + cout << SEP << endl; + cout << SEP << endl; + cout << "Wanna play another time?(y/n): "; + cin >> wannaplay; + } + } + // + //СТАТИСТИКА ПРИ ЗАВЕРШЕНИИ ИГРЫ + cout << SEP << endl; + cout << "SOME STATS OF SESSION:" << endl; + cout << "Bot says: ''Hell u won me " << humanwin << " times.\nAnd I won u " << botwin << " times.''" << endl; + // + //компьютер респектует или лошит игрока + if (humanwin