Крестики-нолики: критика кода - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Жду замечаний, предложений, идей. Кое что уже знаю, но не знаю как изменить.
Исправил обработку основной диагонали

Решение задачи: «Крестики-нолики: критика кода»

textual
Листинг программы
uses GraphABC;
var
  a:array[0..2,0..2] of integer;
  i,j,dy,dx:integer;
  finish:boolean;
  MovA,MovB:integer;
procedure DrawPole;
var
  i,j:integer;
begin
  if not finish then begin
  SetFontSize(30);
  LockDrawing;
  ClearWindow;
  SetPenStyle(psDashDot);
  SetPenWidth(1);
  Rectangle(dx*WindowWidth div 3+5,dy*WindowHeight div 3+5,(dx+1)*WindowWidth div 3-5,(dy+1)*WindowHeight div 3-5);
  SetPenStyle(psSolid);
  SetPenWidth(4);
  for i:=1 to 2 do begin
    line(WindowWidth div 3 *i,10,WindowWidth div 3 *i,WindowHeight-10);
    line(10,i*WindowHeight div 3,WindowWidth-10,i*WindowHeight div 3);
  end;  
  for i:=0 to 2 do 
      for j:=0 to 2 do 
        if a[i,j]<0 then TextOut(40+i*WindowWidth div 3,10+j*WindowHeight div 3,'0') else 
        if a[i,j]>0 then TextOut(40+i*WindowWidth div 3,10+j*WindowHeight div 3,'X');
    UnlockDrawing;
  end;  
end;
function checkend:boolean;
var
  i,j,s1,s2,s3,s4:integer;
begin
  checkend:=true;
  s2:=0;s3:=0;
  for i:=0 to 2 do begin
    s1:=0;s2:=0;
    for j:=0 to 2 do begin 
      s1:=s1+a[i,j];
      s2:=s2+a[j,i];
    end;  
    s3:=s3+a[i,i];
    s4:=s4+a[i,2-i];
    if (abs(s4)=3) or (abs(s1)=3) or (abs(s2)=3) or (abs(s3)=3) then exit;
   end;   
   checkend:=false;
end;   
 
function checkdraw:boolean;
var
  i,j:integer;
begin
  checkdraw:=false;
  for i:=0 to 2 do 
    for j:=0 to 2 do if a[i,j]=0 then exit;
   checkdraw:=true; 
end;
 
procedure Bot;
var
  i,j:integer;
begin
  for i:=0 to 2 do
    for j:=0 to 2 do
      if a[i,j]=0 then begin 
        a[i,j]:=-1;
        if checkend then begin MovA:=i;MovB:=j;exit;end;
        a[i,j]:=0;
      end;
  for i:=0 to 2 do
    for j:=0 to 2 do
      if a[i,j]=0 then begin 
        a[i,j]:=1;
        if checkend then begin MovA:=i;MovB:=j;a[i,j]:=0;exit;end;
        a[i,j]:=0;
      end;
      MovA:=-1;
   for i:=0 to 2 do
     for j:=0 to 2 do
       if a[i,j]=0 then begin MovA:=i;MovB:=j;end;
    if a[1,1]=0 then begin MovA:=1;MovB:=1;end;   
end;     
procedure MakeMove(Player:integer);
var
  n:integer;
begin
  if a[dx,dy]<>0 then exit;
  a[dx,dy]:=Player;
  if checkend then begin DrawPole;TextOut(1,1,'Вы выйграли');finish:=true;end;
  if checkdraw then begin DrawPole;TextOut(1,1,'Ничья');finish:=true;end;
  if not finish then begin
    Bot;
    a[MovA,MovB]:=-1;
    if checkend then begin DrawPole;TextOut(1,1,'Я выйграл');finish:=true;end;
    if checkdraw then begin DrawPole;TextOut(1,1,'Ничья');finish:=true;end;
  end;  
end;
procedure KeyPress(Key:Integer);
begin
  case Key of
    VK_Up:dy:=dy-ord(dy>0);
    VK_Down:dy:=dy+ord(dy<2);
    VK_Left:dx:=dx-ord(dx>0);
    VK_Right:dx:=dx+ord(dx<2);
    VK_Enter:MakeMove(1);
  end;
  DrawPole;
end;  
begin
  OnKeyUp:=KeyPress;
  finish:=false;
  dx:=0;dy:=0;
  Window.SetSize(320,240);
  Window.CenterOnScreen;
  DrawPole;
end.

Объяснение кода листинга программы

  1. Объявлены переменные:
    • a: массив размером [0..2,0..2] для хранения значений игры (20x20 клеточное поле)
    • i, j, dy, dx: целочисленные переменные для хода игрока и определения направления хода компьютера
    • finish: булевая переменная для определения окончания игры
    • MovA, MovB: целочисленные переменные для хранения координат последнего хода компьютера
  2. В функции checkend проверяется, закончилась ли игра. Если сумма элементов в одной из строк, столбцов или диагоналей равна 3, то игра заканчивается.
  3. В функции checkdraw проверяется, заполнены ли все клетки поля. Если найдена пустая клетка, то игра еще не закончилась.
  4. В процедуре Bot компьютер делает ход, ставя крестик или нолик в пустую клетку. Если после хода компьютер обнаруживает ситуацию, когда игра заканчивается, то выводится сообщение об победе и устанавливается флаг finish.
  5. В процедуре MakeMove при нажатии клавиши игрок делает ход, вызывается функция checkend для проверки окончания игры, и если игра закончилась, выводится соответствующее сообщение и устанавливается флаг finish.
  6. В процедуре KeyPress при нажатии клавиш управления изменяются значения dx и dy, и вызывается MakeMove для осуществления хода игрока.
  7. В начале программы устанавливаются размеры окна (320x240), центр окна выравнивается по центру экрана, инициализируются значения dx и dy, и начинается основной цикл игры, в котором происходит проверка нажатия клавиш и вызов функции DrawPole для отрисовки поля и текущего состояния игры.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5