Программирывание на ЯВУ

Автор работы: Пользователь скрыл имя, 21 Декабря 2011 в 12:10, курсовая работа

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

Для курсовой работы я выбрала игру Pac-Man. Меня заинтересовала история создания этой игры. Pac-Man — культовая компьютерная игра в жанре аркады, впервые вышедшая в 1979 г. в Японии. Игра была разработана в основном работником компании Namco Тору Иватани в течение восемнадцати месяцев. Сначала это творение называлось pakku-man [пакку-ман]., что на расово японском означает «поедать, откусывать, многократно широко раскрывая рот и захлопывая его». Часто упоминается, что идея игры к Иватани пришла, когда он увидел пиццу без одного кусочка пиццы. В интервью 1986 года он отметил, что это было наполовину правдой: Иватани округлил иероглиф кути (яп. рот) как символ поедания и придал ему подобие рта.
Иватани попытался сделать игру интересной для более широких слоёв населения, п

Содержание работы

Основные данные о работе 1
Содержание 2
Основная часть 5
1 Разработка эскизного и технического проектов программы 5
2 Разработка рабочего проекта 6
Заключение 42
Глоссарий 45
Список использованных источников 46
Приложения 47

Содержимое работы - 1 файл

КР, Программирование на ЯВУ.doc

— 543.00 Кб (Скачать файл)
tify">Hit=10;        // Дистанция, при которой считается,  что призрак и игрок столкнулись. 

var

   Fmain: TFmain;

   ImBack,ImMap,Pic:TBitmap;

   Map:array[0..149,0..24] of byte;

   State:TState;

   Player:TPlayer;

   Port:array [0..1] of TPoint;

   Enemy:array [0..6] of TEnemy;

   EnemyStart:Tpoint;

   ShowPanel: TCanvasPanel;

   Level:byte;

   Score:TScore;

   LevelSeed:integer;

   LMSG:Tlabel;

   Bonus:TBonus;

   pl:array [0..7] of TMediaPlayer;

implementation

{$R *.dfm}

//-----------------------------------------------------------------------------------------------------------

constructor TCanvasPanel.Create(AOwner: TComponent);

begin

   inherited Create(AOwner);

   DoubleBuffered:=true;

   Canvas := TControlCanvas.Create;   // Небыло у TPanel канвы, а теперь появилась :)

   TControlCanvas(Canvas).Control := Self;

end;

//-----------------------------------------------------------------------------------------------------------

procedure TCanvasPanel.PaintWindow(DC: HDC);

begin

   Canvas.Lock;

      try

         Canvas.Handle:=DC;

         try

            TControlCanvas(Canvas).UpdateTextFlags;

            Paint;

         finally

            Canvas.Handle:=0;

         end;

      finally

         Canvas.Unlock;

      end;

end;

//-----------------------------------------------------------------------------------------------------------

procedure TFmain.S_Frame1MouseDown(Sender:TObject; Button:TMouseButton; Shift:TShiftState; X,Y:Integer);

begin

ReleaseCapture;

SendMessage(FMain.handle,WM_SYSCOMMAND, SC_Move+2, 0);

end;

//-----------------------------------------------------------------------------------------------------------

procedure TFmain.L_ExitClick(Sender:TObject);

begin

FMain.Close;

end;

//-----------------------------------------------------------------------------------------------------------

procedure TFmain.FormMouseDown(Sender:TObject; Button:TMouseButton; Shift:TShiftState; X,Y:Integer);

begin

ReleaseCapture;

SendMessage(FMain.handle,WM_SYSCOMMAND, SC_Move+2, 0);

end;

//-----------------------------------------------------------------------------------------------------------

procedure TFmain.ImExitClick(Sender:TObject);

begin

FMain.Close;

end;

//-----------------------------------------------------------------------------------------------------------

procedure TFmain.Prepare(level:byte);

var a:byte;

begin

   Bonus.Kind:=0;

   Bonus.Life:=0;

   Player.direction:=dLeft;

   Player.newdir:=dLeft;

   Player.x:=Player.StartPos.x;

   Player.y:=Player.StartPos.y;

   Player.AgeNewDir:=0;

   LLife.Caption:=inttostr(Player.Lives);

   LLevel.Caption:=inttostr(Level+1);

   for a:=0 to level+1 do  // Создание врагов. Количество врагов равно (номер уровеня+1). Нумерация с нуля.

      begin

         Enemy[a].x:=EnemyStart.x*23;

         Enemy[a].y:=EnemyStart.y*23;

         Enemy[a].direction:=dUp;

         Enemy[a].State:=esNormal;

         Enemy[a].ColorIndex:=a;

         Enemy[a].ShyCount:=0;

         Enemy[a].Frame:=random(2); // Чтобы анимация отличалась.

        Enemy[a].ndCount:=9;

         Enemy[a].Delay:=500*a+100; //Задержка для выползания  призраков из загона. Иначе всё  выглядит, как будто они клонируются.

         Enemy[a].Speed:=0;

      end;

   GameTimer.Enabled:=true;

   State:=stGame;

end;

//-----------------------------------------------------------------------------------------------------------

procedure TFmain.NewLevel(level:byte);

var   dx,dy,Template:byte;

      a:Integer;

begin

   a:=0;

   Player.Lives:=Player.Lives+1;

   LevelSeed:=0;

   ImMap.Canvas.FillRect(rect(0,0,575,575));

   for dx:=0 to 24 do

      for dy:=0 to 24 do

         begin

            case map[dy+level*25,dx] and 15 of

               mpNone:        begin ImList.DrawingStyle:=dsNormal;Imlist.Draw(ImMap.Canvas,dx*23,dy*23,30); ImList.DrawingStyle:=dsTransparent; end;

               mpSeed:        begin Imlist.Draw(ImMap.Canvas,dx*23,dy*23,31); inc(Levelseed); end;

               mpBigSeed:     begin Imlist.Draw(ImMap.Canvas,dx*23,dy*23,20); inc(Levelseed); end;

               mpPlayerStart: begin Player.Startpos.x:=dx*23; Player.Startpos.y:=dy*23; end;

               mpPort:        begin Port[a].x:=dx; Port[a].y:=dy; inc(a); end;

               mpEnemyStart:  begin EnemyStart.x:=dx; EnemyStart.y:=dy; end;

               mpGate,mpWall:

                  begin

                     Template:=0;

                     if dy-1 >=0 then if map[dy-1+level*25,dx] and 15 in [mpWall, mpGate] then Template:=Template+1;

                     if dx+1 <=24 then if map[dy+level*25,dx+1] and 15 in [mpWall, mpGate] then Template:=Template+2;

                     if dy+1 <=24 then if map[dy+1+level*25,dx] and 15 in [mpWall, mpGate] then Template:=Template+4;

                     if dx-1 >=0 then if map[dy+level*25,dx-1] and 15 in [mpWall, mpGate] then Template:=Template+8;

                     if map[dy+level*25,dx] and 15=mpWall then

                        Imlist.Draw(ImMap.Canvas,dx*23,dy*23,Template)

                        else

                        ImList.Draw(ImMap.Canvas,dx*23,dy*23,Template+16);

                  end;

            end;

         end;

   Bonus.Time:=random(500)+500;

   Bonus.Kind:=0;

   Bonus.Life:=0;

end;

//-----------------------------------------------------------------------------------------------------------

procedure TFmain.LoadLevels;

var   FD:TFileStream;

begin

   FD:=TFileStream.Create('.\Data\DPacMan.lvl',fmOpenRead); // Грузим уровни из файла

   FD.Read(Map,3750);                                // Старший полубайт содержит напрявления движения глаз призраков после съедения.

   FD.Free;                                          // Младший полубайт содержит информацию  о карте уровня, стены, зёрна  и пр.

   Player.Lives:=1;                                  // Инициализация жизний у игрока

   Score.Seed:=0;

   Score.Tomato:=0;

   Score.Carrot:=0;

   Score.Grape:=0;

   Score.Cherry:=0;

   Score.Ghost:=0;

   Score.Total:=0;

   Updatescore;

   ImStart.Visible:=false;

   ImLeave.Visible:=false;

   LStart.Visible:=false;

   LLEave.Visible:=false;

   Level:=0;

end;

//-----------------------------------------------------------------------------------------------------------

procedure TFmain.FormCreate(Sender: TObject);

var   a,b:byte;

      ImMask:TBitmap;

begin

   Randomize;

   Pic:=TBitmap.Create;

   ImBack:=TBitmap.Create;

   ImMap:=TBitmap.Create;

   ImMask:=TBitmap.Create;

   Pic.LoadFromFile('.\Data\DPacMan.bmp'); // Грузим набор картинок

   ImMap.Width:=23;

   ImMap.Height:=23;

   ImBack.Width:=575;

   ImBack.Height:=575;

   ImMap.Canvas.Brush.Color:=0;

   ImBack.Canvas.Brush.Color:=0;

   // Грузим картинки в imagelist. Дело в том, что прямая загрузка bmp

   // в imagelist через методы FileLoad/ResourceLoad нарушает гамму изображения,

   // (разработчиков убивать надо, за  то, что компоненты по-разному  работают в design и run-time режиме)

   // а загрузка картинки в imagelist в design-time увеличивает размер .exe на 150Кб

   // Можно обойтись вообще без  imagelist и работать через Canvas.CopyRect,

   // но это громоздко и не элегантно.  Получается плохочитаемый код.

   // С imagelist же работать удобно и наглядно, а скорость не страдает.

   for a:=0 to 3 do

      for b:=0 to 15 do

         begin

            ImMap.Canvas.CopyRect(rect(0,0,23,23),Pic.Canvas,rect(b*23,a*23,b*23+23,a*23+23));

            ImMask.Assign(ImMap);

            ImMask.Dormant;

            ImMask.Mask(0);

            ImList.Add(ImMap,ImMask);

         end;

   ImList.DrawingStyle:=dsNormal;

   ImList.GetBitmap(31,ImScoreSeed.Picture.Bitmap);

   ImList.GetBitmap(22,ImScoreTomato.Picture.Bitmap);

   ImList.GetBitmap(23,ImScoreCarrot.Picture.Bitmap);

   ImList.GetBitmap(24,ImScoreGrape.Picture.Bitmap);

   ImList.GetBitmap(25,ImScoreCherry.Picture.Bitmap);

   ImList.GetBitmap(62,ImScoreGhost.Picture.Bitmap);

   ImList.GetBitmap(29,ImExit.Picture.Bitmap);

   ImList.GetBitmap(27,ImStart.Picture.Bitmap);

   ImList.GetBitmap(28,ImLeave.Picture.Bitmap);

   ImList.GetBitmap(38,ImLife.Picture.Bitmap);

   ImList.DrawingStyle:=dsTransparent;

   ImList.Draw(ImScoreGhost.Picture.Bitmap.Canvas,0,0,17);

   ImMap.Width:=575;

   ImMap.Height:=575;

Информация о работе Программирывание на ЯВУ