Материалы сайта
Это интересно
Разработка игровой программы
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОСИЙСКОЙ ФЕДЕРАЦИИ Таганрогский государственный радиотехнический университет Кафедра вычислительной техники _____________________________________________________________________ Дистанционное обучение 2000 – 2001 учебный год КУРСОВАЯ РАБОТА по курсу ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ Студента группы ВД – 49 Каретина Флориана Викторовича Задание выполнил ________________ _____________________ подпись студента дата выполнения задания Задание проверил ________________ _____________________ оценка подпись преподавателя _______________________ дата проверки задания Рецензия преподавателя ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ОГЛАВЛЕНИЕ 1. Постановка задачи 3 стр. 2. Входные данные 3 стр. 3. Выходные данные 3 стр. 4. Текст программы 4 стр. 1. Постановка задачи. Необходимо разработать игровую программу «Арканоид». Дощечки для отбивания шарика надо разместить слева и справа. Правая дощечка должна управляться клавишами «A» и «Z» (вверх и вниз соответственно), а правая дощечка должна управляться клавишами «L» и «<» (вверх и вниз соответственно). Так же должен быть предусмотрен режим игры за компьютер (автоматическое отбивание дощечками шарика). По нажатию клавиши «1» - включение/выключение игры за компьютер левой дощечки, по нажатию клавиши «2» - включение/выключение игры за компьютер правой дощечки. Программа должна иметь дружественный интерфейс, работать на компьютере с процессором 486DX-66. 2. Входные данные. 1. Управление дощечками пользователем. 2. Положение дощечек при приближении шарика к краям экрана. 3. Выходные данные. 1. Перемещение дощечки по экрану при нажатии определенных клавиш. 2. Отталкивание/непопадание шарика от дощечки. 3. Выдача очков играющих. 4. Звуковое сопровождение при попадании или непопадании шарика по дощечке, или отскакивания его от стенки. Текст программы program Game_Tenis; uses DOS, Crt2, Graph; var CK, StopRun, Up1, Down1, Up2, Down2, Auto1, Auto2 :Boolean; R1, R2, oR1, oR2, BX, BY, oBX, oBY, Step :Integer; kX, kY, rBX, rBY :Real; MissCount1, MissCount2 :Word; OldInt9: procedure; {___________________________________________________________________________ _} {работа с клавиатурой по превываниям} procedure UserInt9; interrupt; begin case Port[$60] of $81: StopRun:=True; {Esc - выход} $1E: begin CK:=True; Up1:=True; end; {вверх первая дощечка} $9E: begin CK:=True; Up1:=False; end; $2C: begin CK:=True; Down1:=True; end; {вниз первая дощечка} $AC: begin CK:=True; Down1:=False; end; $25: begin CK:=True; Up2:=True; end; {вверх вторая дощечка} $A5: begin CK:=True; Up2:=False; end; $32: begin CK:=True; Down2:=True; end; {вниз вторая дощечка} $B2: begin CK:=True; Down2:=False; end; $02: Auto1:=not Auto1; {включение/выключение авто-режима} {для игрока 1} $03: Auto2:=not Auto2; {включение/выключение авто-режима} {для игрока 2} end; Inline ($E4/$61/$8A/$E0/$0C/$80/ {вставка в машинных кодах} $E6/$61/$86/$E0/$E6/$61/ {для правильной работы} $B0/$20/$E6/$20); {обработчика прерывания} end; {--------------------------------------------------------------------------- -} {процедура установки пользовательского прерывания} procedure SetUserInt; begin GetIntVec($09,@OldInt9); {сохранение старого вектора} SetIntVec($09,Addr(UserInt9)); {установка нового} end; {--------------------------------------------------------------------------- -} {восстановление старого вектора} procedure SetOldInt; begin SetIntVec($09,@OldInt9); end; {--------------------------------------------------------------------------- -} {процедура инициализации графического режима} procedure InitScreen; var GrMode, GrDriver :Integer; GrPath :String; begin GrDriver:=VGA; GrMode:=VGAHi; GrPath:='E:\pl\bp\bgi'; InitGraph(GrDriver, GrMode, GrPath); SetTextStyle(2, 0, 6); end; {--------------------------------------------------------------------------- -} {процедура обновления количества очков игроков} procedure RefrCount; var s1 :String; begin SetFillStyle(1,0); Bar(610, 230, 639, 250); Str(MissCount1, s1); OutTextXY(614,232, s1); Bar(0, 0, 29, 479); Str(MissCount2, s1); OutTextXY(5,232, s1); Bar(0, 230, 29, 250); Str(MissCount2, s1); OutTextXY(4,232, s1); Bar(610, 0, 639, 479); Str(MissCount1, s1); OutTextXY(615,232, s1); end; {--------------------------------------------------------------------------- -} procedure Game; var t1 :Integer; ChC :Boolean; begin {прорисовка игрового поля} SetColor(12); Rectangle(30,0, 609, 479); SetFillStyle(1, 1); Bar(31,1, 608, 478); {первоначальная установка переменых} kX:=0.8; kY:=0.3; Step:=10; rBX:=320; rBY:=240; oBX:=320; oBY:=240; R1:=240; R2:=240; oR1:=240; oR2:=240; repeat {если нажата клавиша вверх и не нажата клавиша вниз} {для игрока 1} if Up1 and not Down1 then begin {перемещение дощечки вверх} R1:=R1-10; if R1<50 then R1:=50; {не пропускать выше положенной} SetColor(1); {координаты} Line(50, oR1-48, 50, oR1+48); SetColor(11); Line(50, R1-48, 50, R1+48); oR1:=R1; end; {если нажата клавиша вниз и не нажата клавиша вверх} {для игрока 1} if Down1 and not Up1 then begin {перемещение дощечки вниз} R1:=R1+10; if R1>430 then R1:=430;{не пропускать ниже положенной} SetColor(1); {координаты} Line(50, oR1-48, 50, oR1+48); SetColor(11); Line(50, R1-48, 50, R1+48); oR1:=R1; end; {если нажата клавиша вверх и не нажата клавиша вниз} {для игрока 2} if Up2 and not Down2 then begin {перемещение дощечки вверх} R2:=R2-10; if R2<50 then R2:=50; {не пропускать выше положенной} SetColor(1); {координаты} Line(590, oR2-48, 590, oR2+48); SetColor(10); Line(590, R2-48, 590, R2+48); oR2:=R2; end; {если нажата клавиша вниз и не нажата клавиша вверх} {для игрока 2} if Down2 and not Up2 then begin {перемещение дощечки вниз} R2:=R2+10; if R2>430 then R2:=430;{не пропускать ниже положенной} SetColor(1); {координаты} Line(590, oR2-48, 590, oR2+48); SetColor(10); Line(590, R2-48, 590, R2+48); oR2:=R2; end; {если включен автоматический режим для игрока 1} if Auto1 then begin {автоматическое перемещение дощечки} R1:=BY; if R1<50 then R1:=50;{не пропускать выше положенной} {координаты} if R1>430 then R1:=430;{не пропускать ниже положенной} {координаты} SetColor(1); Line(50, oR1-48, 50, oR1+48); oR1:=R1; end; SetColor(11); Line(50, R1-48, 50, R1+48); {если включен автоматический режим для игрока 2} if Auto2 then begin {автоматическое перемещение дощечки} R2:=BY; if R2<50 then R2:=50;{не пропускать выше положенной} {координаты} if R2>430 then R2:=430;{не пропускать ниже положенной} {координаты} SetColor(1); Line(590, oR2-48, 590, oR2+48); oR2:=R2; end; {перерисовка полета шарика} SetColor(10); Line(590, R2-48, 590, R2+48); SetColor(12); Rectangle(30,0, 609,479); SetFillStyle(1, 1); SetColor(1); FillEllipse(oBX, oBY, 10, 10); rBX:=rBX+kX*Step; rBY:=rBY+kY*Step; BX:=Round(rBX); BY:=Round(rBY); SetFillStyle(1, 15); SetColor(7); FillEllipse(BX, BY, 10, 10); {если дощечка не попала} if ChC then begin ChC:=False; RefrCount; {обновить очки игроков} end; {столкновение шарика с дощечкой слева} if (BX<60) and (BY>(R1-55)) and (BY<(R1+55)) then begin kX:=-kX; Sound(1000); Delay(10); NoSound; end; {не попадание дощечкой слева} if (BX<40) then begin rBX:=580; rBY:=R2; kX:=Abs(kX); Sound(700); Delay(500); NoSound; Inc(MissCount1); ChC:=True; end; {столкновение шарика с дощечкой справа} if (BX>580) and (BY>(R2-55)) and (BY<(R2+55)) then begin kX:=-kX; Sound(1000); Delay(10); NoSound; end; {не попадание дощечкой справа} if (BX>600) then begin rBX:=60; rBY:=R1; kX:=-Abs(kX); Sound(700); Delay(500); NoSound; Inc(MissCount2); ChC:=True; end; {удар шарика об верхнюю или нижнюю стенку} if (BY<10) or (BY>470) then kY:=-kY; oBX:=BX; oBY:=BY; Delay(10); until StopRun; {выход если нажата клавиша Esc} end; {=========================================================================== =} begin InitScreen; {инициализация графического режима} SetUserInt; {установка пользовательского прерывания} Game; {непосредственно вызов игры} SetOldInt; {восстановления старого вектора прерывания} CloseGraph; {закрытие графического режима} end.