Yesterday I finished up my first Python game; I made a post on it, but I'll duplicate the code here. It's not particularly spectacular; it's a Python version of the classic "Hunt the Wumpus"; a classic of microcomputers in the 70s. Maybe next I'll go for a remake of Hamurabi.
"""Hunt the Wumpus - a simple game in PythonMy first Python program."""import sysimport randomclass Game: "Hunt the Wumpus Game Class" # The cave map CAVES = { "A":["B","E","F"], "B":["A","C","H"], "C":["B","D","J"], "D":["C","E","L"], "E":["A","D","N"], "F":["A","G","O"], "G":["F","H","T"], "H":["B","G","I"], "I":["H","J","S"], "J":["C","I","K"], "K":["J","L","R"], "L":["D","K","M"], "M":["L","N","Q"], "N":["E","M","O"], "O":["F","N","P"], "P":["O","Q","T"], "Q":["M","P","R"], "R":["K","Q","S"], "S":["I","R","T"], "T":["G","P","S"] } output = sys.stdout.write; # start for the player player = "A" # the standard environment (will be randomised) wumpus = "T" NUM_PITS = 2 NUM_BATS = 2 pits = ["I","O"] # should be wiped by random positions bats = ["G","M"] # should also be wiped by random positions shots = 5 def __init__(self): pass def run(self): "Runs the game of Hunt the Wumpus" self.printWelcome() self.output("Do you need instructions (y/N)? ") if self.readInput() == "Y": self.printInstructions() loop = True while (loop): self.setEnvironment() self.mainLoop() self.output("Do you want to play another game (Y/n)? ") if self.readInput() == "N": loop = False self.output("Fare thee well, mighty hunter!\n") def mainLoop(self): "The main loop that runs the hunt" isGameActive = True # loop until we win, lose or quit while (isGameActive): self.output("\n") self.describeChamber() self.output("Do you want to (M)ove or (S)hoot? ") action = self.readInput() # get the input letter if action == "M": # MOVE self.output("Which chamber to move to (") # print the options of neighbours neighbours = self.CAVES[self.player] for chamber in neighbours[:-1]: self.output("%s, " % chamber) self.output("%s)? " % neighbours[-1]) chamber = self.readInput() if chamber in neighbours: self.player = chamber self.output("Tread carefully...\n") else: self.output("That's not a valid move...\n") elif action == "S": # SHOOT self.output("Which chamber to shoot into (") # print the options of neighbours neighbours = self.CAVES[self.player] for chamber in neighbours[:-1]: self.output("%s, " % chamber) self.output("%s)? " % neighbours[-1]) chamber = self.readInput() if chamber in neighbours: self.output("You fire your trusty blunderbuss! BLAM!!\n") self.shots = self.shots - 1 # was it a hit? if chamber == self.wumpus: self.output("THUWMP!! The wumpus has been slain!\nWell done, mighty hunter!\n") isGameActive = False else: if self.shots > 0: self.output("The echo of the shot cannons through the caverns\n") # should move the wumpus now self.output("You hear the wumpus flumphing about. It might have moved...\n") wumpus_choices = list(self.CAVES[self.wumpus]) wumpus_choices.append(self.wumpus) self.wumpus = random.choice(wumpus_choices) if self.shots > 1: self.output("You've got %d shots left\n" % self.shots) else: self.output("Last shot. Make it count!\n") else: self.output("AARGHH! You've caused a cave in!!\nRocks fall, everybody dies!!\n") isGameActive = False else: self.output("You can't shoot there, silly...\n") elif action == "Q": # QUIT self.output("Do you want to end this game? (y/N) ") if self.readInput == "Y": isGameActive = False # check to see if this room is safe moveLoop = isGameActive while moveLoop: moveLoop = False if self.player == self.wumpus: self.output("AARGHH!! You've bumped into the wumpus!\n") self.output("It seems the hunter is now the hunted... or rather, lunch.\n") isGameActive = False elif self.player in self.pits: self.output("AARGHH!! You've fallen into a bottomless pit!\n") self.output("When you fall into a bottomless pit, you die of starvation...\n") isGameActive = False elif self.player in self.bats: self.output("OH NO!! You've run into some giant bats!\n") self.player = random.choice(self.CAVES.keys()) self.output("They've carried you to Chamber %s. Hope it's not too dangerous...\n" % self.player) moveLoop = True def describeChamber(self): "Describes the players chamber" neighbours = self.CAVES[self.player] self.output("You are currently in Chamber %s.\n" % self.player) self.output("Passages lead to Chambers ") for cavern in neighbours[:-1]: self.output("%s, " % cavern) self.output("and %s.\n" % neighbours[-1]) # need to check for breezes, stenches and bat chatter chatter = False breeze = False stench = False if self.wumpus in neighbours: stench = True for cavern in self.pits: if cavern in neighbours: breeze = True for cavern in self.bats: if cavern in neighbours: chatter = True if stench: self.output("You smell a wumpus!\n") if chatter: self.output("You hear the chatter of bats.\n") if breeze: self.output("You feel a nearby breeze.\n") def printWelcome(self): "Prints the welcome message to the screen" self.output(" HUNT THE WUMPUS ".center(50, "-")) self.output("\n") def printInstructions(self): "Prints out the instructions for Hunt the Wumpus" self.output("""There's a wumpus loose in the underground caverns!As the great wumpus hunter, it is your job to hunt it down with your trusty blunderbuss!On your turn, you can move or shoot into one of three caverns.You have five shots with which to hunt the wumpus.You can sense when a wumpus is nearby by its tell-tale stench.Look out for pits; you'll feel a breeze when nearby.Also watch for the bats; they delight in randomly dropping hunters into caverns.Good luck, mighty hunter!"""); def readInput(self): "Reads in a line of imput, and returns the first character (all that's needed for the game)" i = sys.stdin.readline() return i[0].upper() def setEnvironment(self): """Sets the environment: the player to pos. A, and randomise everything else Random position of the wumpus Random bats (for the number of the caves) Random pits (for the number of pits) """ cave_list = self.CAVES.keys() self.player = "A" # remove the player position from the list cave_list.remove("A") self.wumpus = random.choice(cave_list) num_random_pos = self.NUM_PITS + self.NUM_BATS random_list = random.sample(cave_list, num_random_pos) # need to make sure nothing is in the same pos to begin with self.pits = random_list[:self.NUM_PITS] self.bats = random_list[-self.NUM_BATS:] self.shots = 5 if __name__ == "__main__": wumpusGame = Game(); wumpusGame.run() # run the main game function
I'm not completely happy with this current game, simple though it may be. I think my use of a class in there was inelegant; mostly because I was playing around with classes to get a feel of them. I haven't yet figured out the best way to think like a Python programmer.
Eventually I'll move onto something a bit more complicated; either I'll move to Python and graphics or I'll try to get a text control library like curses and/or wcurses up and running to make a rogue-like game.