Ой уменя такаяже проблемма, а что делать в моем случае не знаю......... Я по книге, для учебы, переписваю код игры пятнашки и у меня вот что получилось............
Добавлено через 1 минуту и 25 секунд
| Код | unit Un15;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type TForm1 = class(TForm)
//эти процедуры вставляем вручную procedure ShowPole; procedure Mixer; procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm} const H = 4; W = 4; // размер поля - 4х4 CH = 64; CW = 64; // размер клеток - 16х16
var // правильное расположение фишек stp : array[1..H, 1..W] of byte = (( 1, 2, 3, 4), ( 5, 6, 7, 8), ( 9,10,11,12), (13,14,15, 0));
// игровое поле pole: array[1..H, 1..W] of byte;
ex,ey: integer; // координаты пустой клетки
// новая игра procedure NewGame; var i,j: integer; begin // исходное (правильное) положение for i:=0 to H+1 do for j:=0 to W+1 do pole[i,j] := stp[i,j]; Form1.Mixer; // перемешать фишки Form1.ShowPole; // отобразить поле end;
// проверяет, расположены ли // фишки в нужном порядке function Finish: boolean; var row,col: integer; i: integer; begin row :=1; col :=1; Finish := True; // пусть фишки в нужном порядке for i:=1 to 15 do begin if pole[row,col] <> i then begin Finish:= False; break; end; // к следующей клетке if col < 4 then inc(col) else begin col :=1; inc(row); end; end; end;
// "перемещает" фишку в соседнюю пустую клетку, // если она есть, конечно procedure Move(cx,cy: integer); // cx,cy - клетка, в которой игрок сделал щелчок var r: integer; // выбор игрока begin // проверим, возможен ли обмен if not (( abs(cx-ex) = 1) and (cy-ey = 0) or ( abs(cy-ey) = 1) and (cx-ex = 0)) then exit; // Обмен. Переместим фишку из x,y в ex,ey Pole[ey,ex] := Pole[cy,cx]; Pole[cy,cx] := 0; ex:=cx; ey:=cy; // отрисовать поле Form1.ShowPole; if Finish then begin r := MessageDlg('Цель достигнута!'+ #13+ 'Еще раз?',mtInformation,[mbYes,mbNo],0); if r = mrNo then Form1.Close; // завершить работу программы end; //end; end;
// щелчок в клетке procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var cx,cy: integer; // координаты клетки begin // преобразуем координаты мыши в координаты клетки cx := Trunc(X / CW) + 1; cy := Trunc(Y / CH) + 1; Move(cx,cy); end;
// выводит игровое поле procedure TForm1.ShowPole; var i,j: integer; x,y: integer; // x,y - координаты вывода // текста в клетке begin // сетка: вертикальные линии for i:= 1 to W - 1 do begin Canvas.MoveTo(i*CW,0); Canvas.LineTo(i*CW,ClientHeight); end; // сетка: горизонтальные линии for i:= 1 to H - 1 do begin Canvas.MoveTo(0,i*CH); Canvas.LineTo(ClientWidth,i*CH); end;
// содержимое клеток // x,y - координаты вывода текста for i:= 1 to H do begin y:=(i-1)*CH + 15; for j:=1 to W do begin x:= (j-1)*CW + 15; case Pole[i,j] of 0: Canvas.TextOut(x,y,' '); 1..9: Canvas.TextOut(x,y,' '+IntToStr(Pole[i,j])+' '); 10..15: Canvas.TextOut(x,y,IntToStr(Pole[i,j])); end; end; end; end;
// "перемешивает" фишки procedure TForm1.Mixer; var x1,y1: integer; // пустая клетка x2,y2: integer; // эту переместить в пустую d: integer; // направление, относительно пустой i: integer; begin x1:=4; y1:=4; randomize; for i:= 1 to 150 do begin repeat x2:=x1; y2:=y1; d:=random(4)+1; case d of 1: dec(x2); 2: inc(x2); 3: dec(y2); 4: inc(y2); end;
until (x2>=1) and (x2<=4) and (y2>=1) and (y2<=4); // здесь определили фишку, которую // надо переместить в пустую клетку Pole[y1,x1] := Pole[y2,x2]; Pole[y2,x2] := 0; x1:=x2; y1:=y2; end; // запомним координаты пустой клетки ex:= x1; ey:= y1; end;
// обработка события OnCreate procedure TForm1.FormCreate(Sender: TObject); begin ClientWidth := CW * W; ClientHeight := CH * H; Canvas.Font.Name := 'Times New Roman'; Canvas.Font.Size := 22; NewGame; end;
// обработка события OnPaint procedure TForm1.FormPaint(Sender: TObject); begin Form1.ShowPole; end;
end.
|
Добавлено через 4 минуты и 9 секунд В итоге при запуске выскакивает ошибка
Project game15.exe raised exception class EAccessViolation with message ‘Access violation at address 00420c78 in module ‘game15.exe’. Read of address 2BC845E5’. |