Skip to content

Instantly share code, notes, and snippets.

@caligari87
Created May 13, 2021 17:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save caligari87/e5626d1ea4dd9fe5c0f8a98b6bb6de17 to your computer and use it in GitHub Desktop.
Save caligari87/e5626d1ea4dd9fe5c0f8a98b6bb6de17 to your computer and use it in GitHub Desktop.
A QB64 roguelike in 50 lines
NewGame: SCREEN 0: RANDOMIZE TIMER: WIDTH 80, 60: HP = 100: XP = 0: Level = 1: _FULLSCREEN
NewLevel:
CLS: NewCave = 0: Col = 40: Row = 30: TYPE MonDef: X AS INTEGER: Y AS INTEGER: END TYPE: DIM Monsters(15) AS MonDef: DIM SHARED K$
FOR X = 2 TO 79: FOR Y = 2 TO 59: COLOR 8: LOCATE Y, X: PRINT "#";: NEXT: NEXT
FOR X = 5 TO 76: FOR Y = 5 TO 56: COLOR 8: LOCATE Y, X: PRINT ".";: NEXT: NEXT
FOR i = 0 TO (80 * 60 / 8): COLOR 8: LOCATE INT(52 * RND + 5), INT(72 * RND + 5): PRINT "#";: NEXT: LOCATE 1, 40: PRINT "Step 1+"; i; " ": KEYDELAY 1
FOR i = 1 TO 5: FOR X = 5 TO 75: FOR Y = 5 TO 55
IF RND < .15 AND (SCREEN(Y - 1, X) = 35 OR SCREEN(Y + 1, X) = 35 OR SCREEN(Y, X + 1) = 35 OR SCREEN(Y, X - 1) = 35) THEN COLOR 8: LOCATE Y, X: PRINT "#";
IF SCREEN(Y, X) = 35 AND (SCREEN(Y - 1, X) = 46 AND SCREEN(Y + 1, X) = 46 AND SCREEN(Y, X + 1) = 46 AND SCREEN(Y, X - 1) = 46) THEN COLOR 8: LOCATE Y, X: PRINT ".";
IF RND < .005 AND SCREEN(Y, X) = 46 THEN COLOR 14: LOCATE Y, X: PRINT "*";
IF RND < .001 AND SCREEN(Y, X) = 46 THEN COLOR 7: LOCATE Y, X: PRINT "%";
NEXT: NEXT: LOCATE 1, 40: PRINT "Step 2+"; i; " ": KEYDELAY 1: NEXT
FOR i = 1 TO 15: monsterplaced = 0: DO: LOCATE INT(52 * RND + 5), INT(72 * RND + 5)
IF SCREEN(CSRLIN, POS(0)) = 46 THEN Monsters(i).X = POS(0): Monsters(i).Y = CSRLIN: monsterplaced = 1
LOOP UNTIL monsterplaced = 1: NEXT: _DISPLAY
DO: COLOR 15: LOCATE Row, Col: PRINT "@";: COLOR 7: LOCATE 1, 1: PRINT "Gold:"; Gold, "HP:"; HP, "Exp:"; XP; "/"; (4 + Level * 2), "Level:"; Level;
COLOR 7: LOCATE 60, 1: PRINT "Arrows = Move", , "t = Teleport (-5HP on failure)";: FOR i = 1 TO 15
IF XP >= (4 + Level * 2) THEN XP = XP - (4 + Level * 2): Level = Level + 1: HP = HP + (Level * 5)
IF Monsters(i).X <> -1 AND RND < .75 THEN
COLOR 8: LOCATE Monsters(i).Y, Monsters(i).X: PRINT ".";: NewMonX = Monsters(i).X: NewMonY = Monsters(i).Y
IF Monsters(i).X < Col AND SCREEN(Monsters(i).Y, Monsters(i).X + 1) = 46 THEN Monsters(i).X = Monsters(i).X + 1
IF Monsters(i).X > Col AND SCREEN(Monsters(i).Y, Monsters(i).X - 1) = 46 THEN Monsters(i).X = Monsters(i).X - 1
IF Monsters(i).Y < Row AND SCREEN(Monsters(i).Y + 1, Monsters(i).X) = 46 THEN Monsters(i).Y = Monsters(i).Y + 1
IF Monsters(i).Y > Row AND SCREEN(Monsters(i).Y - 1, Monsters(i).X) = 46 THEN Monsters(i).Y = Monsters(i).Y - 1
Moved: COLOR 2: LOCATE Monsters(i).Y, Monsters(i).X: PRINT CHR$(142);
END IF: NEXT: _DISPLAY: COLOR 8: LOCATE Row, Col: PRINT ".";: KEYDELAY 0: NewCol = Col: NewRow = Row
IF K$ = CHR$(0) + "K" THEN NewCol = Col - 1
IF K$ = CHR$(0) + "M" THEN NewCol = Col + 1
IF K$ = CHR$(0) + "P" THEN NewRow = Row + 1
IF K$ = CHR$(0) + "H" THEN NewRow = Row - 1
IF K$ = "t" THEN COLOR 7: LOCATE INT(52 * RND + 5), INT(72 * RND + 5): NewCol = POS(0): NewRow = CSRLIN: IF SCREEN(CSRLIN, POS(0)) <> 46 THEN HP = HP - 5
IF SCREEN(NewRow, NewCol) = 142 THEN
XP = XP + 1: IF RND > Level * .02 THEN HP = HP - INT(20 * RND + Level)
COLOR 8: LOCATE NewRow, NewCol: PRINT ".";: FOR i = 1 TO 15: IF Monsters(i).X = NewCol AND Monsters(i).Y = NewRow THEN Monsters(i).X = -1
NEXT: END IF
IF SCREEN(NewRow, NewCol) = 42 THEN Gold = Gold + INT((15 * RND + 1) * RND + 1): COLOR 8: LOCATE NewRow, NewCol: PRINT ".";
IF SCREEN(NewRow, NewCol) = 37 THEN XP = XP + 5: NewCave = 1: COLOR 8: LOCATE NewRow, NewCol: PRINT ".";
IF SCREEN(NewRow, NewCol) = 46 THEN Col = NewCol: Row = NewRow ELSE NewRow = Row: NewCol = Col
LOOP WHILE (K$ <> CHR$(27)) AND HP > 0 AND NewCave = 0: IF HP <= 0 THEN COLOR 12: LOCATE 29, 31: PRINT "--== Game Over! ==--"
IF NewCave = 1 THEN COLOR 9: LOCATE 30, 35: PRINT "Next Cave!";: _DISPLAY: KEYDELAY 0: GOTO NewLevel
COLOR 7: LOCATE 30, 33: PRINT "Play Again?(y/n)": _DISPLAY
DO: KEYDELAY 0: IF K$ = "y" THEN GOTO NewGame
IF K$ = "n" THEN EXIT DO
LOOP WHILE K$ <> "y" AND K$ <> "n"
SYSTEM
SUB KEYDELAY (debug)
IF debug = 1 THEN EXIT SUB
K$ = "": DO: K$ = INKEY$: LOOP WHILE K$ = ""
END SUB
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment