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


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

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

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

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #120 : 29 Мая 2015, 16:44:59 »
alsoijw, это про дерево ходов.

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

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #121 : 30 Мая 2015, 21:27:34 »
alsoijw,
Код: (cpp) [Выделить]
char map[M][N];
// типо инициализация
const int SeriesNeedLenght = 5; //сколько ноликов/крестиков нужно собрать подряд
int SeriesLenght = 0;
int x=1;
int y=1;
for (x<M; x++)
{
if (SeriesLenght == SeriesNeedLenght) break; // не будем делать безполезную работу

for (y<N; y++)
{
      if (pole[x][y]==pole[x][y-1]) SeriesLenght++;
}

if (SeriesLenght != SeriesNeedLenght)
{
for (x=1; x<M; x++)
      {
if (SeriesLenght == SeriesNeedLenght) break; // не будем делать безполезную работу

for (y=1; y<N; y++)
{
if (pole[x][y]==pole[x][y-N-1]) SeriesLenght++;
}
      }
}
else
{
      if (pole[x][y] == 'O') cout << "O win!";
      else cout << "X win!";
      ExitToMainMenu = true;
}
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: Крестики нолики на с++
« Ответ #122 : 31 Мая 2015, 12:36:39 »
Гриб_под_зонтом, если подряд идут к примеру OX то следует обнулять счётчик. У тебя этого нет.
Код: (vala) [Выделить]
bool win()
{
/*Последний символ. Лучше всего взять пробел*/
char last = ' ';
/*Длина цепочки*/
var length = 0;
for(var y = 0; y < max_y; y++)
{
/*Перебираем строку*/
for(var x = 0; x < max_x; x++)
{
/*Если текущий символ равен предыдущему -
то это может быть продолжение цепочки.
А может это пробелы стоят рядом. Их считать не надо*/
if(mass[x, y] == last && mass[x, y] != ' ')
{
length++;
}
/*Встретилось начало следующей цепочки. Её длина - 1 символ*/
else
{
length = 1;
last = mass[x, y];
}
/*Проверка достаточная ли длина цепочки. Не забываем выйти из функции*/
if(length == 5)
{
return true;
}
}
}
}
чтобы перебирать ещё и по вертикали меняешь эти строкиfor(var y = 0; y < max_y; y++){for(var x = 0; x < max_x; x++)Измени эту часть чтобы он проверял по диагонали.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

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

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #123 : 31 Мая 2015, 13:25:28 »
alsoijw,
Код: (cpp) [Выделить]
char map[M][N];

const int SeriesNeedLenght = 5; //сколько ноликов/крестиков нужно собрать подряд
int SeriesLenght = 0;
int x=1;
int y=1;

for (x<M; x++)
{
        if (SeriesLenght == SeriesNeedLenght) break; // не будем делать безполезную работу
       
        for (y<N; y++)
        {
              if (pole[x][y]==pole[x][y-1]) SeriesLenght++;
              else SeriesLenght = 0;
        }

if (SeriesLenght != SeriesNeedLenght)
{
        for (x=1; x<M; x++)
        {
                if (SeriesLenght == SeriesNeedLenght) break; // не будем делать безполезную работу
       
                for (y=1; y<N; y++)
                {
                        if (pole[x][y]==pole[x][y-N-1]) SeriesLenght++;
                        else SeriesLenght = 0;
                }
        }
}
else if (SeriesLenght != SeriesNeedLenght)
{
        for (x=1; x<M; x++)
        {
                if (SeriesLenght == SeriesNeedLenght) break; // не будем делать безполезную работу
       
                for (y=1; y<N; y++)
                {
                        if (pole[x][y]==pole[x][y-N]) SeriesLenght++;
                        else SeriesLenght = 0;
                }
        }
}
else
{
        if (pole[x][y] == 'O') cout << "O win!";
        else cout << "X win!";
        ExitToMainMenu = true;
}
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: Крестики нолики на с++
« Ответ #124 : 31 Мая 2015, 17:03:49 »
Гриб_под_зонтом, проверять достиг ли счётчик 5 лучше всего после инкремента. Даже пожалуй только после инкремента. А не перед. Где обработка к нескольких пробелов подряд?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

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

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #125 : 31 Мая 2015, 17:31:56 »
alsoijw,
Код: (cpp) [Выделить]
char map[M][N];
 
const int SeriesNeedLenght = 5; //сколько ноликов/крестиков нужно собрать подряд
int SeriesLenght = 0;
int x=1;
int y=1;
 
for (x<M; x++)
{
        if (SeriesLenght == SeriesNeedLenght) break; // не будем делать безполезную работу
       
        for (y<N; y++)
        {
              if (pole[x][y]==pole[x][y-1] && pole[x][y] != ' ') SeriesLenght++;
              else if (SeriesLenght != 5) SeriesLenght = 0;
        }

for (x=1; x<M; x++)
{
if (SeriesLenght == SeriesNeedLenght) break; // не будем делать безполезную работу
       
for (y=1; y<N; y++)
      {
               if (pole[x][y]==pole[x][y-N-1] && pole[x][y] != ' ') SeriesLenght++;
               else if (SeriesLenght != 5) SeriesLenght = 0;
      }
}
for (x=1; x<M; x++)
{
       if (SeriesLenght == SeriesNeedLenght) break; // не будем делать безполезную работу
       
       for (y=1; y<N; y++)
       {
               if (pole[x][y]==pole[x][y-N] && pole[x][y] != ' ') SeriesLenght++;
               else if (SeriesLenght != 5) SeriesLenght = 0;
       }
}
if (SeriesLenght == 5)
{
        if (pole[x][y] == 'O') cout << "O win!";
        else cout << "X win!";
        ExitToMainMenu = true;
}
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: Крестики нолики на с++
« Ответ #126 : 31 Мая 2015, 17:52:43 »
Гриб_под_зонтом, у тебя 3 различных копии одного и тогоже отрывка. Вот что у тебя
Код: (cpp) [Выделить]
for (x=1; x<M; x++)
{
       if (SeriesLenght == SeriesNeedLenght) break; // не будем делать безполезную работу
       
       for (y=1; y<N; y++)
       {
               if (pole[x][y]==pole[x][y-N] && pole[x][y] != ' ') SeriesLenght++;
               else if (SeriesLenght != 5) SeriesLenght = 0;
       }
}
Вот что должно быть
Код: (cpp) [Выделить]
bool win_vertically()
{
       const int SeriesNeedLenght = 5; //сколько ноликов/крестиков нужно собрать подряд
       int SeriesLenght = 0;
       for (int x=1; x<M; x++)
       {
              for (int y=1; y<N; y++)
              {
                      if (pole[x][y]==pole[x][y-1] && pole[x][y] != ' ')
                      {
                             SeriesLenght++;
                             if (SeriesLenght - 1 == SeriesNeedLenght)
                             {
                                    return true;
                             }
                      }
                      else
                      {
                             SeriesLenght = 0;
                      }
              }
       }
}
Обрати внимание где проверка на 5 подряд и где обнуляется счётчик.
Д/З
Приведи код для проверки по диагоналям. Меня интересует только for, тело for не интересует.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

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

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #127 : 31 Мая 2015, 18:33:27 »
alsoijw,
Код: (cpp) [Выделить]
for (int x=1; x<M; x++)
          {
                  for (int y=1; y<N; y+=M+1)
                  {
                           //Тут тело
                  }
          }
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: Крестики нолики на с++
« Ответ #128 : 31 Мая 2015, 18:55:32 »
Твой код проверяет по вертикали. Только вместо
Код: (cpp) [Выделить]
for (int y=1; y<N; y+=M+1)надо
Код: (cpp) [Выделить]
for (int y=1; y<N; y++)Понял почему? Это будет просматривать по только одной диагонали(0,0),(1,1),(2,2) Но есть и другие (0,1),(1,2),(2,3). Как с ними быть? Приведи решение. Что нужно перед этим циклом писать?
Код: (cpp) [Выделить]
for(x = 0, y = 1; x < 5 && y < 5; x++, y++)
{
cout << x << " " << y << "\n";
}
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

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

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #129 : 31 Мая 2015, 21:18:10 »
alsoijw,
x = x1, y=y1, где x1 и y1 принимают значения от 0 до M или N соотвественно
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

 

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