Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Крестики нолики на с++  (Прочитано 12872 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #105 : 27 Февраля 2015, 13:52:27 »
Гриб_под_зонтом, комментарии изобретены. /*Печать последнего символа цепочки*/ В плюсах работать не будет. Именно в этой ветке можно вставить код, который будет прверять кто выиграл.
Цитировать
тогда добавляем ещё один вложеный цикл, который бует отвечать за вторую координату и будем построчно проверять всё поле.
Да, вставляем этот код в цикл и пробегаем всё поле. Каков код проверки по горизонтали, вертикали, диагоналям у тебя получился?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #106 : 25 Мая 2015, 08:25:46 »
Гриб_под_зонтом, продолжение будет?

Пользователь решил продолжить мысль 25 Мая 2015, 08:29:12:
alsoijw,
P. S. (@"$i\n") - что это?
Это так в vala можно выводить значение переменной.
« Последнее редактирование: 25 Мая 2015, 08:29:12 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #107 : 28 Мая 2015, 17:36:23 »
alsoijw,
Да. Из-за учёбы не получалось заходить сюда, но теперь кучу свободного времени
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #108 : 28 Мая 2015, 20:31:40 »
Гриб_под_зонтом, тебе нужно улучшить код проверки совпадений по диагонали, вертикали и горизонтали. Зделаешь - выкладывай.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #109 : 28 Мая 2015, 21:22:30 »
alsoijw,
Ок
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн goditsa8

  • Участник
  • *
  • Сообщений: 231
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #110 : 28 Мая 2015, 21:30:20 »
Гриб_под_зонтом, тоже сейчас лабу делаю Крестики-нолики. Поскорее выкладывайте код, а то могу не успеть -- завалы матана. :)
А у Вас на деревьях алгоритм основан? Лень весь топик читать.

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #111 : 28 Мая 2015, 21:46:43 »
goditsa8,
Крестики я сделал давным - давно, текущая тема - оптимизация. А готовый код в теме где  то лежит

Пользователь решил продолжить мысль 28 Мая 2015, 22:04:10:
goditsa8,
Вот, откопал:
Код: (cpp) [Выделить]
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <fstream>
#include "universal.h"

 int k;
 char f[]="Статистика.txt";
 char a [3] [3] = {{' ',' ',' '},
                   {' ',' ',' '},
                   {' ',' ',' '}};
   
   void print_receipt()
   {
   int receip[3][3] = {{ 1 , 2 , 3 },
                        { 4 , 5 , 6 },
                        { 7 , 8 , 9 }};
   for (int i=0; i<3; i++)
   {
  cout << receip[i][0] << " | " << receip[i][1] << " | " << receip[i][2];
  if (i < 2) cout << endl << "----------";
  cout << endl;
   }
   }
   void print_a()
     {
cout<<"\033[H\033[J \t \tВАС ПРИВЕТСТВУЕТ ИГРА КРЕСТИКИ-НОЛИКИ\t \t"<<endl;
for (int i=0; i<3; i++)
  {
                  cout<<a[i][0]<<" | "<<a[i][1]<<" | "<<a[i][2];
                  if (i<2)  cout<<endl<<"----------";
                  cout<<endl;
              }
              //cout << endl << "Нажмите \"S\" для получения справки.";
     }
   bool who_win(int x, int y)
   {
   ofstream my_statistics(f, ios::app);
   if (a[x][y]=='X'){cout<<"Поздравляю! Ты выиграл!"<<endl;
   my_statistics<<"Выиграл игрок."<<endl; return true;}
   if (a[x][y]=='O'){cout<<"Ты проиграл :("<<endl;
   my_statistics<<"Выиграл Бот."<<endl; return true;}
   return false;
   }
   int comp_a(char pole)
   {
   for (int m=0; m<3; m++)
   {
   if (a[m][0]==pole && a[m][1]==pole && a[m][2]==' '){
                                                       if (m==0) k=3;
                                                       if (m==1) k=6;
                                                       if (m==2) k=9; return 0;}   
   if (a[m][0]==pole && a[m][2]==pole && a[m][1]==' '){
                                                       if (m==0) k=2;
                                                       if (m==1) k=5;
                                                       if (m==2) k=8; return 0;}
   if (a[m][2]==pole && a[m][1]==pole && a[m][0]==' '){
                                                       if (m==0) k=1;
                                                       if (m==1) k=4;
                                                       if (m==2) k=7; return 0;}
   if (a[0][m]==pole && a[1][m]==pole && a[2][m]==' '){
                                                       if (m==0) k=7;
                                                       if (m==1) k=8;
                                                       if (m==2) k=9; return 0;}   
   if (a[0][m]==pole && a[2][m]==pole && a[1][m]==' '){
                                                       if (m==0) k=4;
                                                       if (m==1) k=5;
                                                       if (m==2) k=6; return 0;}
   if (a[2][m]==pole && a[1][m]==pole && a[0][m]==' '){
                                                       if (m==0) k=1;
                                                       if (m==1) k=2;
                                                       if (m==2) k=3; return 0;}
   }
   if (a[0][0]==pole && a[1][1]==pole && a[2][2]==' '){k=9; return 0;}   
   if (a[0][0]==pole && a[2][2]==pole && a[1][1]==' '){k=5; return 0;}
   if (a[2][2]==pole && a[1][1]==pole && a[0][0]==' '){k=1; return 0;}
   if (a[0][2]==pole && a[1][1]==pole && a[2][0]==' '){k=7; return 0;}   
   if (a[0][2]==pole && a[2][0]==pole && a[1][1]==' '){k=5; return 0;}
   if (a[1][1]==pole && a[2][0]==pole && a[0][2]==' '){k=3; return 0;}
   return 0;
   }
   void igrok_1()
   {
  int l, eror;
  F: cout<<endl<<"Твой ход: ";
  do{
  eror = 0;
  l = getch();
  if (l == 'S' || l == 's')
  {
  clear_scr();
  print_receipt();
        l = getch();
        clear_scr();
        print_a(); goto F;
        }
  l = l-48;
  cout<<endl;
  int y = (l-1) - 3*((l-1)/3);
      int x = (l-1)/3;
      if (l>9 || l<1)
        {
              cout << "Ошибка: нет такого поля. Попробуйте ещё раз: ";
              eror = 1;
        }
     else
      {
        if (a[x][y]==' ') a[x][y]='X';
        else
       {
           cout << "Ошибка: поле занято. Поробуйте ещё раз:";
           eror = 1;
        }
       }
      }
      while (eror==1) ;
   }
   void comp()
   { 
   int eror;
  srand(time(0));
  cout<<endl<<"Дай мне подумать.."<<flush;
  time_s(0.5);  
  comp_a('X');
  if (comp_a('X')==0) {goto B;}
  comp_a('O');
  if (comp_a('O')==0) {goto B;} 
  do{
  eror = 0;
  k = rand ()%(9)+1;
  B:
  int y = (k-1) - 3*((k-1)/3);
      int x = (k-1)/3;
      if (k>9 || k<1)
        {
              eror = 1;
        }
     else
      {
        if (a[x][y]==' ') a[x][y]='O';
        else
       {
           eror = 1;
        }
       }
      }
      while (eror==1) ;
   }
   bool win()
   {
   for (int x=0; x<3; x++)
          {
           if (a[x][0]!=' ' && a[x][0]==a[x][1] && a[x][1]==a[x][2])
              {
  if(who_win(x, 0)==true) return true;
  }
           if (a[0][x]!=' ' && a[0][x]==a[1][x] && a[1][x]==a[2][x])
              {
  if(who_win(0, x)==true) return true;
  }
          }
           if (a[0][0]!=' ' && a[0][0]==a[1][1] && a[1][1]==a[2][2])
              {
  if(who_win(0, 0)==true) return true;
  }
           if (a[0][2]!=' ' && a[0][2]==a[1][1] && a[1][1]==a[2][0])
              {
  if(who_win(0, 2)==true) return true;
  }
           return false;
   }
   int main()
     {
nonblock(1);
     ofstream my_statistics(f, ios::app);
print_a();

for (int f=0; f<4; f++)

{
igrok_1();
     clear_scr();
     print_a();
     if (win()==true) return 0;
     comp();
     clear_scr();
     print_a();
     if (win()==true) return 0;
         }
             igrok_1();
     clear_scr();
     print_a();
     if (win()==true) return 0;
         
cout<<"Ничья!"<<endl;
my_statistics<<"Ничья."<<endl;
return 0;
}
« Последнее редактирование: 28 Мая 2015, 22:04:11 от Гриб_под_зонтом »
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #112 : 29 Мая 2015, 07:31:11 »
goditsa8, ты лучше тот код не бери. А то он ужасен.
Гриб_под_зонтом, ну где новый код?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн goditsa8

  • Участник
  • *
  • Сообщений: 231
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #113 : 29 Мая 2015, 12:37:40 »
Эх, у меня условие: алгоритм должен работать на дереве. Ужасен-не-ужасен, все равно не подходит. ))

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #114 : 29 Мая 2015, 13:50:13 »
alsoijw,
Код: (cpp) [Выделить]
char pole[M][N];
int f=5; // Сколько клеток подряд нужно сделать.
//инициализация
void win()
{
for (int x=0; x<M; x++)
{
for (int y=f; y<N; y++)
{
if (pole[x][y]==pole[x][y-1]==pole[x][y-2]==pole[x][y-3]==pole[x][y-4]=='O')
{
cout << "O win"; break;
}
if (pole[x][y]==pole[x][y-1]==pole[x][y-2]==pole[x][y-3]==pole[x][y-4]=='X')
{
cout << "X win"; break;
}
}
}
for (int x=f; x<M; x++)
{
for (int y=f; y<N; y++)
{
if (pole[x][y]==pole[x][y-M-1]==pole[x][y-M-2]==pole[x][y-M-3]==pole[x][y-M-4]=='O')
{
cout << "O win"; break;
}
if (pole[x][y]==pole[x][y-M-1]==pole[x][y-M-2]==pole[x][y-M-3]==pole[x][y-M-4]=='X')
{
cout << "X win"; break;
}
}
}
}
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #115 : 29 Мая 2015, 14:43:54 »
goditsa8, это на каждый вариант отдельную ветвь? Где вы память резиновую берёте?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #116 : 29 Мая 2015, 14:47:31 »
alsoijw, это нормальный код. Для крестиков ноликов 3 на 3 памяти много не надо. Если поле бесконечное и крестики нолики 5 в линию, то просто отсекаем альфа-бета отсечением проигрышные ветви дерева и анализируем игру на n ходов вперёд.

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #117 : 29 Мая 2015, 14:49:26 »
Гриб_под_зонтом, тоже сейчас лабу делаю Крестики-нолики. Поскорее выкладывайте код, а то могу не успеть -- завалы матана. :)
А у Вас на деревьях алгоритм основан? Лень весь топик читать.

Н-да... Похоже, что не успеваешь, goditsa8, ... и идти тебе в Красную Армию вскоре...  :2funny:
 

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #118 : 29 Мая 2015, 15:39:29 »
Гриб_под_зонтом, у тебя сейчас просматривается не всё поле. Я же говорил тебе про алгоритм: просматриваем последовательно клетки(цикл, именно тут определяется по диагонали, горизонтали, вертикали) и если текущая ячейка равна предыдущей, то инкремент счётчика. Не равна - обнуление. Переход на новую последовательность(диагональ, прямую) тоже обнуление. Если счётчик равен 5 - смотрим кто выиграл.

Пользователь решил продолжить мысль 29 Мая 2015, 15:46:58:
alsoijw, это нормальный код.
Это про какой?
« Последнее редактирование: 29 Мая 2015, 15:46:58 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн goditsa8

  • Участник
  • *
  • Сообщений: 231
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #119 : 29 Мая 2015, 16:24:19 »
alsoijw, для крестов 3х3 всего 255168 узлов в дереве получается. https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B5%D1%81%D1%82%D0%B8%D0%BA%D0%B8-%D0%BD%D0%BE%D0%BB%D0%B8%D0%BA%D0%B8

 

Страница сгенерирована за 0.022 секунд. Запросов: 21.