|
0 / 0 / 0
Регистрация: 14.05.2010
Сообщений: 11
|
|
Tic-tac-toe на С++ (крестики нолики)06.10.2010, 22:30. Показов 3214. Ответов 3
Метки нет (Все метки)
Доброго времени суток уважаемые коллеги - программисты. Я начинающий программист. В С++ только недавно. Можно сказать, что это приложение мой первый серьезный проект на это языке. На днях устраивался на работу. Что бы проверить мои знания, они дали мне задание - написать крестики нолики на С++. 2 недели я сначала изучал синтаксис языка, и буквально за 2-3 дня написал эту игру. Хотелось бы вас попросить, уважаемые программисты, что вы посмотрели на алгоритм вашимы опытными глазами и предложили мнеболее эффективный алгоритм. Мне кажется есть более простой алгоритм.Прикрепляю мой проект. Заранее спасибо.
0
|
|
| 06.10.2010, 22:30 | |
|
Ответы с готовыми решениями:
3
Tic Tac Toe (Крестики-нолики) Крестики-нолики (tic-tac-toe) двумерный массив
|
|
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
|
|
| 06.10.2010, 22:31 | |
|
Код в студию. Качать лень.
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 06.10.2010, 22:38 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 14.05.2010
Сообщений: 11
|
|
| 07.10.2010, 09:58 [ТС] | |
|
//---------------------------------------------------------------------------
#include <vcl.h> #include <math.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "PERFGRAP" #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- int Mas[3][3] = {90,80,70, 60,50,40, 30,20,10}; bool cont = true; // если false, программа не работает short run=0; // шаг игры short AY,AX; // координаты ячейки массива, в которой ИИ должен поставить О bool TekWinO; // если true; значит ИИ будует защищаться, если нет ИИ будет отаковать void ControlMas(void); void ManMade(void); void ShowXO(void); void WinX(int L); void WinO(int i); void WinO(int i) // ПРОЦЕДУРА ОПРЕДЕЛЯЕТ КОРРЕКТНЫЙ ХОД ИИ НА 4 ШАГЕ ИГРЫ { switch(i) { case 2: bool tekend = false; // true - тогда ситуация попадает в один из случаев, если нет тогда !!!последний случай!!! // Действие ИИ, когда есть возможность вилки, как на картинке if( ((Mas[0][0] == Mas[2][2]) & (Mas[0][0] == 1)) | ((Mas[0][2] == Mas[2][0]) & (Mas[0][2] == 1))) { randomize(); int r = random(4); // |_x_|_ _|_ _| if(r==0) Mas[0][1] = 0; // |_ _|_o_|_ _| if(r==1) Mas[1][0] = 0; // |_ _|_ _|_x_| if(r==2) Mas[2][1] = 0; // if(r==3) Mas[1][2] = 0; ShowXO(); tekend = true; } // Действие ИИ, когда нету просчета выигрыша или проигрыша, то есть когда нельзя помешать сопернику и сам тоже не сможешь выигрыть if( (Mas[0][0] != Mas[2][2]) & (Mas[0][0] != 90) & (Mas[2][2] != 10)) { randomize(); // |_x_|_ _|_ _| int r = random(2); // |_ _|_x_|_ _| if(r==0) Mas[0][2] = 0; // |_ _|_ _|_o_| if(r==1) Mas[2][0] = 0; // ShowXO(); tekend = true; } if( (Mas[0][2] != Mas[2][0]) & (Mas[0][2] != 70) & (Mas[2][2] != 30)) { randomize(); // |_ _|_ _|_x_| int r = random(2); // |_ _|_x_|_ _| if(r==0) Mas[0][0] = 0; // |_o_|_ _|_ _| if(r==1) Mas[2][2] = 0; ShowXO(); tekend = true; } // Дейские ИИ когда, ситуация как на рисунке ниже. if( (Mas[0][0] == 90) & (Mas[0][2] == 70) & (Mas[2][0] == 30) & (Mas[2][2] == 10)) { if( (Mas[1][0] == Mas[0][1]) & (Mas[1][0] == 1)) { randomize(); // |_ _|_х_|_ _| int r = random(2); // |_х_|_о_|_ _| if(r==0) Mas[2][0] = 0; // |_ _|_ _|_ _| if(r==1) Mas[0][2] = 0; ShowXO(); tekend = true; } if( (Mas[0][1] == Mas[1][2]) & (Mas[0][1] == 1)) { randomize(); int r = random(2); // |_ _|_х_|_ _| if(r==0) Mas[0][0] = 0; // |_ _|_о_|_х_| if(r==1) Mas[2][2] = 0; // |_ _|_ _|_ _| ShowXO(); tekend = true; } if( (Mas[1][2] == Mas[2][1]) & (Mas[1][2] == 1)) { randomize(); int r = random(2); // |_ _|_ _|_ _| if(r==0) Mas[2][0] = 0; // |_ _|_о_|_х_| if(r==1) Mas[0][2] = 0; // |_ _|_х_|_ _| ShowXO(); tekend = true; } if( (Mas[2][1] == Mas[1][0]) & (Mas[1][0] == 1)) { randomize(); int r = random(2); // |_ _|_ _|_ _| if(r==0) Mas[0][0] = 0; // |_х_|_о_|_ _| if(r==1) Mas[2][2] = 0; // |_ _|_х_|_ _| ShowXO(); tekend = true; } // Дейские ИИ, когда ситуация, как на картинке ниже if( ((Mas[0][1]==Mas[2][1]) & (Mas[0][1]==1)) | ((Mas[1][0]==Mas[1][2]) & (Mas[0][1]==1)) ) { randomize(); int r = random(4); // |_ _|_x_|_ _| if(r==0) Mas[0][0] = 0; // |_ _|_o_|_ _| if(r==1) Mas[0][2] = 0; // |_ _|_x_|_ _| if(r==2) Mas[2][0] = 0; // if(r==3) Mas[2][2] = 0; // |_ _|_ _|_ _| ShowXO(); // |_x_|_o_|_x_| tekend = true; // |_ _|_ _|_ _| } } // Последний случай if(tekend == false) { if((Mas[0][0] == 90) & (Mas[2][2] == 10)) { randomize(); int r = random(2); // |_[]_|_x_|_ _| if(r==0) Mas[0][0] = 0; // |_ _|_o_|_ _| if(r==1) Mas[2][2] = 0; // |_ x|_ _|_[]_| ShowXO(); // [] = свободные } if((Mas[0][2] == 70) & (Mas[2][0] == 30)) { randomize(); int r = random(2); // |_x_|_ _|_[]_| if(r==0) Mas[0][2] = 0; // |_ _|_o_|_ _| if(r==1) Mas[2][0] = 0; // |_[]_|_x_|_ _| ShowXO(); // [] = свободные } } break; } } void __fastcall TForm1::Image1Click(TObject *Sender) { // Проверяю пустой ли Image и не закончилась ли игра if((Image1->Picture->Bitmap->Empty != false) & (cont != false)) { Mas[0][0] = 1; // Заполняю массив ShowXO(); // вывожу на экран текущее положение Х и О run++; // увеличиваю переменную шага игры на 1 ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается if(cont!=false)ManMade(); // ход делает ИИ, если игра не окончена ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается } } //--------------------------------------------------------------------------- void __fastcall TForm1::Image2Click(TObject *Sender) { // Проверяю пустой ли Image и не закончилась ли игра if((Image2->Picture->Bitmap->Empty != false) & (cont != false)) { Mas[0][1] = 1; // Заполняю массив ShowXO(); // вывожу на экран текущее положение Х и О run++; // увеличиваю переменную шага игры на 1 ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается if(cont!=false) ManMade(); // ход делает ИИ, если игра не окончена ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается } } //--------------------------------------------------------------------------- void __fastcall TForm1::Image3Click(TObject *Sender) { // Проверяю пустой ли Image и не закончилась ли игра if((Image3->Picture->Bitmap->Empty != false) & (cont != false)) { Mas[0][2] = 1; // Заполняю массив ShowXO(); // вывожу на экран текущее положение Х и О run++; // увеличиваю переменную шага игры на 1 ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается if(cont!=false) ManMade(); // ход делает ИИ, если игра не окончена ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается } } //--------------------------------------------------------------------------- void __fastcall TForm1::Image4Click(TObject *Sender) { // Проверяю пустой ли Image и не закончилась ли игра if((Image4->Picture->Bitmap->Empty != false) & (cont != false)) { Mas[1][0] = 1; // Заполняю массив ShowXO(); // вывожу на экран текущее положение Х и О run++; // увеличиваю переменную шага игры на 1 ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается if(cont!=false) ManMade(); // ход делает ИИ, если игра не окончена ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается } } //--------------------------------------------------------------------------- void __fastcall TForm1::Image5Click(TObject *Sender) { // Проверяю пустой ли Image и не закончилась ли игра if((Image5->Picture->Bitmap->Empty != false) & (cont != false)) { Mas[1][1] = 1; // Заполняю массив ShowXO(); // вывожу на экран текущее положение Х и О run++; // увеличиваю переменную шага игры на 1 ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается if(cont!=false) ManMade(); // ход делает ИИ, если игра не окончена ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается } } //--------------------------------------------------------------------------- void __fastcall TForm1::Image6Click(TObject *Sender) { // Проверяю пустой ли Image и не закончилась ли игра if((Image6->Picture->Bitmap->Empty != false) & (cont != false)) { Mas[1][2] = 1; // Заполняю массив ShowXO(); // вывожу на экран текущее положение Х и О run++; // увеличиваю переменную шага игры на 1 ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается if(cont!=false) ManMade(); // ход делает ИИ, если игра не окончена ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается } } //--------------------------------------------------------------------------- void __fastcall TForm1::Image7Click(TObject *Sender) { // Проверяю пустой ли Image и не закончилась ли игра if((Image7->Picture->Bitmap->Empty != false) & (cont != false)) { Mas[2][0] = 1; // Заполняю массив ShowXO(); // вывожу на экран текущее положение Х и О run++; // увеличиваю переменную шага игры на 1 ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается if(cont!=false) ManMade(); // ход делает ИИ, если игра не окончена ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается } } //--------------------------------------------------------------------------- void __fastcall TForm1::Image8Click(TObject *Sender) { // Проверяю пустой ли Image и не закончилась ли игра if((Image8->Picture->Bitmap->Empty != false) & (cont != false)) { Mas[2][1] = 1; // Заполняю массив ShowXO(); // вывожу на экран текущее положение Х и О run++; // увеличиваю переменную шага игры на 1 ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается if(cont!=false) ManMade(); // ход делает ИИ, если игра не окончена ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается } } //--------------------------------------------------------------------------- void __fastcall TForm1::Image9Click(TObject *Sender) { // Проверяю пустой ли Image и не закончилась ли игра if((Image9->Picture->Bitmap->Empty != false) & (cont != false)) { Mas[2][2] = 1; // Заполняю массив ShowXO(); // вывожу на экран текущее положение Х и О run++; // увеличиваю переменную шага игры на 1 ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается if(cont!=false) ManMade(); // ход делает ИИ, если игра не окончена ControlMas(); // Проверяю, кто - нибудь выиграл, если да тогда игра останавливается } } void WinX(int L) // Процедура определения, выгрыша, // если L = 1, то я смотрю нынешнее положение Х, и предотвращяю его выигрыш // если L = 0, то процедура выигрывает игру, то есть ИИ побеждает { bool OneTek = false; TekWinO = false; // |_L_|_ _|_*_| // |_ _|_*_|_ _| // ПРОВЕРКА САМОГО ВЕРХНЕГО ЛЕВОЙ ПОЛОЖЕНИЕ СО ВСЕМИ ВОЗМОЖНЫМИ ВАРИАНТАМИ, ТО ЕСТЬ // |_*_|_ _|_*_| if(OneTek==false) // если L = 1 -> я предотвращаю выигрыш Х { // если L = 0 -> то выигрывает ИИ if( ((Mas[0][0] == Mas[0][2]) & (Mas[0][0] == L)) & ((Mas[0][1]!=1) & (Mas[0][1]!=0)) ) {Mas[0][1] = 0; OneTek=true; }; } if(OneTek==false) if( ((Mas[0][0] == Mas[2][2]) & (Mas[0][0] == L)) & ((Mas[1][1]!=1) & (Mas[1][1]!=0)) ) {Mas[1][1] = 0; OneTek=true; }; if(OneTek==false) if( ((Mas[0][0] == Mas[2][0]) & (Mas[0][0] == L)) & ((Mas[1][0]!=1) & (Mas[1][0]!=0)) ) {Mas[1][0] = 0; OneTek=true; }; if(OneTek==false) if( ((Mas[0][0] == Mas[1][1]) & (Mas[0][0] == L)) & ((Mas[2][2]!=1) & (Mas[2][2]!=0)) ) {Mas[2][2] = 0; OneTek=true; }; // ПРОВЕРКА САМОГО ВЕРХНЕГО ПРАВОГО ПОЛОЖЕНИЕ СО ВСЕМИ ВОЗМОЖНЫМИ ВАРИАНТАМИ, ТО ЕСТЬ if(OneTek==false) // if( ((Mas[0][2] == Mas[2][2]) & (Mas[0][2] == L)) & ((Mas[1][2]!=1) & (Mas[1][2]!=0)) ) {Mas[1][2] = 0; OneTek=true; }; // |_ _|_ _|_L_| if(OneTek==false) // |_ _|_*_|_ _| if( ((Mas[0][2] == Mas[2][0]) & (Mas[0][2] == L)) & ((Mas[1][1]!=1) & (Mas[1][1]!=0)) ) // |_*_|_ _|_*_| {Mas[1][1] = 0; OneTek=true; }; if(OneTek==false) if( ((Mas[0][2] == Mas[1][1]) & (Mas[0][2] == L)) & ((Mas[2][0]!=1) & (Mas[2][0]!=0)) ) {Mas[2][0] = 0; OneTek=true; }; // ПРОВЕРКА САМОГО НИЖНЕГО ПРАВОГО ПОЛОЖЕНИЕ СО ВСЕМИ ВОЗМОЖНЫМИ ВАРИАНТАМИ, ТО ЕСТЬ if(OneTek==false) if( ((Mas[2][2] == Mas[1][1]) & (Mas[2][2] == L)) & ((Mas[0][0]!=1) & (Mas[0][0]!=0)) ) // |_ _|_ _|_ _| {Mas[0][0] = 0; OneTek=true; }; // |_ _|_*_|_ _| // |_*_|_ _|_L_| if(OneTek==false) if( ((Mas[2][2] == Mas[2][0]) & (Mas[2][2] == L)) & ((Mas[2][1]!=1) & (Mas[2][1]!=0)) ) {Mas[2][1] = 0; OneTek=true; }; // ПРОВЕРКА САМОГО НИЖНЕГО ЛЕВОГО ПОЛОЖЕНИЕ СО ВСЕМИ ВОЗМОЖНЫМИ ВАРИАНТАМИ, ТО ЕСТЬ if(OneTek==false) // |_ _|_ _|_ _| if( ((Mas[2][0] == Mas[1][1]) & (Mas[2][0] == L)) & ((Mas[0][2]!=1) & (Mas[0][2]!=0)) ) // |_ _|_*_|_ _| {Mas[0][2] = 0; OneTek=true; }; // |_L_|_ _|_ _| TekWinO = OneTek; // TekWinO = true -> значит во время прохождения через функцию WinX(L) были внесени данные в массив, то есть сделан ход кем либо for(int i=0; i<2; i++) { // ПРОВЕРКА ПО ГОРИЗОНТАЛИ if(OneTek==false) { if( (Mas[0][i]==Mas[0][i+1]) & (Mas[0][i] == L) ) // // 1 раз 2 раз { // |_i_|_*_|_ _| |_ _|_i_|_*_| if(i == 0) { if((Mas[0][2]!=1) & (Mas[0][2]!=0)) {Mas[0][2] = 0; TekWinO = true; break;} } // |_ _|_ _|_ _| |_ _|_ _|_ _| else // |_ _|_ _|_ _| |_ _|_ _|_ _| if( (Mas[0][0]!=1) & (Mas[0][0]!=0) ) {Mas[0][0] = 0; TekWinO = true; break;} } } if(OneTek==false) { // 1 раз 2 раз if( (Mas[1][i]==Mas[1][i+1]) & (Mas[1][i] == L) ) // |_ _|_ _|_ _| |_ _|_ _|_ _| { // |_i_|_*_|_ _| |_ _|_i_|_*_| if(i == 0) {if((Mas[1][2]!=1) & (Mas[1][2]!=0)) {Mas[1][2] = 0; TekWinO = true; break;}} // |_ _|_ _|_ _| |_ _|_ _|_ _| else if( (Mas[1][0]!=1) & (Mas[1][0]!=0) ) {Mas[1][0] = 0; TekWinO = true; break;} } } if(OneTek==false) { // 1 раз 2 раз if( (Mas[2][i]==Mas[2][i+1]) & (Mas[2][i] == L) ) // |_ _|_ _|_ _| |_ _|_ _|_ _| { // |_ _|_ _|_ _| |_ _|_ _|_ _| if(i == 0) { if((Mas[2][2]!=1) & (Mas[2][2]!=0)) {Mas[2][2] = 0; TekWinO = true; break;} } // |_i_|_*_|_ _| |_ _|_i_|_*_| else if( (Mas[2][0]!=1) & (Mas[2][0]!=0) ) {Mas[2][0] = 0;TekWinO = true; break;} } } // по вертикали if(OneTek==false) { // 1 раз 2 раз if( (Mas[i][0]==Mas[i+1][0]) & (Mas[i][0] == L) ) // |_i_|_ _|_ _| |_ _|_ _|_ _| { // |_*_|_ _|_ _| |_i_|_ _|_ _| if(i == 0) { if((Mas[2][0]!=1) & (Mas[2][0]!=0)) {Mas[2][0] = 0; TekWinO = true; break;} } // |_ _|_ _|_ _| |_*_|_ _|_ _| else if( (Mas[0][0]!=1) & (Mas[0][0]!=0) ) {Mas[0][0] = 0;TekWinO = true; break;} } } if(OneTek==false) { // 1 раз 2 раз if( (Mas[i][1]==Mas[i+1][1]) & (Mas[i][1] == L) ) // |_ _|_i_|_ _| |_ _|_ _|_ _| { // |_ _|_*_|_ _| |_ _|_i_|_ _| if(i == 0) { if((Mas[2][1]!=1) & (Mas[2][1]!=0)) {Mas[2][1] = 0; TekWinO = true; break;} } // |_ _|_ _|_ _| |_ _|_*_|_ _| else if( (Mas[0][1]!=1) & (Mas[0][1]!=0) ) {Mas[0][1] = 0; TekWinO = true; break;} } } if(OneTek==false) // 1 раз 2 раз { // |_ _|_ _|_i_| |_ _|_ _|_ _| if( (Mas[i][2]==Mas[i+1][2]) & (Mas[i][2] == L) ) // |_ _|_ _|_*_| |_ _|_ _|_i_| { // |_ _|_ _|_ _| |_ _|_ _|_*_| if(i == 0) { if((Mas[2][2]!=1) & (Mas[2][2]!=0)) {Mas[2][2] = 0;TekWinO = true; break;} } else if( (Mas[0][2]!=1) & (Mas[0][2]!=0) ) {Mas[0][2] = 0; TekWinO = true;break;} } } } if(TekWinO!=false) ShowXO(); // если изменения произошли, вывод массива на экран } //-------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------- void ControlMas() // ПРОЦЕДУРА, КОТОРАЯ ОПРЕДЕЛЯЕТ, КТО-НИБУДЬ ВЫИГРАЛ НА ДАННЫЙ МОМЕНТ // ЕСЛИ ДА -> ТОГДА ВЫВОДИТ СООТВЕТСТВУЮЩУЮ СЕРИЮ КАРТИНОК И ЗАВЕРШАЕТ ИГРУ, ТО ЕСТЬ НЕ ДАЕТ ДЕЛАТЬ ХОД { // Обработка первой строки массива (по горизонтали) if((Mas[0][0] == Mas[0][1]) & (Mas[0][0] == Mas[0][2])) if(Mas[0][0]==1) { // Вывод картинок для Х Form1->Image1->Picture->LoadFromFile("Lx.bmp"); Form1->Image2->Picture->LoadFromFile("Lx.bmp"); Form1->Image3->Picture->LoadFromFile("Lx.bmp"); cont = false; Form1->Caption = "!!!You WIN!!!"; } else { // Вывод картинок для О Form1->Image1->Picture->LoadFromFile("Lo.bmp"); Form1->Image2->Picture->LoadFromFile("Lo.bmp"); Form1->Image3->Picture->LoadFromFile("Lo.bmp"); cont = false; Form1->Caption = "!!!You LOSE!!!"; } // обработка второй строки массива (по горизонтали) if((Mas[1][0] == Mas[1][1]) & (Mas[1][0] == Mas[1][2])) if(Mas[1][0]==1) { // Вывод картинок для Х Form1->Image4->Picture->LoadFromFile("Lx.bmp"); Form1->Image5->Picture->LoadFromFile("Lx.bmp"); Form1->Image6->Picture->LoadFromFile("Lx.bmp"); cont = false; Form1->Caption = "!!!You WIN!!!"; } else { // Вывод картинок для О Form1->Image4->Picture->LoadFromFile("Lo.bmp"); Form1->Image5->Picture->LoadFromFile("Lo.bmp"); Form1->Image6->Picture->LoadFromFile("Lo.bmp"); cont = false; Form1->Caption = "!!!You LOSE!!!"; } // Обработка третьей строки массива (по горизонтали) if((Mas[2][0] == Mas[2][1]) & (Mas[2][0] == Mas[2][2])) if(Mas[2][0]==1) { // Вывод картинок для Х Form1->Image7->Picture->LoadFromFile("Lx.bmp"); Form1->Image8->Picture->LoadFromFile("Lx.bmp"); Form1->Image9->Picture->LoadFromFile("Lx.bmp"); cont = false; Form1->Caption = "!!!You WIN!!!"; } else { // Вывод картинок для О Form1->Image7->Picture->LoadFromFile("Lo.bmp"); Form1->Image8->Picture->LoadFromFile("Lo.bmp"); Form1->Image9->Picture->LoadFromFile("Lo.bmp"); cont = false; Form1->Caption = "!!!You LOSE!!!"; } // Обработка первого столбца (по вертикали) if((Mas[0][0] == Mas[1][0]) & (Mas[0][0] == Mas[2][0])) if(Mas[0][0]==1) { // Вывод картинок для Х Form1->Image1->Picture->LoadFromFile("Tx.bmp"); Form1->Image4->Picture->LoadFromFile("Tx.bmp"); Form1->Image7->Picture->LoadFromFile("Tx.bmp"); cont = false; Form1->Caption = "!!!You WIN!!!"; } else { // Вывод картинок для О Form1->Image1->Picture->LoadFromFile("To.bmp"); Form1->Image4->Picture->LoadFromFile("To.bmp"); Form1->Image7->Picture->LoadFromFile("To.bmp"); cont = false; Form1->Caption = "!!!You LOSE!!!"; } // Обработка второго столбца (по вертикали) if((Mas[0][1] == Mas[1][1]) & (Mas[0][1] == Mas[2][1])) if(Mas[0][1]==1) { // Вывод картинок для Х Form1->Image2->Picture->LoadFromFile("Tx.bmp"); Form1->Image5->Picture->LoadFromFile("Tx.bmp"); Form1->Image8->Picture->LoadFromFile("Tx.bmp"); cont = false; Form1->Caption = "!!!You WIN!!!"; } else { // Вывод картинок для О Form1->Image2->Picture->LoadFromFile("To.bmp"); Form1->Image5->Picture->LoadFromFile("To.bmp"); Form1->Image8->Picture->LoadFromFile("To.bmp"); cont = false; Form1->Caption = "!!!You LOSE!!!"; } // Обработка третьего столбца (по вертикали) if((Mas[0][2] == Mas[1][2]) & (Mas[0][2] == Mas[2][2])) if(Mas[0][2]==1) { // Вывод картинок для Х Form1->Image3->Picture->LoadFromFile("Tx.bmp"); Form1->Image6->Picture->LoadFromFile("Tx.bmp"); Form1->Image9->Picture->LoadFromFile("Tx.bmp"); cont = false; Form1->Caption = "!!!You WIN!!!"; } else { // Вывод картинок для О Form1->Image3->Picture->LoadFromFile("To.bmp"); Form1->Image6->Picture->LoadFromFile("To.bmp"); Form1->Image9->Picture->LoadFromFile("To.bmp"); cont = false; Form1->Caption = "!!!You LOSE!!!"; } // Обработка основной диагонали (то есть /) if((Mas[0][2] == Mas[1][1]) & (Mas[0][2] == Mas[2][0])) if(Mas[0][2]==1) { // Вывод картинок для Х Form1->Image3->Picture->LoadFromFile("Dx.bmp"); Form1->Image5->Picture->LoadFromFile("Dx.bmp"); Form1->Image7->Picture->LoadFromFile("Dx.bmp"); cont = false; Form1->Caption = "!!!You WIN!!!"; } else { // Вывод картинок для О Form1->Image3->Picture->LoadFromFile("Do.bmp"); Form1->Image5->Picture->LoadFromFile("Do.bmp"); Form1->Image7->Picture->LoadFromFile("Do.bmp"); cont = false; Form1->Caption = "!!!You LOSE!!!"; } // Обработка побочной диагонали (то есть \) if((Mas[0][0] == Mas[1][1]) & (Mas[0][0] == Mas[2][2])) if(Mas[0][0]==1) { // Вывод картинок для Х Form1->Image1->Picture->LoadFromFile("BDx.bmp"); Form1->Image5->Picture->LoadFromFile("BDx.bmp"); Form1->Image9->Picture->LoadFromFile("BDx.bmp"); cont = false; Form1->Caption = "!!!You WIN!!!"; } else { // Вывод картинок для О Form1->Image1->Picture->LoadFromFile("BDo.bmp"); Form1->Image5->Picture->LoadFromFile("BDo.bmp"); Form1->Image9->Picture->LoadFromFile("BDo.bmp"); cont = false; Form1->Caption = "!!!You LOSE!!!"; } } //--------------------------------------------------------------------------- void ManMade() // ПРОЦЕДУРА, КОТОРАЯ ДЕЛАЕТ ХОДЫ, ТО ЕСТЬ ИИ { switch(run) { case 1: // ХОД №1 if(Mas[1][1] != 1) // если центральная яцейка не занята ставь туда { Mas[1][1] = 0; ShowXO(); } else { // если центральная яцейка занята, тогда рандомно заполняй массив (по краям) randomize(); int f = random(4); switch(f) { case 0: Mas[0][0] = 0; break; case 1: Mas[0][2] = 0; break; case 2: Mas[2][0] = 0; break; case 3: Mas[2][2] = 0; break; } ShowXO(); } break; case 2: // ХОД № 2 WinX(1); // Проверка на то, если ли возможность выгрыша у игрока, если да тогда устранить эту возможность if(TekWinO!=true) // если нет, тогда { WinX(0); // просмотри возможность выиграша для меня(ИИ) если есть => поставить WinO(2); // корректный ход ИИ } break; case 3: // ХОД №3 WinX(0); // просмотриn возможность выиграша для меня(ИИ) если есть -> поставить if(TekWinO!=true) { WinX(1);// Проверка на то, если ли возможность выгрыша у игрока, если да тогда устранить эту возможность if(TekWinO!=true) WinX(0); // просмотри возможность выиграша для меня(ИИ) если есть поставить } // Проверка самого последнего случая, корректный ход if(TekWinO!=true) { if((Mas[0][1] == 80) & (Mas[2][1] == 20)) // |_x_|_ _|_ _| { // |_o_|_o_|_x_| randomize(); // |_x_|_ _|_ _| int r = random(2); // if(r==0) Mas[0][1] = 0; if(r==1) Mas[2][1] = 0; ShowXO(); } if((Mas[1][0] == 60)&(Mas[1][2] == 40)) { // |_ _|_x_|_ _| randomize(); // |_ _|_o_|_ _| int r = random(2); // |_x_|_o_|_x_| if(r==0) Mas[1][0] = 0; if(r==1) Mas[1][2] = 0; ShowXO(); } } break; case 4: //ХОД №4 WinX(0); // просмотри возможность выиграша для меня(ИИ) если есть => поставить if(TekWinO!=true) { WinX(1); // Проверка на то, если ли возможность выгрыша у игрока, если да тогда устранить эту возможность if(TekWinO!=true) { bool bol=true; // Тогда просто пробегаюсь через весь массив, и заполняю первую попавуюся свободную ячейку for(int i=0; i<3; i++) // и выхожу из циклов for(int j=0; j<3; j++) { if(bol!=false) if((Mas[i][j]!=1) & (Mas[i][j] != 0)) { Mas[i][j]=0; ShowXO(); bol = false; break; } } } } break; case 5: // ХОД №5 WinX(1); // Проверка на то, если ли возможность выгрыша у игрока, если да тогда устранить эту возможность if(TekWinO!=true) { for(int i=0; i<3; i++) // Пробегаюсь по всему массиву, и заполняю последнюю незаполненную ячейку for(int j=0; j<3; j++) if((Mas[i][j]!=1) & (Mas[i][j] != 0)) { Mas[i][j]=0; ShowXO(); break; } break; } } } void ShowXO() // ПРОЦЕДУРА ВЫВОДА МАССИВА НА ЭКРАН { // для Х if(Mas[0][0] == 1) Form1->Image1->Picture->LoadFromFile("x.bmp"); if(Mas[0][1] == 1) Form1->Image2->Picture->LoadFromFile("x.bmp"); if(Mas[0][2] == 1) Form1->Image3->Picture->LoadFromFile("x.bmp"); if(Mas[1][0] == 1) Form1->Image4->Picture->LoadFromFile("x.bmp"); if(Mas[1][1] == 1) Form1->Image5->Picture->LoadFromFile("x.bmp"); if(Mas[1][2] == 1) Form1->Image6->Picture->LoadFromFile("x.bmp"); if(Mas[2][0] == 1) Form1->Image7->Picture->LoadFromFile("x.bmp"); if(Mas[2][1] == 1) Form1->Image8->Picture->LoadFromFile("x.bmp"); if(Mas[2][2] == 1) Form1->Image9->Picture->LoadFromFile("x.bmp"); // для О if(Mas[0][0] == 0) Form1->Image1->Picture->LoadFromFile("o.bmp"); if(Mas[0][1] == 0) Form1->Image2->Picture->LoadFromFile("o.bmp"); if(Mas[0][2] == 0) Form1->Image3->Picture->LoadFromFile("o.bmp"); if(Mas[1][0] == 0) Form1->Image4->Picture->LoadFromFile("o.bmp"); if(Mas[1][1] == 0) Form1->Image5->Picture->LoadFromFile("o.bmp"); if(Mas[1][2] == 0) Form1->Image6->Picture->LoadFromFile("o.bmp"); if(Mas[2][0] == 0) Form1->Image7->Picture->LoadFromFile("o.bmp"); if(Mas[2][1] == 0) Form1->Image8->Picture->LoadFromFile("o.bmp"); if(Mas[2][2] == 0) Form1->Image9->Picture->LoadFromFile("o.bmp"); } //---------------------------------------------------------------------------
0
|
|
| 07.10.2010, 09:58 | |
|
Помогаю со студенческими работами здесь
4
Tic-Tac-Toe Tic tac toe, принятие решения MiniMax Tic tac toe 10x10 Tic tac toe, топология сети, метод обучения Крестики-нолики: плохо прорисовываются "нолики" Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|