Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Как самому создать компьютерную игру #4


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Приветствую всех подписчиков

этой рассылки!

 

Это специальный новогодний выпуск.

Во-первых хотелось бы поздравить Вас с Новым годом! Пожелать чтобы следующий год был бы лучше всех предыдущих вместе взятых. Чтобы Вы не забывали о приятных моментах этого года и забыли бы обо всех горестях. Действительно хотелось бы, чтобы у Вас было все очень хорошо, чтобы все, чтобы Вы не пожелали в Новом году неприменно исполнялось. Ну и наконец чтобы счастье не было бы случайным гостем в Вашем доме. Всего самого светлого и хорошего в Новом тысячелетии!

Ну а теперь немного поговорим о сегодняшнем выпуске ;-)

Из него Вы может быть и не узнаете чего-то нового. Просто надеемся, что после "переваривания" всей информации этого выпуска Вы хотя бы на некоторое время улыбнетесь. Поверьте, это и есть самая большая награда нам за свой труд.

Хочется сказать спасибо всем тем, кто только что подписался на эту рассылку и намекнуть, что в HTML формате она смотрится немного лучше. Вообще радует, что хотя бы к концу этого года число подписчиков перевалило на полсотни. Конечно невесть какое достижение, но нам все-равно приятно, т.к. помнится, что первый выпуск мы делали всего лишь для восьми человек.

Еще раз хотим обратиться к тем, кто только что подписался - прочитайте предыдущие выпуски. Если все поймете- хорошо, если нет, задавайте вопросы. Мы будем всегда рады.

Сегодня мы хотим привести пример одной игры. Если кто-то не знаком с языком, на котором написана игра - не беда. Просто эта игра пример того, что игры можно делать практически на любом языке. Язык будет влиять только на КАЧЕСТВО игры.

Эта игра - старая известная фидошная шутка. Программа, написанная одним из фидошников. В свое время она прошла по всем эхам типа HUMOR. Это продолжение хорошо известной игры Doom. Это Doom 3 на ... бейсике. :-) Встречайте:

DECLARE SUB MonstMove (x, y, Direct)

DECLARE SUB MonstInit ()

DECLARE SUB ShowMap ()

DECLARE SUB About ()

DECLARE FUNCTION Id$ (Num AS INTEGER)

DECLARE SUB GameOver ()

DECLARE SUB Victory ()

DECLARE SUB Doom (x!, y!, Direct!)

DECLARE SUB Move (x!, y!, Direct!)

COMMON SHARED ox, oy, MaxX, MaxY, ak, Map, True, False, nMonst, mTime, mMove

CALL About

True = 1: False = 0

Map = True

mTime = 50 ' Если будет тормозить, то лучше увеличить!

SCREEN 1

DIM SHARED ak(12)

ak(1) = 16: ak(2) = 15: ak(3) = 14: ak(4) = 12: ak(5) = 11: ak(6) = 10

ak(7) = 9: ak(8) = 11: ak(9) = 12: ak(10) = 12: ak(11) = 12: ak(12) = 12

555

CLS 0

VIEW (10, 20)-(180, 160), 0, 8

ON ERROR GOTO 333

READ MaxX

READ MaxY

READ nMonst

ON ERROR GOTO 0

REDIM SHARED Lab(MaxX, MaxY) AS INTEGER

REDIM SHARED Monst(nMonst, 4) AS INTEGER

nMonst = 0

RANDOMIZE TIMER

FOR y1 = 1 TO MaxY: FOR x1 = 1 TO MaxX

READ Lab(x1, y1)

IF Lab(x1, y1) = 3 THEN nx = x1: ny = y1

IF Lab(x1, y1) = 2 THEN

nMonst = nMonst + 1

Monst(nMonst, 1) = x1

Monst(nMonst, 2) = y1

Monst(nMonst, 3) = INT(RND * 4) + 1

Monst(nMonst, 4) = INT(RND * mTime) + mTime

END IF

NEXT x1: NEXT y1

IF nx = 0 OR ny = 0 THEN PRINT "Man not found!": END

ox = 24: oy = 2

100

y = ny: x = nx

IF Map = True THEN COLOR 4: CALL ShowMap ELSE COLOR 0: CALL ShowMap: COLOR 4

Ch$ = ""

See = -1

Direct = 4 ' 1-Вперед; 2-Вправо; 3-азад; 4-Влево

IF Map = True THEN CALL Move(x, y, Direct)

CALL Doom(x, y, Direct)

oTime = INT(TIMER)

MaxTime = 666

LOCATE 1, 1: PRINT "Time to destruction:"

WHILE Ch$ <> CHR$(27)

PlayedTime = MaxTime - INT(TIMER) + oTime

IF PlayedTime < 0 THEN CALL GameOver: GOTO 100

LOCATE 1, 21: PRINT PlayedTime; " "

Ch$ = INKEY$

OldX = x: OldY = y: OldD = Direct

CALL MonstMove(x, y, Direct): IF Map = True THEN CALL Move(x, y, Direct)

IF Ch$ = CHR$(9) THEN ' Карта

IF Map = True THEN Map = False ELSE Map = True

IF Map = True THEN COLOR 15: CALL ShowMap: CALL Move(x, y, Direct) ELSE

COLOR 0: CALL ShowMap: COLOR 1

END IF

SELECT CASE MID$(Ch$, 2, 1)

CASE CHR$(72) ' Вперед

SELECT CASE Direct

CASE 1

y = y - 1

CASE 3

y = y + 1

CASE 2

x = x + 1

CASE 4

x = x - 1

END SELECT

CASE CHR$(80) ' азад

SELECT CASE Direct

CASE 1

y = y + 1

CASE 3

y = y - 1

CASE 2

x = x - 1

CASE 4

x = x + 1

END SELECT

CASE CHR$(75) ' Влево

Direct = Direct - 1

CASE CHR$(77) ' Вправо

Direct = Direct + 1

END SELECT

IF Direct < 1 THEN Direct = 4

IF Direct > 4 THEN Direct = 1

IF x > MaxX OR x < 1 THEN x = OldX

IF y > MaxY OR y < 1 THEN y = OldY

IF Lab(x, y) = 1 THEN x = OldX: y = OldY

IF Lab(x, y) = 9 THEN CALL Victory: GOTO 555

IF OldX <> x OR OldY <> y OR OldD <> Direct THEN ' Перерисовка

Lab(OldX, OldY) = 0

Lab(x, y) = 3

IF Map = True THEN

CALL Move(x, y, Direct)

IF Direct = OldD THEN LOCATE oy + OldY, ox + OldX: PRINT Id$(Lab(OldX, OldY))

END IF

CALL Doom(x, y, Direct)

END IF

WEND

END

333

CLS 0

PRINT "LEVEL NOT FOUND!"

END

DATA 16,18,5

DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

DATA 1,0,0,0,0,0,0,0,3,1,0,0,0,0,2,9

DATA 1,0,1,1,0,1,1,1,0,1,0,1,1,1,1,1

DATA 1,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1

DATA 1,0,0,0,1,0,1,1,0,1,1,1,1,1,0,1

DATA 1,0,1,0,0,0,1,1,0,1,1,1,1,1,0,1

DATA 1,0,0,1,0,1,1,1,0,1,0,0,0,0,0,1

DATA 1,1,0,1,0,1,1,1,0,0,0,1,1,0,1,1

DATA 1,0,0,1,0,0,2,0,0,1,0,1,1,0,1,1

DATA 1,0,1,1,1,1,0,1,1,1,0,0,0,0,2,1

DATA 1,2,1,1,1,1,0,1,1,1,0,1,1,1,0,1

DATA 1,0,1,1,1,1,0,1,1,1,0,1,1,1,0,1

DATA 1,0,1,1,1,1,0,1,1,0,0,0,1,1,0,1

DATA 1,0,1,1,1,1,0,1,1,0,1,0,1,1,0,1

DATA 1,0,0,0,1,1,0,2,0,0,1,0,1,1,0,1

DATA 1,1,0,1,1,1,1,0,1,0,1,0,1,0,0,1

DATA 1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1

DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

DATA 10,10,3

DATA 1,1,1,1,1,1,1,1,1,1

DATA 1,2,0,0,0,0,0,0,3,1

DATA 1,0,1,1,0,1,1,1,0,1

DATA 1,0,1,1,0,0,1,1,0,1

DATA 1,0,0,0,1,0,1,1,2,1

DATA 1,0,1,0,0,0,1,1,0,1

DATA 1,0,0,1,0,1,1,1,0,1

DATA 1,1,0,1,0,1,1,1,0,1

DATA 9,0,0,1,0,0,2,0,0,1

DATA 1,1,1,1,1,1,1,1,1,1

SUB About

SLEEP 1

PRINT "DOS/4GW Protected Mode Run-time Version 1.97"

PRINT "Copyright (c) Rational Systems, Inc. 1990-1994"

SLEEP 1

CLS

COLOR 15, 4

PRINT " DOOM 51 3/13 666.1 Operational System by Sergey Arsentiev. "

'2:5020/150.11

COLOR 7, 0

PRINT

PRINT "Sound: Fully Initialized."

SLEEP 1

PRINT "Video: Partialy Initialized."

SLEEP 1

PRINT

PRINT "Misc: Miscellaneus Initialized."

PRINT

SLEEP 1

RANDOMIZE TIMER

PRINT "NEW DOOM Refresh Daemon [ ]"

FOR i = 26 TO 51

LOCATE 8, i: PRINT "."

ii1 = RND * 10000: FOR ii = 1 TO ii1: NEXT

NEXT i

PRINT "This is now realy faster than DOOM I or DOOM II !"

PRINT

PRINT "Prepare for playing in NEW DOOM 51 3/13..."

FOR i = 1 TO 200

SOUND i * 5 + 50, .1

NEXT

END SUB

SUB Doom (x, y, Direct)

xx = x: yy = y

See = -1

WHILE Lab(xx, yy) <> 1

See = See + 1

SELECT CASE Direct

CASE 1

yy = yy - 1

CASE 3

yy = yy + 1

CASE 4

xx = xx - 1

CASE 2

xx = xx + 1

END SELECT

IF xx > MaxX OR xx < 1 OR yy > MaxY OR yy < 1 THEN GOTO 666

WEND

666

' 170x140

CLS

k = ak(See)

FOR z = 0 TO See

IF z = See THEN LINE (z * k, z * k)-(170 - z * k, 140 - z * k), 6, B

IF z > 0 THEN

' Справа

Door = 0

Monster = 0

Conv = 0

SELECT CASE Direct

CASE 1

IF Lab(x + 1, y - z) <> 1 THEN Door = 1

IF Lab(x, y - z) = 2 THEN Monster = 1

IF Lab(x, y - z) = 9 THEN Conv = 1

CASE 3

IF Lab(x - 1, y + z) <> 1 THEN Door = 1

IF Lab(x, y + z) = 2 THEN Monster = 1

IF Lab(x, y + z) = 9 THEN Conv = 1

CASE 2

IF Lab(x + z, y + 1) <> 1 THEN Door = 1

IF Lab(x + z, y) = 2 THEN Monster = 1

IF Lab(x + z, y) = 9 THEN Conv = 1

CASE 4

IF Lab(x - z, y - 1) <> 1 THEN Door = 1

IF Lab(x - z, y) = 2 THEN Monster = 1

IF Lab(x - z, y) = 9 THEN Conv = 1

END SELECT

IF Door = 0 THEN

LINE (170 - (z - 1) * k, (z - 1) * k)-(170 - (z * k), z * k), 6 ' Верх

LINE (170 - (z - 1) * k, 140 - (z - 1) * k)-(170 - (z * k), 140 - (z * k)), 6' и

ELSE

LINE (170 - (z - 1) * k, (z - 1) * k)-(170 - (z - 1) * k, 140 - (z - 1) * k), 12' Вертикальная ближня

LINE (170 - z * k, z * k + 1)-(170 - z * k, 140 - z * k - 1), 0 ''Стираем старую вертикальную лини

LINE (170 - z * k, z * k)-(170 - (z - 1) * k - 1, z * k), 6 ' Рисуем'продолжение стены сверх

LINE (170 - z * k, 140 - z * k)-(170 - (z - 1) * k - 1, 140 - z * k), 6' Рисуем продолжение стены сниз

IF NOT z = See THEN LINE (170 - z * k, z * k)-(170 - z * k, 140 - z * k), 12 ' Вертикальная дальня

END IF

IF Monster = 1 THEN

CIRCLE (85, 70), k * 2.5 / z, 13

PAINT (85, 70), 13, 13

CIRCLE (85, 70), k * 2 / z, 4, 3.14, 0

CIRCLE (85, 70), k * .7 / z, 14, , , 2

CIRCLE (85, 70), k * 2 / z, 10, 3.14 / 4, 3.14 / 3

CIRCLE (85, 70), k * 2 / z, 10, 3.14 / 1.5, 3.14 / 1.3

END IF

IF Conv = 1 THEN

LOCATE 11, 11: PRINT "EXIT!"

END IF

' Слева

Door = 0

SELECT CASE Direct

CASE 1

IF Lab(x - 1, y - z) <> 1 THEN Door = 1

CASE 3

IF Lab(x + 1, y + z) <> 1 THEN Door = 1

CASE 2

IF Lab(x + z, y - 1) <> 1 THEN Door = 1

CASE 4

IF Lab(x - z, y + 1) <> 1 THEN Door = 1

END SELECT

IF Door = 0 THEN

LINE ((z - 1) * k, (z - 1) * k)-(z * k, z * k), 6 ' Верх

LINE ((z - 1) * k, 140 - (z - 1) * k)-(z * k, 140 - (z * k)), 6 ' из

ELSE

LINE ((z - 1) * k, (z - 1) * k)-((z - 1) * k, 140 - (z - 1) * k), 12

LINE (z * k, z * k - 1)-(z * k, 140 - z * k + 1), 0

LINE (z * k, z * k)-((z - 1) * k + 1, z * k), 6

LINE (z * k, 140 - z * k)-((z - 1) * k + 1, 140 - z * k), 6

IF NOT z = See THEN LINE (z * k, z * k)-(z * k, 140 - z * k), 12

END IF

END IF

NEXT z

END SUB

SUB GameOver

LOCATE 10, 5: PRINT " GAME OVER ! "

SLEEP 3

LOCATE 10, 5: PRINT " MISSION FAILED ! "

SLEEP 10

END SUB

SUB HeHe (x, y, Direct)

x2 = x: y2 = y

WHILE 1 = 1

IF Lab(x2, y2) = 2 THEN CALL Doom(x, y, Direct): GOTO 777

SELECT CASE Direct

CASE 1

y2 = y2 - 1

CASE 3

y2 = y2 + 1

CASE 4

x2 = x2 - 1

CASE 2

x2 = x2 + 1

END SELECT

IF x2 > MaxX OR x2 < 1 OR y2 > MaxY OR y2 < 1 THEN GOTO 777

WEND

777

END SUB

FUNCTION Id$ (Num AS INTEGER)

SELECT CASE Num

CASE 0

Id$ = " "

CASE 1

Id$ = "_"

CASE 2

Id$ = CHR$(1)

CASE 3

Id$ = " "

CASE 9

Id$ = CHR$(4)

END SELECT

END FUNCTION

SUB MonstMove (x, y, Direct)

mMove = False

FOR nn = 1 TO nMonst

Time = Monst(nn, 4)

IF Time > 0 THEN Time = Time - 1: GOTO 444 ELSE Time = INT(RND * mTime) + mTim

Dir = Monst(nn, 3)

xx = Monst(nn, 1)

yy = Monst(nn, 2)

IF Lab(xx, yy - 1) <> 1 AND INT(RND * 4) + 1 = 1 AND Dir <> 3 THEN Dir = 1

IF Lab(xx, yy + 1) <> 1 AND INT(RND * 4) + 1 = 3 AND Dir <> 1 THEN Dir = 3

IF Lab(xx + 1, yy) <> 1 AND INT(RND * 4) + 1 = 2 AND Dir <> 4 THEN Dir = 2

IF Lab(xx - 1, yy) <> 1 AND INT(RND * 4) + 1 = 4 AND Dir <> 2 THEN Dir = 4

222

Brake = False

SELECT CASE Dir

CASE 1

OldYY = yy

yy = yy - 1

IF Lab(xx, yy) <> 1 AND Lab(xx, yy) <> 9 THEN

IF Map = True THEN LOCATE OldYY + oy, xx + ox: PRINT " "

Lab(xx, OldYY) = 0

Lab(xx, yy) = 0

Lab(xx, yy) = 2

IF Map = True THEN LOCATE yy + oy, xx + ox: PRINT CHR$(1)

mMove = True

ELSE

yy = OldYY

Brake = True

END IF

CASE 2

OldXX = xx

xx = xx + 1

IF Lab(xx, yy) <> 1 AND Lab(xx, yy) <> 9 THEN

IF Map = True THEN LOCATE yy + oy, OldXX + ox: PRINT " "

Lab(OldXX, yy) = 0

Lab(xx, yy) = 0

Lab(xx, yy) = 2

IF Map = True THEN LOCATE yy + oy, xx + ox: PRINT CHR$(1)

mMove = True

ELSE

xx = OldXX

Brake = True

END IF

CASE 3

OldYY = yy

yy = yy + 1

IF Lab(xx, yy) <> 1 AND Lab(xx, yy) <> 9 THEN

IF Map = True THEN LOCATE OldYY + oy, xx + ox: PRINT " "

Lab(xx, OldYY) = 0

Lab(xx, yy) = 0

Lab(xx, yy) = 2

IF Map = True THEN LOCATE yy + oy, xx + ox: PRINT CHR$(1)

mMove = True

ELSE

yy = OldYY

Brake = True

END IF

CASE 4

OldXX = xx

xx = xx - 1

IF Lab(xx, yy) <> 1 AND Lab(xx, yy) <> 9 THEN

IF Map = True THEN LOCATE oy + yy, OldXX + ox: PRINT " "

Lab(OldXX, yy) = 0

Lab(xx, yy) = 0

Lab(xx, yy) = 2

IF Map = True THEN LOCATE yy + oy, xx + ox: PRINT CHR$(1)

mMove = True

ELSE

xx = OldXX

Brake = True

END IF

END SELECT

IF Brake = True THEN Dir = INT(RND * 4) + 1: GOTO 222

Monst(nn, 1) = xx

Monst(nn, 2) = yy

Monst(nn, 3) = Dir

444

Monst(nn, 4) = Time

NEXT

IF mMove = True THEN CALL Doom(x, y, Direct)

END SUB

SUB Move (x, y, Direct) STATIC

LOCATE oy + y, ox + x

Ch$ = "?"

SELECT CASE Direct

CASE 1

Ch$ = CHR$(24)

CASE 2

Ch$ = CHR$(26)

CASE 3

Ch$ = CHR$(25)

CASE 4

Ch$ = CHR$(27)

END SELECT

PRINT Ch$;

END SUB

SUB ShowMap

FOR y1 = 1 TO MaxY: FOR x1 = 1 TO MaxX

LOCATE oy + y1, ox + x1: PRINT Id$(Lab(x1, y1));

NEXT x1: PRINT : NEXT y1

END SUB

SUB Victory

LOCATE 11, 8: PRINT "YOU WIN !!!"

SLEEP 2

LOCATE 11, 8: PRINT " Thank you "

SLEEP 3

END SUB

P.S. Рассылка была бы неполноценной без общения с подписчиками. Поэтому по всем вышеперечисленным темам можно задавать вопросы по адресу gamemaker@pisem.net. Можно глупые ;-).

А также, после выхода этого выпуска мы ждем Ваши мнения, замечания, пожелания, предложения и жесточайшую критику по адресу gamemaker@pisem.net.

 

Инструкция по использованию рассылки ;-)

 

Эту рассылку проще всего читать в HTML формате, поэтому те, кто подписался на нее в TEXT/MIME переподпишитесь. Просто в других форматах более поздние выпуски будет читать неинтересно в связи с полным отсутствием иллюстраций.

 

На этом я с вами прощаюсь.

SlyMagic.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Поиск

В избранное