Abaduaber

FlyG

Nov 8th, 2015
495
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 16.83 KB | None | 0 0
  1. Uses 'Graph.SUF'
  2. Define Str1Start='400'
  3. Define PeoR='1000' ;Изображение корабля игрока
  4. Define Sht='1600' ;Мелкий враг
  5. Define Menok='1800' ;средний враг
  6. Define Shot='2200' ;Снаряд
  7. Define Urg='2260' ;Самый жирный враг =).
  8. Define Star='2730'
  9. Define Star2='2830'
  10. Define Filler='3050' ;Черное изображение. Чтобы стирать.
  11.  
  12. ;-----Даем переменным под указанными номерами имена----
  13. Define Regs='500' ;Тут живут регистры
  14. Define Score='5'
  15. Define XP='10' ;Позиция X нашего корабля
  16. Define YP='11' ;Соответственно, Y
  17. Define XDir='12' ;Направление по X нашего корабля
  18. Define CurKey='13' ;скан код текущей нажатой клавиши.
  19. Define EShipC='14' ;Счетчик числа врагов
  20. Define ShotC='15' ;Текущее количество снарядов
  21. Define ShotWait='16' ;Ограничитель стрельбы (чтобы слишком часто не стрелял)
  22. Define EnemyWait='17' ;Ограничитель появления новых врагов.
  23.  
  24. ;Структура EnemyPictures: 0 - адрес переменной с первым изображением врага, 1 - со вторым, 2 - с третьим
  25. Define EnemyPictures='18'
  26. ;Структура StarsPictures: 0 - адрес переменной с первом изображением звезды, 1 - со вторым, и.т.п
  27. Define StarsPictures='21'
  28. Define StarC='30' ;Текущее количество звезд
  29. Define StarWait='31' ;Задержка появления новых звезд
  30. Define StarDrawWait='32' ;Задержка прорисовки звезд
  31.  
  32. ;Структура EShips:
  33.     ;EShips$. 1 - мелкий, 2 - средний, 3 - большой, 0 - нет.
  34.     ;EShips^1+. X координата
  35.     ;Eships^2+. Y координата
  36.     ;Eships^3+. адрес изображения
  37.     ;Eships^4+. - следующий корабль и.т.п.
  38.  
  39. ;Структура Shots:
  40.     ;Shots$. 1 - снаряд есть. 0 - нету
  41.     ;Shots^1+. X координата
  42.     ;Shots^2+. Y координата
  43.     ;Shots^3+ - следующий снаряд и.т.п
  44.  
  45. ;Структура Stars:
  46.     ;Stars$. больше 0 - звезда есть. 0 - нету
  47.     ;Stars$^1+. X координата
  48.     ;Stars$^2+. Y координата
  49.     ;Stars$^3+. Адрес изображения
  50.     ;Start$^4+ - следующая
  51.  
  52. Define EShips='50'
  53. Define Shots='150'
  54. Define Stars='250'
  55.  
  56. ;----Константы-----
  57. Define Scr13='19'
  58. Define TextMode='3'
  59. Define Speed='1' ;Общая скорость. Лучше не трогать, а то коллапсирует ко всем чертям.
  60. Define PSpeed='2' ;Скорость корабля игрока.
  61. Define MaxEShip='10' ;Максимальное количество врагов одновременно
  62. Define MaxShots='15' ;Максмальное количество снарядов одновременно
  63. Define ShotWaitVal='20' ;Ограничитель стрельбы - чем больше число, тем реже разрешается стрелять
  64. Define EnemyWaitVal='40' ;Случайное число - ограничитель появления следующего противника. Чем больше - тем реже.
  65. Define EnemyWaitValInc='40' ;Базовый ограничитель появления следующего противника. Чем больше - тем реже.
  66. Define WinScore='200' ;Количество очков, которое нужно набрать для победы ;)
  67. Define MaxStars='15' ;Максимальное количество звезд
  68. Define StarWaitVal='40'; Время задержки перед появлением новой звезды
  69. Define StarDrawWaitVal='3' ;Скорость звезд
  70.  
  71. ={CreateStar}= ;Создает новую звезду
  72.     ?[3]
  73.     #(StarC$^MaxStars-)<AfterCreateStar>
  74.     $(3)(Stars^4-)
  75.     {CheckNextStar}
  76.         $(3)(3$^4+)
  77.         #(Stars^MaxStars^4*+^3$-)<AfterCreateStar>
  78.         #(3$$|)<CheckNextStar>
  79.         $(3$)(2?^1+)
  80.         $(3$^1+)(310?,1,3$$^StarsPictures+^1-$)
  81.         $(StarC)(StarC$^1+)
  82.         $(StarWait)(StarWaitVal)
  83.     {AfterCreateStar}  
  84. **
  85.  
  86. ={DrawStars}= ;Выводит все звезды
  87.     ?[3]
  88.     $(3)(Stars^4-)
  89.     {CheckDNextStar}
  90.         $(3)(3$^4+)
  91.         #(Stars^MaxStars^4*+^3$-)<AfterDrawStars>
  92.         #(3$$)<CheckDNextStar>
  93.         #(199^3$^2+$^3$^3+$^1+$+- !^1+)<DestroyStar> ;Если залетела за край экрана, то гасим
  94.         *[3$^1+$,3$^2+$,3$^3+$]<Draw> ;Рисуем звезду
  95.         $(3$^2+)(3$^2+$^Speed+) ;звезда летит вниз
  96.         #<CheckDNextStar>
  97.     {DestroyStar}
  98.         $(3$)(0)
  99.         $(StarC)(StarC$^1-)
  100.         $(Filler)(3$^3+$$,3$^3+$^1+$) ;;Меняем параметры филлера
  101.         *[3$^1+$,3$^2+$,Filler]<Draw>
  102.         #<CheckDNextStar>  
  103.     {AfterDrawStars}
  104.     $(StarDrawWait)(StarDrawWaitVal)   
  105. **
  106.  
  107. ={CreateShot}= ;"Выстреливает" новый снаряд
  108.     ?[3]
  109.     #(ShotC$^MaxShots-)<AfterCreateShot> ;Если снарядов слишком много, то не создавать новый
  110.     $(3)(Shots^3-) ;Начнем с пред-первого снаряда
  111.     {CheckNextShot}
  112.         $(3)(3$^3+) ;Перейдем к следующему снаряду
  113.         ;Проверим, не закончился ли наш своеобразный "массив"?
  114.         #(Shots^MaxShots^3*+^3$-)<AfterCreateShot>
  115.         #(3$$|)<CheckNextShot> ;Если снаряд есть, то перейдем к следующему
  116.         ;Если же снаряда тут нет, то можно создать новый.
  117.         ;Снаряд есть, X - по центру нашего корабля, Y - чуть выше нашего корабля
  118.         $(3$)(1,XP$^PeoR$^2/+^Shot$^2/-,YP$^Shot^1+$-)
  119.         $(ShotC)(ShotC$^1+) ;Увеличим счетчик снарядов на 1.
  120.         $(ShotWait)(ShotWaitVal) ;Подождем до следующего выстрела
  121.     {AfterCreateShot}
  122. **
  123.  
  124. ={DrawShots}= ;Рисует все снаряды на экране, перемещает их после вывода. Удаляет залетевшие за край экрана снаряды.
  125.     ?[3]
  126.     $(3)(Shots^3-) ;Начнем с пред-первого снаряда
  127.     {CheckDNextShot}
  128.         $(3)(3$^3+) ;Перейдем к следующему снаряду
  129.         ;Проверим, не закончился ли наш своеобразный "массив"?
  130.         #(Shots^MaxShots^3*+^3$-)<AfterDrawShot>
  131.         #(3$$)<CheckDNextShot> ;Если снаряда нет, то перейдем к следующему.
  132.         ;Иначе делаем проверки
  133.         #(3$^2+$)<DestroyShot> ;Не улетел ли слишком высоко?
  134.         *[3$^1+$,3$^2+$,Shot]<Draw> ;Рисуем снаряд
  135.         $(3$^2+)(3$^2+$^Speed-) ;Снаряд летит вверх
  136.         #<CheckDNextShot>
  137.     {DestroyShot}
  138.         $(3$)(0) ;Удаляем снаряд из массива
  139.         $(ShotC)(ShotC$^1-) ;Уменьшаем счетчик снарядов.
  140.         $(Score)(Score$^1-) ;Теряем очки
  141.         $(Filler)(Shot$^Shot^1+$) ;Меняем параметры филлера
  142.         *[3$^1+$,3$^2+$,Filler]<Draw> ;Стираем старый снаряд
  143.         #<CheckDNextShot>  
  144.     {AfterDrawShot}
  145. **
  146.  
  147. ={CreateEnemy}= ;Создает нового врага со случайными координатами
  148.     ?[3]
  149.     #(EShipC$^MaxEShip-)<AfterCreateEnemy> ;Если врагов слишком много, то не создавать нового
  150.     $(3)(EShips^4-) ;Начнем с пред-первого корабля
  151.     {CheckNextEnemy}
  152.         $(3)(3$^4+) ;перейдем к следующей ячейке.
  153.         ;Проверим, не закончился ли наш своеобразный "массив"?
  154.         #(EShips^MaxEShip^4*+^3$-)<AfterCreateEnemy>
  155.         #(3$$|)<CheckNextEnemy> ;Если корабль тут есть, то перейдем к следующему
  156.     {CreateNewEnemy}
  157.         $(3$)(3?^1+) ;Создаем случайный корабль, и даем ему необходимое изображение
  158.         $(3$^1+)(260?^10+,2,3$$^EnemyPictures+^1-$) ;Случайная координата по X, и 2 по Y, изображение из массива
  159.         $(EShipC)(EShipC$^1+) ;и увеличим счетчик врагов на 1.
  160.         $(EnemyWait)(EnemyWaitVal?^EnemyWaitValInc+) ;Следующий враг появится чуть позже.
  161.     {AfterCreateEnemy}
  162. **
  163.  
  164. ={DrawEnemy}= ;Рисует всех врагов на экране
  165.     ?[3]
  166.     $(3)(EShips^4-) ;Начнем с пред-первого корабля
  167.     {CheckDNextEnemy}
  168.         $(3)(3$^4+) ;Перейдем к следующему кораблю.
  169.         ;Проверим, не закончился ли наш своеобразный "массив"?
  170.         #(EShips^MaxEShip^4*+^3$-)<AfterDrawEnemy>
  171.         #(3$$)<CheckDNextEnemy> ;Если корабль тут отсутствует, то перейдем к следующему
  172.         ;Иначе начинаем проверки
  173.         #(199^PeoR^1+$-^3$^2+$^3$^3+$^1+$+-)<DestroyEnemy> ;Если залетел за край экрана, то вырубаем
  174.         *[3$^1+$,3$^2+$,3$^3+$]<Draw> ;Рисуем корабль
  175.         $(3$^2+)(3$^2+$^Speed+) ;Корабль летит вниз
  176.         #<CheckDNextEnemy> ;Перейдем к следующему кораблю
  177.     {DestroyEnemy}
  178.         $(Score)(Score$^3$$-) ;Теряем очки - за большой корабль больше, за мелкий меньше.
  179.         $(3$)(0) ;Удаляем корабль из массива
  180.         $(EShipC)(EShipC$^1-) ;Уменьшаем счетчик врагов.
  181.         $(Filler)(3$^3+$$,3$^3+$^1+$) ;;Меняем параметры филлера
  182.         *[3$^1+$,3$^2+$,Filler]<Draw> ;Стираем врага
  183.         #<CheckDNextEnemy> ;Перейдем к следующему кораблю.   
  184.     {AfterDrawEnemy}
  185. **
  186.  
  187. ={CheckHits}= ;Проверяет на столкновения между снарядом и кораблем.
  188.     ?[3,4] ;3 - индекс снаряда, 4 - индекс корабля.
  189.     $(3)(Shots^3-) ;Начнем с пред-первого снаряда
  190.     {CheckNextHit}
  191.         $(3)(3$^3+) ;Перейдем к следующему снаряду
  192.         #(Shots^MaxShots^3*+^3$-)<AfterCheckHit> ;Проверим, не кончились ли все снаряды?
  193.         #(3$$|)<CheckNextCollision> ;Если снаряд есть, то переходим к проверке
  194.         #<CheckNextHit> ;Иначе беремся за следующий снаряд
  195.     {CheckNextCollision}
  196.         $(4)(EShips^4-) ;Начнем с пред-первого корабля
  197.         {CheckNextShipCol}
  198.             $(4)(4$^4+) ;Перейдем к следующему кораблю
  199.             ;Проверим, не закончился ли наш своеобразный "массив"?
  200.             #(EShips^MaxEShip^4*+^4$-)<CheckNextHit>
  201.             #(4$$|)<CheckNextShipXY> ;Если на это месте есть корабль, то проверим его координаты
  202.             #<CheckNextShipCol> ;иначе проверим следующий корабль
  203.         {CheckNextShipXY}
  204.             ;Если координата снаряда по Y < чем сумма координаты корабля по Y и его высоты то столкновения нет.
  205.             #(3$^2+$^4$^2+$^4$^3+$^1+$+-!^1+|)<CheckNextShipCol>
  206.             ;Иначе если координата центра снаряда больше, чем координата корабля по X, но меньше, чем
  207.             ;сумма координаты корабля по X и его длины в точках, значит мы попали.
  208.             ;Иначе проверяем следующий корабль.
  209.             #(3$^1+$^Shot$^2/+,4$^1+$-!^1+,3$^1+$^Shot$^2/+^4$^1+$^4$^3+$$+-!^1-.)<CheckNextShipCol>
  210.         {IncScore}
  211.             ;Уничтожаем корабль, стираем снаряд, и начисляем очки ;).
  212.             $(Score)(Score$^4$$^4--)
  213.             $(Filler)(4$^3+$$,4$^3+$^1+$) ;;Меняем параметры филлера
  214.             *[4$^1+$,4$^2+$,Filler]<Draw> ;Стираем врага
  215.             $(Filler)(Shot$^Shot^1+$) ;Меняем параметры филлера
  216.             *[3$^1+$,3$^2+$,Filler]<Draw> ;Стираем старый снаряд
  217.             $(ShotC)(ShotC$^1-) ;Снарядом меньше
  218.             $(EShipC)(EShipC$^1-) ;Врагом тоже ;)
  219.             $(3$)(0) ;Снаряда больше нет
  220.             $(4$)(0) ;Корабля тоже
  221.             #<CheckNextHit> ;И к следующему снаряду - этого больше нет
  222.     {AfterCheckHit}
  223. **
  224.  
  225. Program
  226. *[Regs,Scr13]<Scr> ;Устанавливаем экранный режим 320x200x256
  227. ;Загружаем картинки, каждую в свою область памяти.
  228. $(Str1Start)('sh.bmp',0)
  229. *[Str1Start,PeoR,1]<BMPLoad> ;Палитру устанавливаем только для первой - она общая для всех.
  230. $(Str1Start)('ts.bmp',0)
  231. *[Str1Start,Sht,0]<BMPLoad>
  232. $(Str1Start)('km.bmp',0)
  233. *[Str1Start,Menok,0]<BMPLoad>
  234. $(Str1Start)('r.bmp',0)
  235. *[Str1Start,Shot,0]<BMPLoad>
  236. $(Str1Start)('ku.bmp',0)
  237. *[Str1Start,Urg,0]<BMPLoad>
  238. $(Str1Start)('star.bmp',0)
  239. *[Str1Start,Star,0]<BMPLoad>
  240. $(Str1Start)('star2.bmp',0)
  241. *[Str1Start,Star2,0]<BMPLoad>
  242.  
  243. ;Стартуем в центре экрана, направления пока нет, врагов нет, не стреляли,
  244. ;стрелять можно сразу, задержка перед появлением врага, адреса для изображений
  245. $(XP)(135,198^PeoR^1+$-,0,0,0,0,0,EnemyWaitVal?^EnemyWaitValInc+,Sht,Menok,Urg,Star,Star2)
  246. $(Score)(50) ;Начинаем с 50 очками.
  247. $(StarC)(0,0,3) ;Звезда появится сразу, но пока ни одной нет
  248.  
  249. ;Тут можно без джампа, но !!!
  250.  
  251. {DirDown}
  252. $(XDir)(0) ;Обработчик нажатия клавиши вниз. Останавливаемся.
  253. #<Loop2>
  254. {DirLeft} ;Если влево, то меняем направление на влево
  255. $(XDir)(0^PSpeed-)
  256. #<Loop2>
  257. {DirRight} ;Если вправо, то меняем на право
  258. $(XDir)(PSpeed)
  259. #<Loop2>
  260.  
  261. {ScanLoop} ;Опрос клавиатуры происходит именно тут. Реагируем на стрелки, Ctrl и ESC
  262. ~(8)(~H60,CurKey)
  263. #(CurKey$^80-)<DirDown>
  264. #(CurKey$^75-)<DirLeft>
  265. #(CurKey$^77-)<DirRight>
  266. *(CurKey$^29-^ShotWait$-)<CreateShot> ;Если нажали стрельбу, и можем стрелять, то стреляем
  267. #(CurKey$^1-)<EndPrg>
  268.  
  269. ;Основной цикл - рисуем картинки и следим, чтобы кораблик не убежал за пределы экрана
  270. {Loop2}
  271. $(1)('S')
  272. $(1)('c')
  273. $(1)('o')
  274. $(1)('r')
  275. $(1)('e')
  276. $(1)(':')
  277. $(1)(32, Score$)
  278. *[0,0]<GoToXY>
  279.  
  280. $(StarWait)(StarWait$^StarWait$!-) ;Уменьшаем ожидание следующей звезды, но только если не 0
  281. *(StarWait$)<CreateStar> ;Если пора, то создаем новую звезду.
  282. $(ShotWait)(ShotWait$^ShotWait$!-) ;Уменьшаем ожидание следующего выстрела, но только если оно не ноль
  283. *(EnemyWait$)<CreateEnemy> ;Если пора, то создаем нового врага
  284. $(EnemyWait)(EnemyWait$^1-) ;Уменьшаем ожидание следующей генерации врага
  285.  
  286. *<WaitR> ;Ждем вертикального обратного хода луча.
  287. $(StarDrawWait)(StarDrawWait$^StarDrawWait$!-)
  288. *(StarC$|^StarDrawWait$+)<DrawStars> ;Рисуем звезды, но если только такие есть, и если не истекла задержка.
  289. *(EShipC$|)<DrawEnemy> ;Рисуем врагов, но только если есть кого
  290. *[XP$,YP$,PeoR]<Draw> ;рисуем корабль игрока
  291. *(ShotC$|)<DrawShots> ;Рисуем снаряды, но если они есть.
  292. *(ShotC$|)<CheckHits> ;Проверяем на столкновения снарядов с врагами, но только если снаряды есть.
  293. $(XP)(XP$^XDir$+) ;Перемещаем корабль
  294. #(315^XP$^PeoR$+-!^1+)<StopRight> ;Если близко к правой границе экрана, то остановиться.
  295. #(XP$^7-!^1+)<StopLeft> ;Если к левой, то тоже
  296. #(Score$^WinScore-!^1-)<Win> ;Набрали кучу очков? Победа, дос =)
  297. #(Score$!^1+)<Lose> ;Потеряли все? Увы, увы ;(
  298.  
  299. #<ScanLoop>
  300.  
  301. {StopRight}
  302. $(XDir)(0)
  303. $(XP)(XP$^PSpeed-)
  304. #<ScanLoop>
  305. {StopLeft}
  306. $(XDir)(0)
  307. $(XP)(XP$^PSpeed+)
  308. #<ScanLoop>
  309.  
  310.  
  311.  
  312. {Win}
  313. [You won zxD)))]
  314. [Anyway, all your base are belong to us.]
  315. #<WaitForKey>
  316. {Lose}
  317. [Game over, God bless you]
  318. {WaitForKey}
  319. $(3)(2$)
  320. ;Конец программы, ждем нажатия на любую клавишу, и сбрасываем граф. режим
  321. {EndPrg}
  322. *[Regs,TextMode]<Scr>
  323. {GlobalEnd}
Advertisement
Add Comment
Please, Sign In to add comment