-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPython.DungeonGame2.py
255 lines (225 loc) · 6.46 KB
/
Python.DungeonGame2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
"""
Year 2017 (ammendments made 10/2018)
Author Kieran
A simple dungeon game that runs in the command line, avoid the monsters to get
to the door.
"""
import sys
import random
level = 1
# Set gameEnd to False for experimental, endless gamemode. Note there will be
# graphics glitches!
gameEnd = True
def spawn(size):
"""
Method spawn
Inputs [none]
Outputs spawnX, spawnY: integers
This method gives the player random coordinates
"""
# Use SystemRandom
systemRandom = random.SystemRandom()
spawnY = systemRandom.randint(0, size)
spawnX = systemRandom.randint(0, size)
return spawnX, spawnY
def movement(playerX, playerY, size):
"""
Method movement
Inputs playerX, playerY, size: integers
outputs playerX, playerY: integers
This method updates the player position based on the user input
"""
movement = input(
"\nIn which direction would you like to move? (Use WASD) \n>>>")
movement = movement.upper()
try:
movement = movement[0]
except BaseException:
print()
if movement == "D":
playerX += 1
if playerX > size:
playerX = size
if movement == "A":
playerX -= 1
if playerX < 0:
playerX = 0
if movement == "S":
playerY += 1
if playerY > size:
playerY = size
if movement == "W":
playerY -= 1
if playerY < 0:
playerY = 0
print("Your new position is ({},{})".format(playerX, playerY))
return playerX, playerY
def moveMonster(monsters, size):
# Use SystemRandom
systemRandom = random.SystemRandom()
selection = systemRandom.randint(0, len(monsters) - 1)
monsterX = monsters[selection][0]
monsterY = monsters[selection][1]
move = systemRandom.randint(0, 3)
if move == 0:
monsterX += 1
if monsterX > size:
monsterX = size
if move == 1:
monsterY += 1
if monsterY > size:
monsterY = size
if move == 2:
monsterX -= 1
if monsterX < 0:
monsterX = 0
if move == 3:
monsterY -= 1
if monsterY < 0:
monsterY = 0
return monsterX, monsterY, selection
def checkSpawns(playerX, playerY, monsters, doorX, doorY, monsterNo):
"""
Method checkSpawns
Inputs playerX, playerY, doorX, doorY, monsterNo: integers; monsters: array
Outputs success: integer
This method checks that the spawns do not clash. Returns 1 if they do not, 0 if
they do.
"""
for m in range(monsterNo):
monsterX = monsters[m][0]
monsterY = monsters[m][1]
if playerX == monsterX:
if playerY == monsterY:
return 0
if doorX == monsterX:
if doorY == monsterY:
return 0
for m2 in range(m + 1, monsterNo):
monster2X = monsters[m2][0]
monster2Y = monsters[m2][1]
if monster2X == monsterX:
if monster2Y == monsterY:
return 0
if playerX == doorX:
if playerY == doorY:
return 0
return 1
def collisionMonster(playerX, playerY, monsters, monsterNo):
"""
Method collisionMonster
Inputs playerX, playerY, monsters, monsterNo: integers
Outputs success, level: integers
This method checks for collisions with any monster on the board. If there is a
collision, 1 is returned along with the current level (0 for no collisions)
"""
for m in range(monsterNo):
monsterX = monsters[m][0]
monsterY = monsters[m][1]
if playerX == monsterX:
if playerY == monsterY:
print("\nYou were consumed by the monster...")
level = 1
return 1, level
return 0, level
def collisionDoor(playerX, playerY, doorX, doorY, level):
"""
Method collisionDoor
Inputs playerX, playerY, doorX, doorY, level: integers
Outputs success, level: integers
This method checks for collisions with the door on the board. If there is a
collision, 1 is returned along with the current level (0 for no collision)
"""
if playerX == doorX:
if playerY == doorY:
print("\nYou made it out of the dungeon alive!")
level += 1
return 1, level
return 0, level
def render(playerX, playerY, doorX, doorY, monsters, size, monsterNo):
"""
Method render
Inputs playerX, playerY, doorX, doorY, monsters,size,monsterNo: integers
Outputs [none]
This method displays the board
"""
print()
print(" ", end="")
for q in range(size + 1):
for _gap in range(3 - len(str(q))):
print(" ", end="")
print("", q, end="")
print()
for y in range(size + 1):
print("", y, end="")
for x in range(size + 2):
print("|", end="")
spaces = 3
if x == playerX and y == playerY:
print("P", end="")
spaces -= 1
elif x == doorX and y == doorY:
print("D", end="")
spaces -= 1
else:
for m in range(monsterNo):
monsterX = monsters[m][0]
monsterY = monsters[m][1]
if x == monsterX and y == monsterY:
print("M", end="")
spaces -= 1
for _space in range(spaces):
print(" ", end="")
print()
def game(level, gameEnd):
"""
Mehtod game
Inputs level, gameEnd: integers
Outputs [none]
This method is the main method and calls the other functions
"""
if level > 8 and gameEnd:
print("Well done, you have beat the dungeon!")
sys.exit()
canContinue = 0
death = 0
win = 0
monsters = []
print("\nLevel:", level, end="\n\n")
size = level + 1
while canContinue == 0:
monsters = []
playerX, playerY = spawn(size)
doorX, doorY = spawn(size)
monsterNo = int(level**1.2)
for _monster in range(monsterNo):
monsterX, monsterY = spawn(size)
monsterPos = []
monsterPos.append(monsterX)
monsterPos.append(monsterY)
monsters.append(monsterPos)
canContinue = checkSpawns(
playerX,
playerY,
monsters,
doorX,
doorY,
monsterNo)
print("The {} is at ({},{})".format("player", playerX, playerY))
for m in range(monsterNo):
monsterX = monsters[m][0]
monsterY = monsters[m][1]
print("Monster {} is at ({},{})".format(m + 1, monsterX, monsterY))
print("The {} is at ({},{})".format("door", doorX, doorY))
render(playerX, playerY, doorX, doorY, monsters, size, monsterNo)
while death == 0 and win == 0:
playerX, playerY = movement(playerX, playerY, size)
monsterX, monsterY, selection = moveMonster(monsters, size)
monsters[selection][0] = monsterX
monsters[selection][1] = monsterY
death, level = collisionMonster(playerX, playerY, monsters, monsterNo)
if death == 0:
render(playerX, playerY, doorX, doorY, monsters, size, monsterNo)
win, level = collisionDoor(playerX, playerY, doorX, doorY, level)
game(level, gameEnd)
game(level, gameEnd)