The QBasic Forum     RULES     Other Subforums, Links and Downloads    Index of Threads

 Return to Index  

Simple ASCII Space Game (Version 1.1)

November 30 2005 at 6:29 PM
  (Login ComputerGhost)
R


Response to ProgramList ComputerGhost

DECLARE SUB Adios (StartingKeys%, Reason$)
DECLARE SUB DrawSpaceStation (y%)
DECLARE SUB GetKeysPressed ()
DECLARE FUNCTION IsBulletCol% (AX!, AY!, OX%, OY%)
DECLARE FUNCTION IsAsteroidCol% (AX!, AY!, AX2!, AY2!)
DECLARE FUNCTION IsShipCollision% (SX%, SY%, OX!, OY!, OW%, OH%)
DECLARE SUB EraseImage (x%, y%, w%, h%)
DECLARE SUB DrawAsteroid (x%, y%)
DECLARE SUB DrawCharacter (x%, y%)
DECLARE SUB InitScreen ()
'-------------------------------------------------------------------------
'| Space.BAS by Nathan Belue (ComputerGhost)
'| Started: 10-29-2005 12:07AM
'| Released: 11-30-2005 8:32PM
'-------------------------------------------------------------------------
const HitMax = 3: "Maximum hits you can sustain
DIM SHARED KeysPressed$
DIM SHARED StartingKeys%
DIM AsteroidX(5), AsteroidY(5)        'Position
DIM OAsteroidX(5), OAsteroidY(5)      'Old position
DIM AsteroidXS(5), AsteroidYS(5)      'Speed

DIM BulletX%(10), BulletY%(10)        'Position



REM --Initialize values--
DEF SEG = &H40: StartingKeys% = PEEK(&H17) AND &HF0: DEF SEG

FOR i% = 0 TO 9
        BulletY%(i%) = -1
NEXT i%
ShipX% = 40
ShipY% = 43
OShipX% = 40
OShipY% = 43
Distance% = 2400
Points% = 0

'If you can't use Command$ then just comment this out
IF COMMAND$ = "S" THEN
        Collision$ = "O0 C32"
        Shot$ = "O0 MN C MS CCCC ML"
        Shoot$ = "MS O1EGD32 ML"
END IF





REM --Now for the fun part!--
RANDOMIZE TIMER \ 3
PLAY "MB ML L64"
InitScreen



REM --Intro--
FOR y% = 43 TO 50
        CALL EraseImage(1, y% - 1, 79, 1)
        CALL DrawSpaceStation(y%)
        CALL DrawCharacter(ShipX%, ShipY%)
       
        timers = TIMER
        DO: n$ = INKEY$: LOOP UNTIL timers + .1 < TIMER
NEXT y%


REM --Main code--
Main:
DO
        timers = TIMER


        'Bullets
        FOR i% = 0 TO 9
                REM --Test for collisions--
                FOR i2% = 0 TO 4
                        IF IsBulletCol%(AsteroidX(i2%), AsteroidY(i2%), BulletX%(i%), BulletY%(i%)) THEN
                                AsteroidY(i2%) = 55
                                Points% = Points% + 1
                                IF PLAY(n) = 0 THEN PLAY Shot$
                                EXIT FOR
                        END IF
                NEXT i2%

                REM --Draw the images--
                CALL EraseImage(BulletX%(i%), BulletY%(i%) + 1, 1, 1)
                IF (BulletY%(i%) > 1) THEN
                        LOCATE BulletY%(i%), BulletX%(i%)
                        COLOR 10:       PRINT "³"
                END IF

                REM --Update the positions of the bullets--
                BulletY%(i%) = BulletY%(i%) - 1

                REM --Test variables--
                IF BulletY%(i%) < 0 THEN BulletY% = 0
        NEXT i%

       
        'Ship
        CALL EraseImage(OShipX%, OShipY%, 7, 4)
        CALL DrawCharacter(ShipX%, ShipY%)
        OShipX% = ShipX%: OShipY% = ShipY%


        'Asteroids
        FOR i% = 0 TO 4
                REM --Test for collisions--
                'with ship
                IF IsShipCollision(ShipX%, ShipY%, AsteroidX(i%), AsteroidY(i%), 5, 4) THEN
                        Hit% = Hit% + 1
                        AsteroidY(i%) = 55
                        IF PLAY(1) = 0 THEN PLAY Collision$
                END IF
               
                'with another asteroid
                FOR i2% = 0 TO 4
                        IF (i% <> i2%) AND IsAsteroidCol%(AsteroidX(i%), AsteroidY(i%), AsteroidX(i2%), AsteroidY(i2%)) THEN
                                AsteroidXS(i%) = -AsteroidXS(i%)
                                AsteroidYS(i%) = -AsteroidYS(i%)
                        END IF
                NEXT i2%

                REM --Draw the images--
                CALL EraseImage(OAsteroidX(i%) OR 0, OAsteroidY(i%) OR 0, 5, 5)
                CALL DrawAsteroid(AsteroidX(i%) OR 0, AsteroidY(i%) OR 0)

                REM --Update positions of asteroids--
                'Store old values
                OAsteroidX(i%) = AsteroidX(i%)
                OAsteroidY(i%) = AsteroidY(i%)

                'Update position variables
                AsteroidX(i%) = AsteroidX(i%) + AsteroidXS(i%)
                AsteroidY(i%) = AsteroidY(i%) + AsteroidYS(i%) + 1
                AsteroidXS(i%) = (ShipX% - AsteroidX(i%)) / 80
                AsteroidYS(i%) = (ShipY% - AsteroidY(i%)) / 50

                'Test variables
                IF (AsteroidY(i%) > 44) THEN
                        AsteroidXS(i%) = 0
                        AsteroidYS(i%) = 0
                        AsteroidX(i%) = INT(RND * 76) + .5
                        AsteroidY(i%) = INT(RND * 50) * 50
                        IF (AsteroidY(i%) = 0) THEN
                                AsteroidY(i%) = 1
                        END IF
                END IF

        NEXT i%



        REM --Status--
        'rectangle
        LOCATE 1, 1
        COLOR 10, 1
        FOR i% = 1 TO 5
                PRINT STRING$(17, " "); "³"
        NEXT i%
        PRINT STRING$(17, "Ä"); "Ù"

        'status
        LOCATE 1, 1
        COLOR 15: PRINT " Points:";
        COLOR 14: PRINT Points%

        COLOR 15: PRINT " Distance:";
        COLOR 14: PRINT Distance%

        COLOR 15: PRINT " Hits:";
        COLOR 14: PRINT Hit%;
        COLOR 15: PRINT "of"; HitMax

        IF Hit% = HitMax THEN Adios StartingKeys%, "DIE!"
       
        REM --Timer--
        DO
                CALL GetKeysPressed
        LOOP UNTIL timers + .01 < TIMER

        Distance% = Distance% - 1
        IF Distance% = 0 THEN GOTO Finished
LOOP UNTIL LEN(KeysPressed$)




IF INSTR(KeysPressed$, "H") THEN        'UP
        IF (ShipY% > 1) THEN ShipY% = ShipY% - 1
END IF
IF INSTR(KeysPressed$, "P") THEN        'DOWN
        IF (ShipY% < 46) THEN ShipY% = ShipY% + 1
END IF
IF INSTR(KeysPressed$, "K") THEN        'LEFT
        IF (ShipX% > 1) THEN ShipX% = ShipX% - 1
END IF
IF INSTR(KeysPressed$, "M") THEN        'RIGHT
        IF (ShipX% < 74) THEN ShipX% = ShipX% + 1
END IF
IF INSTR(KeysPressed$, "9") THEN         'SPACE BAR
        FOR i% = 0 TO 9
                IF BulletY%(i%) < 1 THEN
                        BulletY%(i%) = ShipY% - 1
                        BulletX%(i%) = ShipX% + 3
                        IF PLAY(1) = 0 THEN PLAY Shoot$
                        EXIT FOR
                END IF
        NEXT i%
END IF
IF INSTR(KeysPressed$, "2") THEN        'M for mute
        Collision$ = ""
        Shot$ = ""
        Shoot$ = ""
END IF
IF INSTR(KeysPressed$, CHR$(1)) THEN    'ESCAPE
        Adios StartingKeys%, "decided to quit"
END IF
IF INSTR(KeysPressed$, CHR$(28)) THEN   'ENTER
        SLEEP (1)
        KeysPressed$ = ""

        DO
                CALL GetKeysPressed
        LOOP UNTIL LEN(KeysPressed$)

        SLEEP (1)
END IF
       

GOTO Main





Finished:
FOR y% = ShipY% TO 1 STEP -1
        CALL EraseImage(OShipX%, y% + 1, 7, 4)
        CALL DrawCharacter(ShipX%, y%)
        timers = TIMER
        DO: n$ = INKEY$: LOOP UNTIL timers + .01 < TIMER
NEXT y%

Adios StartingKeys%, " have finished the game."

SUB Adios (StartingKeys%, Reason$)
LOCATE 10, 30: PRINT "Adios, My Friend - You " + Reason$
' User might have stacked a zillion keypresses
IF INKEY$ <> "" THEN
  FOR i = 1 TO 100
    WHILE INKEY$ <> "": WEND
  NEXT i
END IF
WHILE INKEY$ = "": WEND
CLS : WIDTH 80, 25
DEF SEG = &H40: POKE &H17, StartingKeys%: DEF SEG
WHILE INKEY$ <> "": WEND
SYSTEM

END SUB

SUB DrawAsteroid (x%, y%)
'----Asteroid----
'012345
'  ÜÜÜ
' ÞÛÛÛÝ
' ÞÛÛÛÝ
'  ßßß
'
'----------------
REM --Test (x%, y%) to see if it's valid--
IF (x% > 76) OR (x% < 1) OR (y% < 1) OR (y% > 46) THEN EXIT SUB


REM --Draw the image--

LOCATE y%, x%
COLOR 8, 0:     PRINT "Ü";
COLOR 8, 7:     PRINT "³ À";
COLOR 8, 0:     PRINT "Ü"

LOCATE y% + 1, x%
COLOR 8, 7:     PRINT "ÚÏ¸Ú "
                        
LOCATE y% + 2, x%
                PRINT "Ä ÃÙÕ"

LOCATE y% + 3, x%
COLOR 8, 0:     PRINT "ß";
COLOR 8, 7:     PRINT "ÚÙ ";
COLOR 8, 0:     PRINT "Ý";


END SUB

SUB DrawCharacter (x%, y%)
'--------The character--------
'   ÞºÝ
'   ÛþÛ
'  ÜÛÛÛÜ
' /  ±  \
'------------------------

f% = INT(RND * 2) * 2 + 12
LOCATE y%, x% + 2
COLOR 7, 0:     PRINT "Þ";
COLOR 15:       PRINT "º";
COLOR 7:        PRINT "Ý"

LOCATE y% + 1, x% + 2
COLOR 7:        PRINT "Û";
COLOR 11:       PRINT "þ";
COLOR 7:        PRINT "Û"

LOCATE y% + 2, x% + 1
COLOR 7:        PRINT "ÜÛÛÛÜ"

LOCATE y% + 3, x%
COLOR 7:        PRINT "/";
LOCATE , x% + 3
COLOR f%:       PRINT "±";
LOCATE , x% + 6
COLOR 7:        PRINT "\";

END SUB

SUB DrawSpaceStation (y%)

IF y% <= 49 THEN
        LOCATE y%, 1
        COLOR 7, 0
        PRINT "                            ÜÜÜÜÜÜÜÛ";
        PRINT "ÛÛÛ       ÛÛÛÛÜÜÜÜÜÜÜ                      ";
END IF
IF y% <= 48 THEN
        LOCATE y% + 1, 1
        PRINT "                          ÜÛÛÛÛÛÛÛÛÛÛÛ";
        PRINT "Û       ÛÛÛÛÛÛÛÛÛÛÛÛÜ                    ";
END IF
IF y% <= 47 THEN
        LOCATE y% + 2, 1
        PRINT "ÜÜÜÜÜÜÜÜÜÜ               ÛÛÛÛÛ";
        COLOR , 1:      PRINT "ß";
        COLOR 6:        PRINT " ùúú";
        COLOR 7:        PRINT "ß";
        COLOR , 0
        PRINT "ÛÛÛ       ÛÛÛ";
        COLOR , 1
        COLOR , 1:      PRINT "ß";
        COLOR 6:        PRINT "ù ú ";
        COLOR 7:        PRINT "ß";
        COLOR , 0
        PRINT "ÛÛÛÛÛ               ÜÜÜÜ";
END IF
IF y% <= 46 THEN
        LOCATE y% + 3, 1
        COLOR 1, 7
        PRINT "           þ þ þ þ þ þ þ     ÞÛÛÛÛÛÛÝ ";
        COLOR 7, 0
        PRINT "Û       Û";
        COLOR 1, 7
        PRINT " ÞÛÛÛÛÛÛÝ     þ þ þ þ þ þ þ     ";
END IF
IF y% <= 45 THEN
        LOCATE y% + 4, 1
        COLOR 7, 0
        PRINT "ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ";
        PRINT "ÛÛÛÛÛÛÛÛÛ";
        PRINT "ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ";
END IF
IF y% <= 44 THEN
        LOCATE y% + 5, 1
        PRINT "ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ";
END IF
IF y% <= 43 THEN
        LOCATE y% + 6, 1
        PRINT "ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ";
END IF

END SUB

SUB EraseImage (x%, y%, w%, h%)
REM --Test point (x%, y%) to see if it's valid--
IF (x% < 1) OR (x% > 80) OR (y% < 1) THEN EXIT SUB

REM --Erase image--
COLOR , 0
FOR y% = y% TO y% + h%
        IF (y% > 49) THEN EXIT SUB
        LOCATE y%, x%
        PRINT SPACE$(w%);
NEXT y%

END SUB

'DIM SHARED KeysPressed$
SUB GetKeysPressed
REM --Make sure numlock is off--
DEF SEG = &H40
IF PEEK(&H17) THEN POKE &H17, 0
DEF SEG


TheKey% = INP(96)

REM --If key was let go--
IF TheKey% > 127 THEN
        TheKey% = TheKey% AND 127
        offset% = INSTR(KeysPressed$, CHR$(TheKey%))
        IF offset% > 0 THEN KeysPressed$ = LEFT$(KeysPressed$, offset% - 1) + RIGHT$(KeysPressed$, LEN(KeysPressed$) - offset%)

REM --If a key was pressed--
ELSE
        IF INSTR(KeysPressed$, CHR$(TheKey%)) = 0 THEN
                KeysPressed$ = KeysPressed$ + CHR$(TheKey%)
        END IF
END IF

DO: cmd$ = INKEY$: LOOP UNTIL cmd$ = ""
END SUB

SUB InitScreen
SCREEN 0
WIDTH 80, 50

END SUB

FUNCTION IsAsteroidCol% (AX, AY, AX2, AY2)
'----Asteroid----
'012345
'  ÜÜÜ
' ÞÛÛÛÝ
' ÞÛÛÛÝ
'  ßßß
'012345
'----------------
REM --Left or Right--
IF (AX + 4 < AX2) OR (AX > AX2 + 4) THEN
        IsAsteroidCol% = 0
        EXIT FUNCTION
END IF

REM --Above or Below
IF (AY + 3 < AY2) OR (AY > AY2 + 3) THEN
        IsAsteroidCol% = 0
        EXIT FUNCTION
END IF

IsAsteroidCol% = 1
END FUNCTION

FUNCTION IsBulletCol% (AX, AY, OX%, OY%)
'----Asteroid----
'012345
'  ÜÜÜ
' ÞÛÛÛÝ
' ÞÛÛÛÝ
'  ßßß
'012345
'----------------
REM Left or right
IF (OX% < AX) OR (OX% > AX + 4) THEN
        IsBulletCol% = 0
        EXIT FUNCTION
END IF
REM Above or below
IF (OY% < AY) OR (OY% > AY + 3) THEN
        IsBulletCol% = 0
        EXIT FUNCTION
END IF

IsBulletCol% = 1
END FUNCTION

FUNCTION IsShipCollision% (SX%, SY%, OX, OY, OW%, OH%)
'--------The character--------
'01234567
'   ÞºÝ
'   ÛþÛ
'  ÜÛÛÛÜ
' /  ±  \
'01234567
'------------------------

REM --If the object is to the left or right--
IF (OX + OW% < SX%) OR (OX > SX% + 6) THEN
        IsShipCollision% = 0
        EXIT FUNCTION
END IF

REM --If the object is above or below--
IF (OY + OH% < SY%) OR (OY > SY% + 3) THEN
        IsShipCollision% = 0
        EXIT FUNCTION
END IF

REM --If it's in a space--
IF (OY + OH% <= SY% + 1) AND (OX + OW% < SX% + 2) THEN
        IsShipCollision% = 0
        EXIT FUNCTION
END IF
IF (OY + OH% <= SY% + 1) AND (OX > SX% + 4) THEN
        IsShipCollision% = 0
        EXIT FUNCTION
END IF

IF (OY + OH% = SY% + 2) AND (OX + OW% < SX% + 1) THEN
        IsShipCollision% = 0
        EXIT FUNCTION
END IF
IF (OY + OH% = SY% + 2) AND (OX > SX% + 5) THEN
        IsShipCollision% = 0
        EXIT FUNCTION
END IF

IsShipCollision% = 1
END FUNCTION



    
This message has been edited by iorr5t on Dec 14, 2005 7:45 PM


 
 Respond to this message   
Response TitleAuthorDate
 Very nice Dec 2, 2005
 *Terrific! Hard to believe the graphics are just ASCII characters. Dec 3, 2005
 ASCII Space Game - Mark of genius, ComputerGhost Dec 5, 2005
  ASCII Space Game - Mark of genius, ComputerGhost Dec 5, 2005
   Nah. The modifications were needed. Dec 6, 2005
    Right, I take that to mean Dec 6, 2005
     Of course not! That would require me to correct my first version. Dec 6, 2005