Важная информация
Показано с 1 по 8 из 8

Тема: Игра "крестики-нолики" беспроигрышная стратегия

  1. #1 Игра "крестики-нолики" беспроигрышная стратегия 
    Новичок
    Регистрация
    11.04.2014
    Сообщений
    4
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    Доброго времени суток!
    Пишу программу в Pascal "крестики-нолики", осталось 2 пункта, которые никак не додумаю.
    1. Прога стопорит, если в ходе игры пришли к нейтральной ситуации (никто не выигрывает и не проигрывает).
    2. По умолчанию комп ходит первым, а нужен рандом.
    Если сможете помочь - большое человеческое спасибо! и +150000 к карме!)
    Код :
    var
    pole: array [1..3, 1..3] of integer;
    hod, x, y, who: byte;
    endgame, go: boolean;
     
    procedure print (pole: array [1..3,1..3] of integer);
             var
             i,j:byte;
             begin
             for i:=1 to 3 do
                 begin
                 for j:=1 to 3 do
                     begin
                     if pole[i,j]=-1 then write ('0');
                     if pole[i,j]=1 then write ('X');
                     if pole[i,j]=0 then write ('-');
                     end;
                 writeln;
                 end;
             end;
     
    procedure computer (hod: byte; var pole: array [1..3,1..3] of integer);
              var
              i,j,l,r: byte;
              alarm, marker, win: boolean;
              begin
              if hod=1 then pole[2,2]:=1;
              if hod=3 then
                       if pole[1,1]=0 then pole[1,1]:=1
                                      else pole[1,3]:=1;
              if hod>4 then
                       begin
                        l:=0; r:=0;  marker:=true; win:=false;
                        begin
                               for i:=1 to 3 do
                               begin
                               if pole[i,1]+pole[i,2]+pole[i,3]=2 then begin l:=i; win:=true; end;
                               if pole[1,i]+pole[2,i]+pole[3,i]=2 then begin r:=i; win:=true; end;
                               end;
                               if pole[1,1]+pole[2,2]+pole[3,3]=2 then begin l:=4; win:=true; end;
                               if pole[1,3]+pole[2,2]+pole[3,1]=2 then begin l:=5; win:=true; end;
     
                               if win then
                                 if (l>0) and (l<4) then
                                    for i:=1 to 3 do
                                        if (pole[l,i]=0) and marker then begin pole[l,i]:=1; marker:=false; end;
                                 if (r>0) and (r<4) then
                                    for i:=1 to 3 do
                                        if (pole[i,r]=0) and marker then begin pole[i,r]:=1; marker:=false; end;
                                 if l=4 then
                                    for i:=1 to 3 do
                                        if (pole[i,i]=0) and marker then begin pole[i,i]:=1;  marker:=false; end;
                                 if l=5 then
                                    for i:=1 to 3 do
                                        if (pole[i,4-i]=0) and marker then begin pole[i,4-i]:=1; marker:=false; end;
                               end;
     
                         if not win then
                               marker:=true;
                               alarm:=false;
     
                               for i:=1 to 3 do
                            begin
                            if pole[i,1]+pole[i,2]+pole[i,3]=-2 then begin l:=i; alarm:=true; end;
                            if pole[1,i]+pole[2,i]+pole[3,i]=-2 then begin r:=i; alarm:=true; end;
                            end;
                        if pole[1,1]+pole[2,2]+pole[3,3]=-2 then begin l:=4; alarm:=true; end;
                        if pole[1,3]+pole[2,2]+pole[3,1]=-2 then begin l:=5; alarm:=true; end;
     
                        if alarm then
                                 if (l>0) and (l<4) then
                                    for i:=1 to 3 do
                                        if (pole[l,i]=0) and marker then begin pole[l,i]:=1; marker:=false; end;
                                 if (r>0) and (r<4)then
                                    for i:=1 to 3 do
                                        if (pole[i,r]=0) and marker then begin pole[i,r]:=1; marker:=false; end;
                                 if l=4 then
                                    for i:=1 to 3 do
                                        if (pole[i,i]=0) and marker then begin pole[i,i]:=1; marker:=false; end;
                                 if l=5 then
                                    for i:=1 to 3 do
                                        if (pole[i,4-i]=0) and marker then begin pole[i,4-i]:=1; marker:=false; end;
     
                            // ВСТАВИТЬ ВЫБОР ХОДА компьютером если нейтральная ситуация
                       end;
              end;
     
    procedure winner (pole: array [1..3,1..3] of integer; var endgame: boolean; var who: byte);
             var
             i: byte;
             begin
                 for i:=1 to 3 do
                 begin
                 if pole[i,1]+pole[i,2]+pole[i,3]=3 then begin endgame:=true; who:=1; end;
                 if pole[1,i]+pole[2,i]+pole[3,i]=3 then begin endgame:=true; who:=1; end;
                 end;
                 if pole[1,1]+pole[2,2]+pole[3,3]=3 then begin endgame:=true; who:=1; end;
                 if pole[1,3]+pole[2,2]+pole[3,1]=3 then begin endgame:=true; who:=1; end;
     
                 for i:=1 to 3 do
                 begin
                 if pole[i,1]+pole[i,2]+pole[i,3]=-3 then begin endgame:=true; who:=2; end;
                 if pole[1,i]+pole[2,i]+pole[3,i]=-3 then begin endgame:=true; who:=2; end;
                 end;
                 if pole[1,1]+pole[2,2]+pole[3,3]=-3 then begin endgame:=true; who:=2; end;
                 if pole[1,3]+pole[2,2]+pole[3,1]=-3 then begin endgame:=true; who:=2; end;
             end;
     
     
    begin
    hod:=0;
    endgame:=false;
    print (pole);
    writeln;
     
    // ВЫБОР ХОДА КТО ПЕРВЫЙ должен быть ГДЕ-то ЗДЕСЬ
    repeat
          hod:=hod+1;
          writeln (hod);
          computer (hod, pole);
          print (pole);
          winner (pole, endgame, who);
          if not endgame then begin
          hod:=hod+1;
          writeln (hod);
          writeln ('Ваш ход ');
          repeat
                   go:=true;
                   readln (x,y);
                   if pole[x,y]<>0 then begin
                       writeln ('Сюда уже ходить нельзя');
                       go:=false;
                       end;
                   until go;
          pole[x,y]:=-1;
          print (pole);
          winner (pole, endgame, who);
          end;
          if hod=9 then
                   begin
                        endgame:=true;
                        writeln ('Ничья');
                   end;
          until endgame;
    if who=1 then writeln ('Компьютер выиграл');
    if who=2 then writeln ('Вы выиграли');
    end.
     

  2. Пользователь сказал cпасибо:

    ur_naz (26.02.2016)

  3. #2  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,878
    Сказал(а) спасибо
    1,829
    Поблагодарили 957 раз(а) в 816 сообщениях
    Записей в блоге
    1
    Mirtal, Martol, Mortol (прям как ниф-ниф наф-наф и нуф-нуф) подождём ответа товарищей с цайбера и программерсфорума.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
     

  4. #3  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    Цитата Сообщение от Martol Посмотреть сообщение
    2. По умолчанию комп ходит первым, а нужен рандом.
    Ну ежели нужен рандом, то "random" Вам в руки, в чем проблема то?
    Вообще то случайный выбор должен быть только в начале игры, в следующих раундах по умолчанию первым ходит выигравший в предыдущем.
    Кроме всего прочего Вас не смущает, что по теории игр, ходящий первым или выигрывает или сводит игру к ничьей, ходящий вторым при безупречной игре первого может лишь сыграть в ничью. Ходящий вторым может выиграть лишь если первый сделает ошибку.

    Для уравнивания шансов обоих игроков достаточно к доске 3х3 добавить еще одну клетку, с любой стороны в углу (не по середине стороны)
     

  5. #4  
    Новичок
    Регистрация
    11.04.2014
    Сообщений
    4
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    Спасибо, Ваши замечания верны.
    Я и предполагаю сделать случайный выбор только в начале игры, меня не смущает, что по теории игр, ходящий первым или выигрывает или сводит игру к ничьей. Про функцию "random" мне известно, но хотелось бы это дело уточнить, может есть другая альтернатива. В целом программа написана, не хватает только тех двух критериев, которые описаны мной, по этому я собственно и обращаюсь сразу на несколько форумов.
    Если Вы сможете помочь непосредственно блоком, Ваша помощь будет неоценима.)
     

  6. #5  
    Новичок
    Регистрация
    11.04.2014
    Сообщений
    4
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
    Mirtal, Martol, Mortol (прям как ниф-ниф наф-наф и нуф-нуф) подождём ответа товарищей с [Ссылки могут видеть только зарегистрированные пользователи. ] и [Ссылки могут видеть только зарегистрированные пользователи. ].
    некрасиво так поступать с Вашей стороны.
     

  7. #6  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,878
    Сказал(а) спасибо
    1,829
    Поблагодарили 957 раз(а) в 816 сообщениях
    Записей в блоге
    1
    некрасиво так поступать с Вашей стороны.
    Вот оно как... Оказывается интернет этика уже перевернулась с ног на голову. Т.е. напрягать все форумы
    сразу это красиво, а намекнуть человеку на то, что он немного многолик(совсем чуть чуть) и что будем
    соблюдать очерёдность - это уже некрасиво. Ну чтож будем иметь в виду...

    Понимаете в чём суть товарищ Mirtal, Martol или Mortol, вообще не уверен что код писали вы, так как
    человек, который писал этот код ВЛЁГКУЮ сделает эти 2 пункта. Потому что сам, например, сходу не
    соображу как вообще эти крестики нолики написать(хотя и уверен что это несложно). А человек, который
    написал алгоритм, собственно должен знать как поменять инициализацию этого алгоритма.
    Также на это указывает собственно комментарий:
    ВЫБОР ХОДА КТО ПЕРВЫЙ должен быть ГДЕ-то ЗДЕСЬ
    Т.е. человек, который пишет программу подобного плана по идее должен знать ТОЧНО где происходит
    инициализация. Ну и к тому же с юмором писал, без агрессии и помогать естественно не собирался, сразу
    оценив все эти факторы, т.к. глаз уже набит. Поэтому желаю удачи в решении.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
     

  8. #7  
    Новичок
    Регистрация
    11.04.2014
    Сообщений
    4
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    Мне ясно, что помощи ждать от Вас не придется. Не ясно только вот что, что имеется в виду под "все форумы"? мне наверное терпения не хватило бы отправлять сообщения на ВСЕ форумы. Какое это отношение имеет к моей просьбе, разве с моей стороны было совершено преступление какое-то? Какое отношение к моей просьбе имеет какой(ие) у меня ники? Какое отношение к моей просьбе имеет кто написал эту программу? Впрочем, вопросы риторические.
    Если Вы никогда не имели дело с данным алгоритмом я не прошу Вас изобретать велосипед, но возможно есть и такие, кто сможет помочь, тем более, что не много прошу.
    Не растрачивайте свою бесценную энергию на ответ для данного сообщения.
    ...и да...мой комментарий тоже был с юмором! (мол зачем раскрываешь страшную тайну), но да пофиг..
    Последний раз редактировалось Martol; 14.04.2014 в 13:21.
     

  9. #8  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,878
    Сказал(а) спасибо
    1,829
    Поблагодарили 957 раз(а) в 816 сообщениях
    Записей в блоге
    1
    Мне ясно, что помощи ждать от Вас не придется.
    Эта привилегия конкретно вам.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Моя игра "Колонизация Марса"
    от Kakos_nonos в разделе Проекты на Pascal
    Ответов: 12
    Последнее сообщение: 16.11.2017, 19:01
  2. Крестики-нолики
    от Kakos_nonos в разделе Проекты на Степлере
    Ответов: 2
    Последнее сообщение: 20.03.2017, 10:57
  3. Ответов: 4
    Последнее сообщение: 02.12.2011, 16:39
  4. Моя игра "Языки программирования"
    от Kakos_nonos в разделе Проекты на Pascal
    Ответов: 8
    Последнее сообщение: 27.06.2011, 14:12
  5. Ответов: 5
    Последнее сообщение: 24.05.2011, 12:53
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •