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