Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
18
Добавлен:
01.05.2014
Размер:
60.42 Кб
Скачать

Введение

Змейка - игра известная во всем мире. Управляя змейкой нужно съесть

пищу, в нашем случае это муха, которая появляется в случайном порядке на экране, по мере поедания пищи растет змейка и скорость её движения, а следовательно и сложность игры.

Описание проекта

Проект состоит из 3 модулей:

  1. core.pas : основной модуль игры, содержит основную форму и процедуру;

  2. Snake.pas: центральный связующий модуль;

  3. Help.pas: модуль с окном справки;

Так же в проекте имеется файл ресурсов(snake.res), в нем хранятся битовые образы(bmp), необходимые для анимации.

В игре имеется возможность сохранения/загрузки результата, а также паузы, выхода, и начала игры.

В игре используется аппаратно независимый графический вывод или Windows GDI.

Листинг модуля core.pas:

unit Core;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, ComCtrls, CustomizeDlg, Menus;

type

TForm1 = class(TForm) //объявление всех типов и процедур в программе

Timer1: TTimer;

OpenDialog1: TOpenDialog;

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

N5: TMenuItem;

N6: TMenuItem;

N7: TMenuItem;

N8: TMenuItem;

procedure FormCreate(Sender: TObject);

procedure draw (x,y:integer);

procedure resset;

procedure Timer1Timer(Sender: TObject);

procedure load(Sender: TObject);

procedure save(Sender: TObject);

procedure FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure Newgame(Sender: TObject);

procedure N7Click(Sender: TObject);

procedure N8Click(Sender: TObject);

procedure N5Click(Sender: TObject); private

public

end;

var //Объявление глобальных переменных

Form1: TForm1;

spd,rot,stop,xod:boolean;

key1,bomtime,speed,x,y,maxx,maxy:integer;

s:string;

f:textfile;

massiv:array [0..50,1..2]of integer;

spider_cord,del,bom: array [1..4] of integer;

bodyend,bodyend2,bodyend3,bodyend1,body,head4,head1,head2,head3,spider,head12,head22,head32,head42:tbitmap;

implementation

uses Unit2;

{$R *.dfm}

{$R snakek.res}

procedure TForm1.draw(x, y: integer); // процедура прорисовки анимации

var

i,z,z1,x1,y1,s:integer;

begin

if x=-20 then x:=maxx-20;

if x=maxx then x:=0;

if y=-20 then y:=maxy-60;

if y= maxy-40 then y:=0;

if spider_cord[2]=-20 then

spider_cord[2]:=maxy-60;

if spider_cord[2]=maxx -40 then spider_cord[2]:=0;

if spider_cord[1]=-20 then spider_cord[1]:=maxx-20;

if spider_cord[1]= maxx then spider_cord[1]:=0;

for i:=2 to massiv[0,1]-1 do if (massiv[i,1]=x)and(massiv[i,2]=y) then begin

Timer1.Interval:=10000;

showmessage('Игра закончена вы набрали: '+inttostr(speed)+' очков');

resset;

end;

i:=massiv[0,1];

if spd then begin

canvas.Rectangle(spider_cord[1],spider_cord[2],spider_cord[1]+20,spider_cord[2]+20);

s:=random(maxx-10);

spider_cord[1]:=s-s mod 20;

s:=random(maxy-70);

spider_cord[2]:=s-s mod 20;

spd:=false;

end;

del[1]:=massiv[massiv[0,1]-1,1];

del[2]:=massiv[massiv[0,1]-1,2];

del[3]:=massiv[massiv[0,1],1];

del[4]:=massiv[massiv[0,1],2];

repeat

massiv[i,1]:=massiv[i-1,1];

massiv[i,2]:=massiv[i-1,2];

dec(i);

until i=1;

massiv[1,1]:=x;

massiv[1,2]:=y;

if (x=spider_cord[1])and(spider_cord[2]=y) then begin

spd:=true;

inc(massiv[0,1]);

Timer1.Interval:=Timer1.Interval-2;

inc(speed);

i:=random(maxx-10);

i:=random(maxy-70);

end;

canvas.Draw(spider_cord[1],spider_cord[2],spider);

if massiv[1,1]=massiv[2,1]+20 then z:=1;

if massiv[1,1]=massiv[2,1]-20 then z:=2;

if massiv[1,2]=massiv[2,2]+20 then z:=3;

if massiv[1,2]=massiv[2,2]-20 then z:=4;

if massiv[massiv[0,1],1]=massiv[massiv[0,1]-1,1]+20 then z1:=1;

if massiv[massiv[0,1],1]=massiv[massiv[0,1]-1,1]-20 then z1:=2;

if massiv[massiv[0,1],2]=massiv[massiv[0,1]-1,2]-20 then z1:=3;

if massiv[massiv[0,1],2]=massiv[massiv[0,1]-1,2]+20 then z1:=4;

for i:=1 to massiv[0,1] do begin

if i=1 then begin

case z of

1: if rot then canvas.Draw(massiv[i,1],massiv[i,2],head3) else canvas.Draw(massiv[i,1],massiv[i,2],head32);

2: if rot then canvas.Draw(massiv[i,1],massiv[i,2],head1) else canvas.Draw(massiv[i,1],massiv[i,2],head12);

3: if rot then canvas.Draw(massiv[i,1],massiv[i,2],head4) else canvas.Draw(massiv[i,1],massiv[i,2],head42);

4: if rot then canvas.Draw(massiv[i,1],massiv[i,2],head2) else canvas.Draw(massiv[i,1],massiv[i,2],head22);

end;

end;

if (i<>1)and(i<>massiv[0,1]) then canvas.Draw(massiv[i,1],massiv[i,2],body);

if i=massiv[0,1]then begin

canvas.Rectangle(del[1],del[2],del[1]+20,del[2]+20);

case z1 of

1: canvas.Draw(massiv[i,1],massiv[i,2],bodyend);

2: canvas.Draw(massiv[i,1],massiv[i,2],bodyend2);

3: canvas.Draw(massiv[i,1],massiv[i,2],bodyend3);

4: canvas.Draw(massiv[i,1],massiv[i,2],bodyend1);

end;

end;

end;

if rot then rot:=false else rot:=true;

canvas.Rectangle(del[3],del[4],del[3]+20,del[4]+20);

end;

procedure TForm1.FormCreate(Sender: TObject); //Процедура инициализации ресурсов

var

i:integer;

begin

randomize;

form1.width:=Screen.Width;

form1.Height:=Screen.Height;

spd:=true;

rot:=true;

speed:=0;

fillchar(massiv,sizeof(massiv),-10);

massiv[0,1]:=3;

massiv[1,1]:=200;

massiv[1,2]:=100;

massiv[2,1]:=220;

massiv[2,2]:=100;

massiv[3,1]:=240;

massiv[3,2]:=100;

canvas.Pen.Color:=color;

body:=tbitmap.Create;

body.LoadFromResourceName(hinstance,'body');

body.Transparent:=true;

head1:=tbitmap.Create;

head1.LoadFromResourceName(hinstance,'head1');

head1.Transparent:=true;

head2:=tbitmap.Create;

head2.LoadFromResourceName(hinstance,'head2');

head2.Transparent:=true;

head3:=tbitmap.Create;

head3.LoadFromResourceName(hinstance,'head3');

head3.Transparent:=true;

head4:=tbitmap.Create;

head4.LoadFromResourceName(hinstance,'head4');

head4.Transparent:=true;

bodyend:=tbitmap.Create;

bodyend.LoadFromResourceName(hinstance,'bodyend4');

bodyend.Transparent:=true;

bodyend1:=tbitmap.Create;

bodyend1.LoadFromResourceName(hinstance,'bodyend1');

bodyend1.Transparent:=true;

bodyend2:=tbitmap.Create;

bodyend2.LoadFromResourceName(hinstance,'bodyend2');

bodyend2.Transparent:=true;

bodyend3:=tbitmap.Create;

bodyend3.LoadFromResourceName(hinstance,'bodyend3');

bodyend3.Transparent:=true;

spider:=tbitmap.Create;

spider.LoadFromResourceName(hinstance,'spider');

spider.Transparent:=true;

head12:=tbitmap.Create;

head12.LoadFromResourceName(hinstance,'head12');

head12.Transparent:=true;

head22:=tbitmap.Create;

head22.LoadFromResourceName(hinstance,'head22');

head22.Transparent:=true;

head42:=tbitmap.Create;

head42.LoadFromResourceName(hinstance,'head42');

head42.Transparent:=true;

head32:=tbitmap.Create;

head32.LoadFromResourceName(hinstance,'head32');

head32.Transparent:=true;

n4.Enabled:=false;

n5.Enabled:=false;

maxx:=screen.Width- screen.Width mod 20 ;

maxy:=screen.Height-screen.Height mod 20;

end;

procedure TForm1.resset; //процедура общего сброса

var

i:integer;

begin

timer1.Interval:=100;

key1:=2;

canvas.Rectangle(0,0,screen.Width,screen.Height);

massiv[0,1]:=3;

massiv[1,1]:=200;

massiv[1,2]:=100;

massiv[2,1]:=220;

massiv[2,2]:=100;

massiv[3,1]:=240;

massiv[3,2]:=100;

draw(180,100);

for i:=4 to 50 do begin

massiv[i,1]:=0;

massiv[i,2]:=0;

end;

draw(180,100);

end;

procedure TForm1.Timer1Timer(Sender: TObject); // процедура таймера

begin

case key1 of

1: draw(massiv[1,1],massiv[1,2]-20);

2: draw(massiv[1,1]-20,massiv[1,2]);

3: draw(massiv[1,1],massiv[1,2]+20);

4: draw(massiv[1,1]+20,massiv[1,2]);

end;

end;

procedure TForm1.load(Sender: TObject); //Загрузка

var

log1:string;

i:integer;

begin

for i:=4 to 50 do begin

massiv[i,1]:=0;

massiv[i,2]:=0;

end;

Timer1.Enabled:=false;

openDialog1.Execute;

if openDialog1.FileName<>'' then

begin

assignfile(f,openDialog1.FileName);

reset(f);

readln(f,speed);

readln(f,massiv[0,1]);

for i:=1 to massiv[0,1] do begin

readln(f,massiv[i,1]);

readln(f,massiv[i,2]);

end;

readln(f,key1);

closefile(f);

canvas.Rectangle(0,0,2500,2000);

timer1.Interval:=100-speed*2;

end;

timer1.Enabled:=true;

end;

procedure TForm1.save(Sender: TObject); // Сохранение

var

i,i1: integer;

begin

timer1.Enabled:=false;

OpenDialog1.Execute;

if OpenDialog1.FileName<>'' then

begin

assignfile(f,OpenDialog1.FileName);

rewrite(f);

writeln(f,speed);

writeln(f,massiv[0,1]);

for i:=1 to massiv[0,1] do begin

writeln(f,massiv[i,1]);

writeln(f,massiv[i,2]);

end;

writeln(f,key1);

closefile(f);

end;

timer1.Enabled:=true;

end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; //Реакция на нажатие клавиш

Shift: TShiftState);

begin

case key of

38: if key1<>3 then key1:=1;

37: if key1<>4 then key1:=2;

40: if key1<>1 then key1:=3;

39: if key1<>2 then key1:=4;

32: if stop then begin

timer1.Enabled:=true; stop:=false; end

else begin Timer1.Enabled:=false; stop:=true;

end;

end;

end;

procedure TForm1.Newgame(Sender: TObject); //Новая игра

begin

Timer1.Enabled:=true;

resset;

n4.Enabled:=true;

n5.Enabled:=true;

end;

procedure TForm1.N7Click(Sender: TObject); //справка

begin

form2.Show;

end;

procedure TForm1.N8Click(Sender: TObject); //выход

begin

Application.Terminate;

end;

procedure TForm1.N5Click(Sender: TObject);

begin

if stop then begin

timer1.Enabled:=true;

stop:=false;

N5.Caption:='пауза' end

else begin

Timer1.Enabled:=false;

stop:=true;

n5.Caption:='продолжить’;

end;

end;

end.

В этой программе использовались следующие типы алгоритмических структур:

Ветвление, цикл, выбор.

Также активно используется объектно-ориентированное программирование.

Соседние файлы в папке Игра змейка Delphi