Администраторы группы

  • Аватар

Олимпиада по информатике. Готовимся побеждать!

Открытая группа активность: 1 мес., 4 нед. назад

Группа для тех, кто намеревается побеждать на районных и региональных олимпиадах по информатике.
Здесь можно будет найти олимпиадные задания, задачи повышенной сложности, обсудить оптимальные алгоритмы решений
Памятка для участников олимпиады

Сайт Информатикс – регистрирууемся, решаем, продвигаемся в рейтинге

Крестики и нолики на Pascal (записей: 13)

← Форум группы   Все форумы
  • Аватар LukasTrickster - 4 мес. назад:

    Крестики и нолики игра на двоих человек

    uses crt;
    
    var
        x,y,i,j,k,kol:shortint;
        z:array [-128..128,-128..128] of shortint;
    
    procedure MasZ; //Подпрограмма для заполнения матрицы случайными числами от 0 до 9
    
    var
        i,j:shortint;
    
    begin
    
    randomize;
    
      for i:= 1 to 3 do
        for j:= 1 to 3 do
          begin
            z[i,j]:=0;
          end;
    end;
    
    procedure MasW; //Подпрограмма для заполнения матрицы случайными числами от 0 до 9
    
    var
        i,j:shortint;
    
    begin
    
    randomize;
    
      for i:= 1 to 3 do
        for j:= 1 to 3 do
          begin
          gotoxy(i*3,j*2);
          writeln(z[i,j]);
          end;
    end;
    
    BEGIN
    
    Writeln('Крестики и нолики');
    
    masZ;
    masW;
    
    repeat
      writeln('Ход игрока №1');
      read(y,x);
        repeat
          if (z[y,x]=1) or (z[y,x]=2)
            then
              begin
                clrscr;
                masW;writeln('Ход игрока №1');
                writeln('Ячейка занята попробуйте другую');
                read(y,x);
              end;
        until (z[y,x]=0) or (z[y,x]=0);
        repeat
          if (y<=0) or (x<=0) or (y>=4) or (x>=4)
            then
              begin
                clrscr;
                masW;
                writeln('Ход игрока №1');
                writeln('Координаты неточны введите заново');
                read(y,x);
              end;
        until (y=1) or (y=2) or (y=3);
      z[y,x]:=1;
      clrscr;
      masW;
    
      if
         (z[1,1]=1) and (z[1,2]=1) and (z[1,3]=1)or
         (z[2,1]=1) and (z[2,2]=1) and (z[2,3]=1)or
         (z[3,1]=1) and (z[3,2]=1) and (z[3,3]=1)or
    
         (z[1,1]=1) and (z[2,1]=1) and (z[3,1]=1)or
         (z[1,2]=1) and (z[2,2]=1) and (z[3,2]=1)or
         (z[1,3]=1) and (z[2,3]=1) and (z[3,3]=1)or
    
         (z[1,1]=1) and (z[2,2]=1) and (z[3,3]=1)or
         (z[3,1]=1) and (z[2,2]=1) and (z[1,3]=1)
    
                then
                  begin
                    k:=1;
                    writeln('Игрок №1 победил!!!');
                    break;
                  end;
    
    kol:=0;
    
      for i:=1 to 3 do
        for j:=1 to 3 do
          if z[i,j]<>0 then kol:=kol+1;
            if kol=9 then
              begin
                writeln('Ничья!!!');
                break;
              end;
    
      writeln('Ход игрока №2');
      read(y,x);
        repeat
          if (z[y,x]=1) or (z[y,x]=2)
            then
              begin
                clrscr;
                masW;
                writeln('Ход игрока №2');
                writeln('Ячейка занята попробуйте другую');
                read(y,x);
              end;
        until (z[y,x]=0) or (z[y,x]=0);
        repeat
          if (y<=0) or (x<=0) or (y>=4) or (x>=4)
            then
              begin
                clrscr;
                masW;
                writeln('Ход игрока №2');
                writeln('Координаты неточны введите заново');
                read(y,x);
              end;
          until (y=1) or (y=2) or (y=3);
      z[y,x]:=2;
      clrscr;
      masW;
    
      if (z[1,1]=2) and (z[1,2]=2) and (z[1,3]=2)or
         (z[2,1]=2) and (z[2,2]=2) and (z[2,3]=2)or
         (z[3,1]=2) and (z[3,2]=2) and (z[3,3]=2)or
    
         (z[1,1]=2) and (z[2,1]=2) and (z[3,1]=2)or
         (z[1,2]=2) and (z[2,2]=2) and (z[3,2]=2)or
         (z[1,3]=2) and (z[2,3]=2) and (z[3,3]=2)or
    
         (z[1,1]=2) and (z[2,2]=2) and (z[3,3]=2)or
         (z[3,1]=2) and (z[2,2]=2) and (z[1,3]=2)
    
                then
                  begin
                    writeln('Игрок №2 победил!!!');
                    break;
                  end;
    kol:=0;
    
      for i:=1 to 3 do
        for j:=1 to 3 do
          if z[i,j]<>0 then kol:=kol+1;
            if kol=9 then
              begin
                writeln('Ничья!!!');
                break;
              end;
    
    until k=1;
    
    END.
    
  • Аватар LukasTrickster - 4 мес. назад:

    Крестики и нолики игра против ИИ (ИИ пока все ещё в состоянии проиграть:) );

    uses crt;
    
    var
        x,y,i,j,k,kol:shortint;
        z:array [-128..128,-128..128] of shortint;
    
    procedure MasZ; //Подпрограмма для заполнения матрицы случайными числами от 0 до 9
    
    var
        i,j:shortint;
    
    begin
    
    randomize;
    
      for i:= 1 to 3 do
        for j:= 1 to 3 do
          begin
            z[i,j]:=0;
          end;
    end;
    
    procedure MasW; //Подпрограмма для заполнения матрицы случайными числами от 0 до 9
    
    var
        i,j:shortint;
    
    begin
    
    randomize;
    
      for i:= 1 to 3 do
        for j:= 1 to 3 do
          begin
          gotoxy(i*3,j*2);
          writeln(z[i,j]);
          end;
    end;
    
    BEGIN
    
    randomize;
    
    Writeln('Крестики и нолики');
    
    masZ;
    masW;
    
    repeat
      writeln('Ход игрока');
      read(y,x);
        repeat
          if (z[y,x]=1) or (z[y,x]=2)
            then
              begin
                clrscr;
                masW;
                writeln('Ход игрока');
                writeln('Ячейка занята попробуйте другую');
                read(y,x);
              end;
        until (z[y,x]=0) or (z[y,x]=0);
        repeat
          if (y<=0) or (x<=0) or (y>=4) or (x>=4)
            then
              begin
                clrscr;
                masW;
                writeln('Ход игрока');
                writeln('Координаты неточны введите заново');
                read(y,x);
              end;
        until (y=1) or (y=2) or (y=3);
      z[y,x]:=1;
      clrscr;
      masW;
    
      if
         (z[1,1]=1) and (z[1,2]=1) and (z[1,3]=1)or
         (z[2,1]=1) and (z[2,2]=1) and (z[2,3]=1)or
         (z[3,1]=1) and (z[3,2]=1) and (z[3,3]=1)or
    
         (z[1,1]=1) and (z[2,1]=1) and (z[3,1]=1)or
         (z[1,2]=1) and (z[2,2]=1) and (z[3,2]=1)or
         (z[1,3]=1) and (z[2,3]=1) and (z[3,3]=1)or
    
         (z[1,1]=1) and (z[2,2]=1) and (z[3,3]=1)or
         (z[3,1]=1) and (z[2,2]=1) and (z[1,3]=1)
    
                then
                  begin
                    k:=1;
                    writeln('Машина ништо против мощного мозга ЧЕЛОВЕКААААА!!!');
                    break;
                  end;
    
    kol:=0;
    
      for i:=1 to 3 do
        for j:=1 to 3 do
          if z[i,j]<>0 then kol:=kol+1;
            if kol=9 then
              begin
                writeln('Ничья');
                break;
              end;
    
      y:=random(1,3);
      x:=random(1,3);
        repeat
          if (z[y,x]=1) or (z[y,x]=2)
            then
              begin
                clrscr;
                masW;
                y:=random(1,3);
                x:=random(1,3);
              end;
        until (z[y,x]=0) or (z[y,x]=0);
      z[y,x]:=2;
      clrscr;
      masW;
    
      if (z[1,1]=2) and (z[1,2]=2) and (z[1,3]=2)or
         (z[2,1]=2) and (z[2,2]=2) and (z[2,3]=2)or
         (z[3,1]=2) and (z[3,2]=2) and (z[3,3]=2)or
    
         (z[1,1]=2) and (z[2,1]=2) and (z[3,1]=2)or
         (z[1,2]=2) and (z[2,2]=2) and (z[3,2]=2)or
         (z[1,3]=2) and (z[2,3]=2) and (z[3,3]=2)or
    
         (z[1,1]=2) and (z[2,2]=2) and (z[3,3]=2)or
         (z[3,1]=2) and (z[2,2]=2) and (z[1,3]=2)
    
                then
                  begin
                    writeln('Ии превозмогает!!!');
                    break;
                  end;
    
    kol:=0;
    
      for i:=1 to 3 do
        for j:=1 to 3 do
          if z[i,j]<>0 then kol:=kol+1;
            if kol=9 then
              begin
                writeln('Ничья');
                break;
              end;
    
    until k=1;
    
    END.
    
  • Аватар prepod - 4 мес. назад:

    Немного код почистить от лишнего.
    А так – отлично.

  • Аватар LukasTrickster - 4 мес. назад:

    Код совместил теперь есть выбор с кем играть добавил комментарии и чутка почистил

    uses crt;
    
    var
        x,y,i,j,k,kol,menu:shortint;
        z:array [-128..128,-128..128] of shortint; //Почему именно shortint ? Это одна из частей защиты от дурака
        //(чтобы при вводе отрицательных чисел программа не ныла а отрицательные числа не входят в тип даннных байт дай как я крашнусь)
        //и ещё длина этого типа данных такая же как и у байта (1 байт) жуткая тавтология
        //Да да оптимизируем то что не нужно оптимизировать    
    
    procedure ArrayFilling; //Подпрограмма для заполнения матрицы (игрового поля) нулями (нули это пустые клетки)
    
    var
        i,j:shortint;
    
    begin
    
    randomize;
    
      for i:= 1 to 3 do
        for j:= 1 to 3 do
          z[i,j]:=0;
    
    end;
    
    procedure ArrayWriteln; //Подпрограмма для вывода матрицы (игрового поля)
    
    var
        i,j:shortint;
    
    begin
    
    randomize;
    
      for i:= 1 to 3 do
        for j:= 1 to 3 do
          begin
            gotoxy(i*3,j*2); //Расстояние между строками и столбцами
            writeln(z[i,j]);
          end;
    end;
    
    BEGIN
    
    Writeln('Крестики и нолики');
    
    writeln('Меню');
    writeln('Игра с другом - 1');
    writeln('Игра против ИИ - 2 ');
    writeln('Выход - любое другое число');
    
    read(menu);
    
      if menu = 1  //Игра с человеком
        then
          begin
    
            clrscr; 
    
            ArrayFilling;
            ArrayWriteln;
    
            repeat //Условие цикла невыполнимо выход из цикла осуществляется при помощи оператора break (досрочный выход из цикла)
              writeln('Ход игрока №1');
              read(y,x);
                repeat //Тут цикл с постусловие уже вполне выполним и это кстати и есть та самая защита от дурака (нельзя ставить свою однёрку на чужую двойку ну тут понятно)) )
                  if (z[y,x]=1) or (z[y,x]=2)
                    then
                      begin
                        clrscr; //Обновление матрицы происходит путём очистки экрана и последующим выводом массива
                        ArrayWriteln; //А вот и он кстати
                        writeln('Ход игрока №1');
                        writeln('Ячейка занята попробуйте другую');
                        read(y,x);
                      end;
                until (z[y,x]=0);
                repeat //Ещё один слой защиты от дурака (нужен корректный ввод координат)
                  if (y<=0) or (x<=0) or (y>=4) or (x>=4)
                    then
                      begin
                        clrscr;
                        ArrayWriteln;
                        writeln('Ход игрока №1');
                        writeln('Координаты неточны введите заново');
                        read(y,x);
                      end;
                until (y=1) or (y=2) or (y=3);
              z[y,x]:=1; //Заполнение клетки с указанными координатами
              clrscr;
              ArrayWriteln;;
    
              if //Условие победы да да примитивно как кирпич 
    
                 (z[1,1]=1) and (z[1,2]=1) and (z[1,3]=1)or
                 (z[2,1]=1) and (z[2,2]=1) and (z[2,3]=1)or
                 (z[3,1]=1) and (z[3,2]=1) and (z[3,3]=1)or
    
                 (z[1,1]=1) and (z[2,1]=1) and (z[3,1]=1)or
                 (z[1,2]=1) and (z[2,2]=1) and (z[3,2]=1)or
                 (z[1,3]=1) and (z[2,3]=1) and (z[3,3]=1)or
    
                 (z[1,1]=1) and (z[2,2]=1) and (z[3,3]=1)or
                 (z[3,1]=1) and (z[2,2]=1) and (z[1,3]=1)
    
                        then
                          begin
                            writeln('Игрок №1 победил!!!');
                            break;
                          end;
    
            kol:=0; //Условие ничьи при заполнении всего поля
    
              for i:=1 to 3 do
                for j:=1 to 3 do
                  if z[i,j]<>0 then kol:=kol+1;
                    if kol=9 then
                      begin
                        writeln('Ничья!!!');
                        break;
                      end;
    
              writeln('Ход игрока №2'); // Тут всё тоже самое только для второго игрока
              read(y,x);
                repeat
                  if (z[y,x]=1) or (z[y,x]=2)
                    then
                      begin
                        clrscr;
                        ArrayWriteln;
                        writeln('Ход игрока №2');
                        writeln('Ячейка занята попробуйте другую');
                        read(y,x);
                      end;
                until (z[y,x]=0) or (z[y,x]=0);
                repeat
                  if (y<=0) or (x<=0) or (y>=4) or (x>=4)
                    then
                      begin
                        clrscr;
                        ArrayWriteln;
                        writeln('Ход игрока №2');
                        writeln('Координаты неточны введите заново');
                        read(y,x);
                      end;
                  until (y=1) or (y=2) or (y=3);
              z[y,x]:=2;
              clrscr;
              ArrayWriteln;
    
              if (z[1,1]=2) and (z[1,2]=2) and (z[1,3]=2)or
                 (z[2,1]=2) and (z[2,2]=2) and (z[2,3]=2)or
                 (z[3,1]=2) and (z[3,2]=2) and (z[3,3]=2)or
    
                 (z[1,1]=2) and (z[2,1]=2) and (z[3,1]=2)or
                 (z[1,2]=2) and (z[2,2]=2) and (z[3,2]=2)or
                 (z[1,3]=2) and (z[2,3]=2) and (z[3,3]=2)or
    
                 (z[1,1]=2) and (z[2,2]=2) and (z[3,3]=2)or
                 (z[3,1]=2) and (z[2,2]=2) and (z[1,3]=2)
    
                        then
                          begin
                            writeln('Игрок №2 победил!!!');
                            break;
                          end;
            kol:=0;
    
              for i:=1 to 3 do
                for j:=1 to 3 do
                  if z[i,j]<>0 then kol:=kol+1;
                    if kol=9 then
                      begin
                        writeln('Ничья!!!');
                        break;
                      end;
    
            until k=1; //Тот самый цикл невыполнимый цикл
    
      END;        
    
      if menu = 2 //Игра с ботом
        then
          begin //Тут все такое же как и с человеком только координаты бота генерируются рандомно 
    
            clrscr;
    
            randomize; 
    
            ArrayFilling;
            ArrayWriteln;
    
            repeat
              writeln('Ход человека');
              read(y,x);
                repeat
                  if (z[y,x]=1) or (z[y,x]=2)
                    then
                      begin
                        clrscr;
                        ArrayWriteln;;
                        writeln('Ход человека');
                        writeln('Ячейка занята попробуйте другую');
                        read(y,x);
                      end;
                until (z[y,x]=0) or (z[y,x]=0);
                repeat
                  if (y<=0) or (x<=0) or (y>=4) or (x>=4)
                    then
                      begin
                        clrscr;
                        ArrayWriteln;
                        writeln('Ход человека');
                        writeln('Координаты неточны введите заново');
                        read(y,x);
                      end;
                until (y=1) or (y=2) or (y=3);
              z[y,x]:=1;
              clrscr;
              ArrayWriteln;
    
              if
                 (z[1,1]=1) and (z[1,2]=1) and (z[1,3]=1)or
                 (z[2,1]=1) and (z[2,2]=1) and (z[2,3]=1)or
                 (z[3,1]=1) and (z[3,2]=1) and (z[3,3]=1)or
    
                 (z[1,1]=1) and (z[2,1]=1) and (z[3,1]=1)or
                 (z[1,2]=1) and (z[2,2]=1) and (z[3,2]=1)or
                 (z[1,3]=1) and (z[2,3]=1) and (z[3,3]=1)or
    
                 (z[1,1]=1) and (z[2,2]=1) and (z[3,3]=1)or
                 (z[3,1]=1) and (z[2,2]=1) and (z[1,3]=1)
    
                        then
                          begin
                            writeln('Машина ништо против мощного мозга человека!');
                            break;
                          end;
    
            kol:=0;
    
              for i:=1 to 3 do
                for j:=1 to 3 do
                  if z[i,j]<>0 then kol:=kol+1;
                    if kol=9 then
                      begin
                        writeln('Ничья');
                        break;
                      end;
    
              y:=random(1,3);
              x:=random(1,3);
                repeat
                  if (z[y,x]=1) or (z[y,x]=2)
                    then
                      begin
                        clrscr;
                        ArrayWriteln;
                        y:=random(1,3);
                        x:=random(1,3);
                      end;
                until (z[y,x]=0) or (z[y,x]=0);
              z[y,x]:=2;
              clrscr;
              ArrayWriteln;
    
              if (z[1,1]=2) and (z[1,2]=2) and (z[1,3]=2)or
                 (z[2,1]=2) and (z[2,2]=2) and (z[2,3]=2)or
                 (z[3,1]=2) and (z[3,2]=2) and (z[3,3]=2)or
    
                 (z[1,1]=2) and (z[2,1]=2) and (z[3,1]=2)or
                 (z[1,2]=2) and (z[2,2]=2) and (z[3,2]=2)or
                 (z[1,3]=2) and (z[2,3]=2) and (z[3,3]=2)or
    
                 (z[1,1]=2) and (z[2,2]=2) and (z[3,3]=2)or
                 (z[3,1]=2) and (z[2,2]=2) and (z[1,3]=2)
    
                        then
                          begin
                            writeln('ИИ превозмог!');
                            break;
                          end;
    
            kol:=0;
    
              for i:=1 to 3 do
                for j:=1 to 3 do
                  if z[i,j]<>0 then kol:=kol+1;
                    if kol=9 then
                      begin
                        writeln('Ничья');
                        break;
                      end;
    
            until k=1;
    
      end;      
    
      if menu = 3 //Игра с выходом
        then
          begin
            clrscr;
            Writeln('До встречи');
            exit;
          end;   
    
    END.
    
  • Аватар prepod - 4 мес. назад:
    until (z[y,x]=0) or (z[y,x]=0);
    

    Одно из условий вполне можно убрать)

  • Аватар LukasTrickster - 3 мес., 4 нед. назад:

    Если кто баги какие нашёл то пишите исправлю всё

  • Аватар Gambut - 3 мес., 4 нед. назад:

    У тебя код для PascalABC:

    
     y:=random(1,3);
    

    Для Geany Нужно писать

    
     y:=random(3)+1;
    
  • Аватар LukasTrickster - 3 мес., 4 нед. назад:

    Мы не прогибаемся под убунту )))

  • Аватар root - 3 мес., 4 нед. назад:

    Завязка на проприетарные реализации — практически приговор.
    Хотя dev-util/geany — вообще текстовый редактор (прото-IDE).

  • Аватар prepod - 3 мес., 4 нед. назад:

    Завязка на проприетарные реализации — просто выбор одного из возможных инструментов. Если выбор осознанный и ответственный – то спорить не о чем.
    По мне, так PascalABC.NET – тупиковая ветвь развития. Для использования в целях освоения основ программирования классический Рascal оптимален и добавления лишь усложняют и портят. А приложения на PascalABC.NET делать разработчики таки не будут… Грусть немного… PascalABC в России делался.
    Насчет Geany – народ и так все понял. Не надо путать оболочку и компилятор. За такое – два наряда вне очереди и отрешать 20 задачек на Информатиксе.

  • Аватар root - 3 мес., 4 нед. назад:

    Можно подумать, осознанный и даже отвественный выбор не может быть ошибочным…

    Ну и ещё полезно помнить, что «освоение основ программирования» — не САМОцель.

  • Аватар prepod - 3 мес., 4 нед. назад:

    Освоение основ программирования – одна из полезных задач. Позволяет упорядочить, дисциплинировать и структурировать собственное мышление. Многим этого не хватает.
    А ошибочным может быть любой выбор) И стремление делать свой выбор осмысленным и ответственным – вполне можно сделать самоцелью.

  • Аватар root - 3 мес., 3 нед. назад:

    Есть обоснованное мнение, утверждающее, что для решения задачи «упорядочения, дисциплинирования и структурирования собственного мышления» нужно не «освоение основ программирования», а логика.
    Причём лучше — по гимназическому учебнику.

    ЗЫ: Обычно в дополнение к логике ставят риторику, но мне такой подход видится… мягко говоря небезупречным.