Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Uses 'Graph.SUF'
- Define Str1Start='400'
- Define PeoR='1000' ;Изображение корабля игрока
- Define Sht='1600' ;Мелкий враг
- Define Menok='1800' ;средний враг
- Define Shot='2200' ;Снаряд
- Define Urg='2260' ;Самый жирный враг =).
- Define Star='2730'
- Define Star2='2830'
- Define Filler='3050' ;Черное изображение. Чтобы стирать.
- ;-----Даем переменным под указанными номерами имена----
- Define Regs='500' ;Тут живут регистры
- Define Score='5'
- Define XP='10' ;Позиция X нашего корабля
- Define YP='11' ;Соответственно, Y
- Define XDir='12' ;Направление по X нашего корабля
- Define CurKey='13' ;скан код текущей нажатой клавиши.
- Define EShipC='14' ;Счетчик числа врагов
- Define ShotC='15' ;Текущее количество снарядов
- Define ShotWait='16' ;Ограничитель стрельбы (чтобы слишком часто не стрелял)
- Define EnemyWait='17' ;Ограничитель появления новых врагов.
- ;Структура EnemyPictures: 0 - адрес переменной с первым изображением врага, 1 - со вторым, 2 - с третьим
- Define EnemyPictures='18'
- ;Структура StarsPictures: 0 - адрес переменной с первом изображением звезды, 1 - со вторым, и.т.п
- Define StarsPictures='21'
- Define StarC='30' ;Текущее количество звезд
- Define StarWait='31' ;Задержка появления новых звезд
- Define StarDrawWait='32' ;Задержка прорисовки звезд
- ;Структура EShips:
- ;EShips$. 1 - мелкий, 2 - средний, 3 - большой, 0 - нет.
- ;EShips^1+. X координата
- ;Eships^2+. Y координата
- ;Eships^3+. адрес изображения
- ;Eships^4+. - следующий корабль и.т.п.
- ;Структура Shots:
- ;Shots$. 1 - снаряд есть. 0 - нету
- ;Shots^1+. X координата
- ;Shots^2+. Y координата
- ;Shots^3+ - следующий снаряд и.т.п
- ;Структура Stars:
- ;Stars$. больше 0 - звезда есть. 0 - нету
- ;Stars$^1+. X координата
- ;Stars$^2+. Y координата
- ;Stars$^3+. Адрес изображения
- ;Start$^4+ - следующая
- Define EShips='50'
- Define Shots='150'
- Define Stars='250'
- ;----Константы-----
- Define Scr13='19'
- Define TextMode='3'
- Define Speed='1' ;Общая скорость. Лучше не трогать, а то коллапсирует ко всем чертям.
- Define PSpeed='2' ;Скорость корабля игрока.
- Define MaxEShip='10' ;Максимальное количество врагов одновременно
- Define MaxShots='15' ;Максмальное количество снарядов одновременно
- Define ShotWaitVal='20' ;Ограничитель стрельбы - чем больше число, тем реже разрешается стрелять
- Define EnemyWaitVal='40' ;Случайное число - ограничитель появления следующего противника. Чем больше - тем реже.
- Define EnemyWaitValInc='40' ;Базовый ограничитель появления следующего противника. Чем больше - тем реже.
- Define WinScore='200' ;Количество очков, которое нужно набрать для победы ;)
- Define MaxStars='15' ;Максимальное количество звезд
- Define StarWaitVal='40'; Время задержки перед появлением новой звезды
- Define StarDrawWaitVal='3' ;Скорость звезд
- ={CreateStar}= ;Создает новую звезду
- ?[3]
- #(StarC$^MaxStars-)<AfterCreateStar>
- $(3)(Stars^4-)
- {CheckNextStar}
- $(3)(3$^4+)
- #(Stars^MaxStars^4*+^3$-)<AfterCreateStar>
- #(3$$|)<CheckNextStar>
- $(3$)(2?^1+)
- $(3$^1+)(310?,1,3$$^StarsPictures+^1-$)
- $(StarC)(StarC$^1+)
- $(StarWait)(StarWaitVal)
- {AfterCreateStar}
- **
- ={DrawStars}= ;Выводит все звезды
- ?[3]
- $(3)(Stars^4-)
- {CheckDNextStar}
- $(3)(3$^4+)
- #(Stars^MaxStars^4*+^3$-)<AfterDrawStars>
- #(3$$)<CheckDNextStar>
- #(199^3$^2+$^3$^3+$^1+$+- !^1+)<DestroyStar> ;Если залетела за край экрана, то гасим
- *[3$^1+$,3$^2+$,3$^3+$]<Draw> ;Рисуем звезду
- $(3$^2+)(3$^2+$^Speed+) ;звезда летит вниз
- #<CheckDNextStar>
- {DestroyStar}
- $(3$)(0)
- $(StarC)(StarC$^1-)
- $(Filler)(3$^3+$$,3$^3+$^1+$) ;;Меняем параметры филлера
- *[3$^1+$,3$^2+$,Filler]<Draw>
- #<CheckDNextStar>
- {AfterDrawStars}
- $(StarDrawWait)(StarDrawWaitVal)
- **
- ={CreateShot}= ;"Выстреливает" новый снаряд
- ?[3]
- #(ShotC$^MaxShots-)<AfterCreateShot> ;Если снарядов слишком много, то не создавать новый
- $(3)(Shots^3-) ;Начнем с пред-первого снаряда
- {CheckNextShot}
- $(3)(3$^3+) ;Перейдем к следующему снаряду
- ;Проверим, не закончился ли наш своеобразный "массив"?
- #(Shots^MaxShots^3*+^3$-)<AfterCreateShot>
- #(3$$|)<CheckNextShot> ;Если снаряд есть, то перейдем к следующему
- ;Если же снаряда тут нет, то можно создать новый.
- ;Снаряд есть, X - по центру нашего корабля, Y - чуть выше нашего корабля
- $(3$)(1,XP$^PeoR$^2/+^Shot$^2/-,YP$^Shot^1+$-)
- $(ShotC)(ShotC$^1+) ;Увеличим счетчик снарядов на 1.
- $(ShotWait)(ShotWaitVal) ;Подождем до следующего выстрела
- {AfterCreateShot}
- **
- ={DrawShots}= ;Рисует все снаряды на экране, перемещает их после вывода. Удаляет залетевшие за край экрана снаряды.
- ?[3]
- $(3)(Shots^3-) ;Начнем с пред-первого снаряда
- {CheckDNextShot}
- $(3)(3$^3+) ;Перейдем к следующему снаряду
- ;Проверим, не закончился ли наш своеобразный "массив"?
- #(Shots^MaxShots^3*+^3$-)<AfterDrawShot>
- #(3$$)<CheckDNextShot> ;Если снаряда нет, то перейдем к следующему.
- ;Иначе делаем проверки
- #(3$^2+$)<DestroyShot> ;Не улетел ли слишком высоко?
- *[3$^1+$,3$^2+$,Shot]<Draw> ;Рисуем снаряд
- $(3$^2+)(3$^2+$^Speed-) ;Снаряд летит вверх
- #<CheckDNextShot>
- {DestroyShot}
- $(3$)(0) ;Удаляем снаряд из массива
- $(ShotC)(ShotC$^1-) ;Уменьшаем счетчик снарядов.
- $(Score)(Score$^1-) ;Теряем очки
- $(Filler)(Shot$^Shot^1+$) ;Меняем параметры филлера
- *[3$^1+$,3$^2+$,Filler]<Draw> ;Стираем старый снаряд
- #<CheckDNextShot>
- {AfterDrawShot}
- **
- ={CreateEnemy}= ;Создает нового врага со случайными координатами
- ?[3]
- #(EShipC$^MaxEShip-)<AfterCreateEnemy> ;Если врагов слишком много, то не создавать нового
- $(3)(EShips^4-) ;Начнем с пред-первого корабля
- {CheckNextEnemy}
- $(3)(3$^4+) ;перейдем к следующей ячейке.
- ;Проверим, не закончился ли наш своеобразный "массив"?
- #(EShips^MaxEShip^4*+^3$-)<AfterCreateEnemy>
- #(3$$|)<CheckNextEnemy> ;Если корабль тут есть, то перейдем к следующему
- {CreateNewEnemy}
- $(3$)(3?^1+) ;Создаем случайный корабль, и даем ему необходимое изображение
- $(3$^1+)(260?^10+,2,3$$^EnemyPictures+^1-$) ;Случайная координата по X, и 2 по Y, изображение из массива
- $(EShipC)(EShipC$^1+) ;и увеличим счетчик врагов на 1.
- $(EnemyWait)(EnemyWaitVal?^EnemyWaitValInc+) ;Следующий враг появится чуть позже.
- {AfterCreateEnemy}
- **
- ={DrawEnemy}= ;Рисует всех врагов на экране
- ?[3]
- $(3)(EShips^4-) ;Начнем с пред-первого корабля
- {CheckDNextEnemy}
- $(3)(3$^4+) ;Перейдем к следующему кораблю.
- ;Проверим, не закончился ли наш своеобразный "массив"?
- #(EShips^MaxEShip^4*+^3$-)<AfterDrawEnemy>
- #(3$$)<CheckDNextEnemy> ;Если корабль тут отсутствует, то перейдем к следующему
- ;Иначе начинаем проверки
- #(199^PeoR^1+$-^3$^2+$^3$^3+$^1+$+-)<DestroyEnemy> ;Если залетел за край экрана, то вырубаем
- *[3$^1+$,3$^2+$,3$^3+$]<Draw> ;Рисуем корабль
- $(3$^2+)(3$^2+$^Speed+) ;Корабль летит вниз
- #<CheckDNextEnemy> ;Перейдем к следующему кораблю
- {DestroyEnemy}
- $(Score)(Score$^3$$-) ;Теряем очки - за большой корабль больше, за мелкий меньше.
- $(3$)(0) ;Удаляем корабль из массива
- $(EShipC)(EShipC$^1-) ;Уменьшаем счетчик врагов.
- $(Filler)(3$^3+$$,3$^3+$^1+$) ;;Меняем параметры филлера
- *[3$^1+$,3$^2+$,Filler]<Draw> ;Стираем врага
- #<CheckDNextEnemy> ;Перейдем к следующему кораблю.
- {AfterDrawEnemy}
- **
- ={CheckHits}= ;Проверяет на столкновения между снарядом и кораблем.
- ?[3,4] ;3 - индекс снаряда, 4 - индекс корабля.
- $(3)(Shots^3-) ;Начнем с пред-первого снаряда
- {CheckNextHit}
- $(3)(3$^3+) ;Перейдем к следующему снаряду
- #(Shots^MaxShots^3*+^3$-)<AfterCheckHit> ;Проверим, не кончились ли все снаряды?
- #(3$$|)<CheckNextCollision> ;Если снаряд есть, то переходим к проверке
- #<CheckNextHit> ;Иначе беремся за следующий снаряд
- {CheckNextCollision}
- $(4)(EShips^4-) ;Начнем с пред-первого корабля
- {CheckNextShipCol}
- $(4)(4$^4+) ;Перейдем к следующему кораблю
- ;Проверим, не закончился ли наш своеобразный "массив"?
- #(EShips^MaxEShip^4*+^4$-)<CheckNextHit>
- #(4$$|)<CheckNextShipXY> ;Если на это месте есть корабль, то проверим его координаты
- #<CheckNextShipCol> ;иначе проверим следующий корабль
- {CheckNextShipXY}
- ;Если координата снаряда по Y < чем сумма координаты корабля по Y и его высоты то столкновения нет.
- #(3$^2+$^4$^2+$^4$^3+$^1+$+-!^1+|)<CheckNextShipCol>
- ;Иначе если координата центра снаряда больше, чем координата корабля по X, но меньше, чем
- ;сумма координаты корабля по X и его длины в точках, значит мы попали.
- ;Иначе проверяем следующий корабль.
- #(3$^1+$^Shot$^2/+,4$^1+$-!^1+,3$^1+$^Shot$^2/+^4$^1+$^4$^3+$$+-!^1-.)<CheckNextShipCol>
- {IncScore}
- ;Уничтожаем корабль, стираем снаряд, и начисляем очки ;).
- $(Score)(Score$^4$$^4--)
- $(Filler)(4$^3+$$,4$^3+$^1+$) ;;Меняем параметры филлера
- *[4$^1+$,4$^2+$,Filler]<Draw> ;Стираем врага
- $(Filler)(Shot$^Shot^1+$) ;Меняем параметры филлера
- *[3$^1+$,3$^2+$,Filler]<Draw> ;Стираем старый снаряд
- $(ShotC)(ShotC$^1-) ;Снарядом меньше
- $(EShipC)(EShipC$^1-) ;Врагом тоже ;)
- $(3$)(0) ;Снаряда больше нет
- $(4$)(0) ;Корабля тоже
- #<CheckNextHit> ;И к следующему снаряду - этого больше нет
- {AfterCheckHit}
- **
- Program
- *[Regs,Scr13]<Scr> ;Устанавливаем экранный режим 320x200x256
- ;Загружаем картинки, каждую в свою область памяти.
- $(Str1Start)('sh.bmp',0)
- *[Str1Start,PeoR,1]<BMPLoad> ;Палитру устанавливаем только для первой - она общая для всех.
- $(Str1Start)('ts.bmp',0)
- *[Str1Start,Sht,0]<BMPLoad>
- $(Str1Start)('km.bmp',0)
- *[Str1Start,Menok,0]<BMPLoad>
- $(Str1Start)('r.bmp',0)
- *[Str1Start,Shot,0]<BMPLoad>
- $(Str1Start)('ku.bmp',0)
- *[Str1Start,Urg,0]<BMPLoad>
- $(Str1Start)('star.bmp',0)
- *[Str1Start,Star,0]<BMPLoad>
- $(Str1Start)('star2.bmp',0)
- *[Str1Start,Star2,0]<BMPLoad>
- ;Стартуем в центре экрана, направления пока нет, врагов нет, не стреляли,
- ;стрелять можно сразу, задержка перед появлением врага, адреса для изображений
- $(XP)(135,198^PeoR^1+$-,0,0,0,0,0,EnemyWaitVal?^EnemyWaitValInc+,Sht,Menok,Urg,Star,Star2)
- $(Score)(50) ;Начинаем с 50 очками.
- $(StarC)(0,0,3) ;Звезда появится сразу, но пока ни одной нет
- ;Тут можно без джампа, но !!!
- {DirDown}
- $(XDir)(0) ;Обработчик нажатия клавиши вниз. Останавливаемся.
- #<Loop2>
- {DirLeft} ;Если влево, то меняем направление на влево
- $(XDir)(0^PSpeed-)
- #<Loop2>
- {DirRight} ;Если вправо, то меняем на право
- $(XDir)(PSpeed)
- #<Loop2>
- {ScanLoop} ;Опрос клавиатуры происходит именно тут. Реагируем на стрелки, Ctrl и ESC
- ~(8)(~H60,CurKey)
- #(CurKey$^80-)<DirDown>
- #(CurKey$^75-)<DirLeft>
- #(CurKey$^77-)<DirRight>
- *(CurKey$^29-^ShotWait$-)<CreateShot> ;Если нажали стрельбу, и можем стрелять, то стреляем
- #(CurKey$^1-)<EndPrg>
- ;Основной цикл - рисуем картинки и следим, чтобы кораблик не убежал за пределы экрана
- {Loop2}
- $(1)('S')
- $(1)('c')
- $(1)('o')
- $(1)('r')
- $(1)('e')
- $(1)(':')
- $(1)(32, Score$)
- *[0,0]<GoToXY>
- $(StarWait)(StarWait$^StarWait$!-) ;Уменьшаем ожидание следующей звезды, но только если не 0
- *(StarWait$)<CreateStar> ;Если пора, то создаем новую звезду.
- $(ShotWait)(ShotWait$^ShotWait$!-) ;Уменьшаем ожидание следующего выстрела, но только если оно не ноль
- *(EnemyWait$)<CreateEnemy> ;Если пора, то создаем нового врага
- $(EnemyWait)(EnemyWait$^1-) ;Уменьшаем ожидание следующей генерации врага
- *<WaitR> ;Ждем вертикального обратного хода луча.
- $(StarDrawWait)(StarDrawWait$^StarDrawWait$!-)
- *(StarC$|^StarDrawWait$+)<DrawStars> ;Рисуем звезды, но если только такие есть, и если не истекла задержка.
- *(EShipC$|)<DrawEnemy> ;Рисуем врагов, но только если есть кого
- *[XP$,YP$,PeoR]<Draw> ;рисуем корабль игрока
- *(ShotC$|)<DrawShots> ;Рисуем снаряды, но если они есть.
- *(ShotC$|)<CheckHits> ;Проверяем на столкновения снарядов с врагами, но только если снаряды есть.
- $(XP)(XP$^XDir$+) ;Перемещаем корабль
- #(315^XP$^PeoR$+-!^1+)<StopRight> ;Если близко к правой границе экрана, то остановиться.
- #(XP$^7-!^1+)<StopLeft> ;Если к левой, то тоже
- #(Score$^WinScore-!^1-)<Win> ;Набрали кучу очков? Победа, дос =)
- #(Score$!^1+)<Lose> ;Потеряли все? Увы, увы ;(
- #<ScanLoop>
- {StopRight}
- $(XDir)(0)
- $(XP)(XP$^PSpeed-)
- #<ScanLoop>
- {StopLeft}
- $(XDir)(0)
- $(XP)(XP$^PSpeed+)
- #<ScanLoop>
- {Win}
- [You won zxD)))]
- [Anyway, all your base are belong to us.]
- #<WaitForKey>
- {Lose}
- [Game over, God bless you]
- {WaitForKey}
- $(3)(2$)
- ;Конец программы, ждем нажатия на любую клавишу, и сбрасываем граф. режим
- {EndPrg}
- *[Regs,TextMode]<Scr>
- {GlobalEnd}
Advertisement
Add Comment
Please, Sign In to add comment