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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

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

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

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

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Крестики нолики на с++
« : 02 Октября 2014, 19:19:54 »
Всем привет :D
Приступил к написанию крестиков ноликов и столкнулся с двумя проблемами: в функциях win_X() и win_O() программа не остонавливаеться, а в функциях igrok_1() и igrok_2() вообще чёт не то твориться. Код вот:
Код: (cpp) [Выделить]
#include <iostream>
using namespace std;

 char a [3] [3] = {{' ',' ',' '},
                   {' ',' ',' '},
                   {' ',' ',' '}};
   
   void print_a()
     {
for (int i=0; i<3; i++)
  {
              cout<<a[i][0]<<" | "<<a[i][1]<<" | "<<a[i][2];
              if (i<2) {cout<<endl<<"----------";}
              cout<<endl;
           }
     }
   void igrok_1()
   {
  int l;
  cout<<"Ход первого игрока: ";
  L:cin>>l;
  cout<<endl;
  if (l==1 && a[0][0]==' ') {a[0][0]='X';}
  if (l==2 && a[0][1]==' ') {a[0][1]='X';}
  if (l==3 && a[0][2]==' ') {a[0][2]='X';}
  if (l==4 && a[1][0]==' ') {a[1][0]='X';}
  if (l==5 && a[1][1]==' ') {a[1][1]='X';}
  if (l==6 && a[1][2]==' ') {a[1][2]='X';}
  if (l==7 && a[2][0]==' ') {a[2][0]='X';}
  if (l==8 && a[2][1]==' ') {a[2][1]='X';}
  if (l==9 && a[2][2]==' ') {a[2][2]='X';}
  if (l==1 && a[0][0]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto L;}
  if (l==2 && a[0][1]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto L;}
  if (l==3 && a[0][2]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto L;}
  if (l==4 && a[1][0]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto L;}
  if (l==5 && a[1][1]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto L;}
  if (l==6 && a[1][2]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto L;}
  if (l==7 && a[2][0]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto L;}
  if (l==8 && a[2][1]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto L;}
  if (l==9 && a[2][2]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto L;}
   }
   void igrok_2()
   {
     int k;
  cout<<"Ход второго игрока: ";
  K:cin>>k;
  cout<<endl;
  if (k==1 && a[0][0]==' ') {a[0][0]='O';}
  if (k==2 && a[0][1]==' ') {a[0][1]='O';}
  if (k==3 && a[0][2]==' ') {a[0][2]='O';}
  if (k==4 && a[1][0]==' ') {a[1][0]='O';}
  if (k==5 && a[1][1]==' ') {a[1][1]='O';}
  if (k==6 && a[1][2]==' ') {a[1][2]='O';}
  if (k==7 && a[2][0]==' ') {a[2][0]='O';}
  if (k==8 && a[2][1]==' ') {a[2][1]='O';}
  if (k==9 && a[2][2]==' ') {a[2][2]='O';}
  if (k==1 && a[0][0]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto K;}
  if (k==2 && a[0][1]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto K;}
  if (k==3 && a[0][2]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto K;}
  if (k==4 && a[1][0]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto K;}
  if (k==5 && a[1][1]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto K;}
  if (k==6 && a[1][2]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto K;}
  if (k==7 && a[2][0]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto K;}
  if (k==8 && a[2][1]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto K;}
  if (k==9 && a[2][2]!=' ') {cout<<"Ошибка: поле занято попробуйте ещё раз: "; goto K;}
   }
   int win_X()
   {
   if (a[0][0]=='X' && a[0][1]=='X' && a[0][2]=='X') {cout<<"Первый игрок выиграл!"<<endl; return 0;}
   if (a[1][0]=='X' && a[1][1]=='X' && a[1][2]=='X') {cout<<"Первый игрок выиграл!"<<endl; return 0;}
   if (a[2][0]=='X' && a[2][1]=='X' && a[2][2]=='X') {cout<<"Первый игрок выиграл!"<<endl; return 0;}
   if (a[0][0]=='X' && a[1][0]=='X' && a[2][0]=='X') {cout<<"Первый игрок выиграл!"<<endl; return 0;}
   if (a[0][1]=='X' && a[1][1]=='X' && a[2][1]=='X') {cout<<"Первый игрок выиграл!"<<endl; return 0;}
   if (a[0][2]=='X' && a[1][2]=='X' && a[2][2]=='X') {cout<<"Первый игрок выиграл!"<<endl; return 0;}
   if (a[0][0]=='X' && a[1][1]=='X' && a[2][2]=='X') {cout<<"Первый игрок выиграл!"<<endl; return 0;}
   if (a[2][0]=='X' && a[1][1]=='X' && a[0][2]=='X') {cout<<"Первый игрок выиграл!"<<endl; return 0;}
   }
   int win_O()
   {
   if (a[0][0]=='O' && a[0][1]=='O' && a[0][2]=='O') {cout<<"Второй игрок выиграл!"<<endl; return 0;}
   if (a[1][0]=='O' && a[1][1]=='O' && a[1][2]=='O') {cout<<"Второй игрок выиграл!"<<endl; return 0;}
   if (a[2][0]=='O' && a[2][1]=='O' && a[2][2]=='O') {cout<<"Второй игрок выиграл!"<<endl; return 0;}
   if (a[0][0]=='O' && a[1][0]=='O' && a[2][0]=='O') {cout<<"Второй игрок выиграл!"<<endl; return 0;}
   if (a[0][1]=='O' && a[1][1]=='O' && a[2][1]=='O') {cout<<"Второй игрок выиграл!"<<endl; return 0;}
   if (a[0][2]=='O' && a[1][2]=='O' && a[2][2]=='O') {cout<<"Второй игрок выиграл!"<<endl; return 0;}
   if (a[0][0]=='O' && a[1][1]=='O' && a[2][2]=='O') {cout<<"Второй игрок выиграл!"<<endl; return 0;}
   if (a[2][0]=='O' && a[1][1]=='O' && a[0][2]=='O') {cout<<"Второй игрок выиграл!"<<endl; return 0;}
   }
   int main()
     {
print_a();
igrok_1();
print_a();
win_X();
igrok_2();
print_a();
win_O();
igrok_1();
print_a();
win_X();
igrok_2();
print_a();
win_O();
igrok_1();
print_a();
win_X();
igrok_2();
print_a();
win_O();
igrok_1();
print_a();
win_X();
igrok_2();
print_a();
win_O();
igrok_1();
print_a();
win_X();
cout<<"Ничья!"<<endl;
return 0;
}
Буду благодарен за помощь!
P.S извиняюсь за goto ничего лучше придумать не смог :-\
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #1 : 02 Октября 2014, 19:28:17 »
ты где так писать научился?
может для начала попробуешь почитать литературу по С например?

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #2 : 02 Октября 2014, 19:43:15 »
Гриб_под_зонтом, про циклы почитай. Всех типов.
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 02 Октября 2014, 19:51:52 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

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

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #3 : 03 Октября 2014, 20:50:56 »
С goto разберусь сам, а что насчёт других ошибок?
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: Крестики нолики на с++
« Ответ #4 : 03 Октября 2014, 20:55:35 »
Гриб_под_зонтом, разберись с goto, а потом поговорим. Кстати как программа должна останавливаться, а?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

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

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #5 : 04 Октября 2014, 13:58:52 »
ладно сдаюсь: пробовал do while но не знаю как сделать "или" в данном цикле
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: Крестики нолики на с++
« Ответ #6 : 04 Октября 2014, 21:01:38 »
Гриб_под_зонтом,
Код: (vala) [Выделить]
for(var x=0; x<3; x++)
{
    for(var y=0; y<3; y++)
    {
        //Перебор значений
    }
}
Не оно?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #7 : 04 Октября 2014, 22:13:11 »
(Нажмите, чтобы показать/скрыть)

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

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #8 : 04 Октября 2014, 23:46:40 »
Гриб_под_зонтом,
Код: (vala) [Выделить]
for(var x=0; x<3; x++)
{
    for(var y=0; y<3; y++)
    {
        //Перебор значений
    }
}
Не оно?
что означает var?
(Нажмите, чтобы показать/скрыть)
Согласен, код не очень красивый, но что поделать: я новичок)
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #9 : 05 Октября 2014, 02:03:26 »
Гриб_под_зонтом, там не var, а int надо писать. А var это в общем случае сокращение от слова variable - переменная.

Lifewalker

  • Гость
Re: Крестики нолики на с++
« Ответ #10 : 05 Октября 2014, 07:58:31 »
Согласен, код не очень красивый, но что поделать: я новичок)
Новичок - это не оправдание, а повод учиться. В далёком 198забытом году мой преподаватель информатики, глядя как я «лабаю прогу» сказала: «сначала программу нужно придумать в голове, затем записать на бумаге, и только после этого подходить к компьютеру». Этот универсальный рецепт нужно использовать всегда и везде.

Оффлайн alsoijw

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

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #12 : 05 Октября 2014, 13:26:26 »
лол, вот в каждом треде свою валу пропихнуть пытается.
ты запутываешь человека больше, неужели сложно вместо var int было написать.

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

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Крестики нолики на с++
« Ответ #13 : 05 Октября 2014, 21:42:19 »
Гриб_под_зонтом,
Код: (vala) [Выделить]
for(var x=0; x<3; x++)
{
    for(var y=0; y<3; y++)
    {
        //Перебор значений
    }
}
Не оно?
Насколько я понимаю нет: на вашем примере мы 3 раза прогоняем перебор вариантов и этим ничего не добиваемся. Возможно я неправильно всё понял,но если так объясните пожалуйста.
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: Крестики нолики на с++
« Ответ #14 : 05 Октября 2014, 22:52:42 »
Гриб_под_зонтом, это всего лишь пример цикла. Для проверки нам нужно просмотреть весь массив на совпадение по вертикали, горизонтали, диагоналям. Например можно так
Код: (vala) [Выделить]
for(var x = 0; x < 3; x++)
{
if(pole[x, 0] != ' ' && pole[x, 0] == pole[x, 1] && pole[x, 1] == pole[x, 2])
{
// Кто то выиграл Кто можно узнать по pole[x, 0]
}
}
Сейчас мы просмотрели по горизонтали. Как сделать для вертикали подумай, выложи сюда код. В чем суть - код должен быть понятным. Твой код может работать в разы быстрее, но будет там 1 ошибка - и ты не поймешь где она, а код работать не будет. Если у нас поле будет 4*4, то нужно будет поправить код так
Код: (vala) [Выделить]
for(var x = 0; x < 4; x++)
{
if(pole[x, 0] != ' ' && pole[x, 0] == pole[x, 1] && pole[x, 1] == pole[x, 2] && pole[x, 2] == pole[x, 3])
{
// Кто то выиграл Кто можно узнать по pole[x, 0]
}
}
Дальше менять - как кому хочется.
.ubuntufan, кроме холивара какой ЯП лучше ты ни на что не способен?

Пользователь решил продолжить мысль 05 Октября 2014, 23:13:14:
Гриб_под_зонтом, задача - массив 25*25 заполнен случайными символами. Создать алгоритм, который скажет - есть ли в массиве строка состоящая только из одного символа. Код выложить.
« Последнее редактирование: 05 Октября 2014, 23:13:14 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

 

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