Simplest RPG, in Python

This is a small text-based Role-Playing Game that I wrote while learning Python. The game is the simplest RPG adventure I could think of, that maintains the essential traits of the classics.

The more I dive into Python the more I understand the work done to create a language that is easy by design. I tried to apply some non-trivial functionalities such as:

Class inheritance (Enemy and Player inherit from Character)

Function pointers (Commands contains a dictionary of functions)

String manipulation (creating output and parsing input)

I think that this game can be a clean example to understand how to apply these aspects in a Python program.

To play the game

Install Python (installed by default in many Linux distributions, see http://www.python.org/download/ for other platforms) Copy the following code into a file called (for example) rpg.py In Linux, run “ python rpg.py ” from the command line in the directory of the rpg.py file. In Windows, open the file with Python. Enjoy! Quit and get a life.

from random import randint class Character: def __init__(self): self.name = "" self.health = 1 self.health_max = 1 def do_damage(self, enemy): damage = min( max(randint(0, self.health) - randint(0, enemy.health), 0), enemy.health) enemy.health = enemy.health - damage if damage == 0: print "%s evades %s's attack." % (enemy.name, self.name) else: print "%s hurts %s!" % (self.name, enemy.name) return enemy.health <= 0 class Enemy(Character): def __init__(self, player): Character.__init__(self) self.name = 'a goblin' self.health = randint(1, player.health) class Player(Character): def __init__(self): Character.__init__(self) self.state = 'normal' self.health = 10 self.health_max = 10 def quit(self): print "%s can't find the way back home, and dies of starvation.

R.I.P." % self.name self.health = 0 def help(self): print Commands.keys() def status(self): print "%s's health: %d/%d" % (self.name, self.health, self.health_max) def tired(self): print "%s feels tired." % self.name self.health = max(1, self.health - 1) def rest(self): if self.state != 'normal': print "%s can't rest now!" % self.name; self.enemy_attacks() else: print "%s rests." % self.name if randint(0, 1): self.enemy = Enemy(self) print "%s is rudely awakened by %s!" % (self.name, self.enemy.name) self.state = 'fight' self.enemy_attacks() else: if self.health < self.health_max: self.health = self.health + 1 else: print "%s slept too much." % self.name; self.health = self.health - 1 def explore(self): if self.state != 'normal': print "%s is too busy right now!" % self.name self.enemy_attacks() else: print "%s explores a twisty passage." % self.name if randint(0, 1): self.enemy = Enemy(self) print "%s encounters %s!" % (self.name, self.enemy.name) self.state = 'fight' else: if randint(0, 1): self.tired() def flee(self): if self.state != 'fight': print "%s runs in circles for a while." % self.name; self.tired() else: if randint(1, self.health + 5) > randint(1, self.enemy.health): print "%s flees from %s." % (self.name, self.enemy.name) self.enemy = None self.state = 'normal' else: print "%s couldn't escape from %s!" % (self.name, self.enemy.name); self.enemy_attacks() def attack(self): if self.state != 'fight': print "%s swats the air, without notable results." % self.name; self.tired() else: if self.do_damage(self.enemy): print "%s executes %s!" % (self.name, self.enemy.name) self.enemy = None self.state = 'normal' if randint(0, self.health) < 10: self.health = self.health + 1 self.health_max = self.health_max + 1 print "%s feels stronger!" % self.name else: self.enemy_attacks() def enemy_attacks(self): if self.enemy.do_damage(self): print "%s was slaughtered by %s!!!

R.I.P." %(self.name, self.enemy.name) Commands = { 'quit': Player.quit, 'help': Player.help, 'status': Player.status, 'rest': Player.rest, 'explore': Player.explore, 'flee': Player.flee, 'attack': Player.attack, } p = Player() p.name = raw_input("What is your character's name? ") print "(type help to get a list of actions)

" print "%s enters a dark cave, searching for adventure." % p.name while(p.health > 0): line = raw_input("> ") args = line.split() if len(args) > 0: commandFound = False for c in Commands.keys(): if args[0] == c[:len(args[0])]: Commands[c](p) commandFound = True break if not commandFound: print "%s doesn't understand the suggestion." % p.name """ Copyright 2010 Francesco Balducci This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. See <http://www.gnu.org/licenses/> for a copy of the GNU General Public License. """