![]() |
||||
|
||||
|
« Linux on Dell Precision M90 - Part VII: Peripherals | ChronoPay Payment Solutions now HACKER SAFE » |
More OOP in Python
by: crystalattice - Jun 23, 2006
Here is another Python module I just finished. I'm learning how to use classes and other Object Oriented Programming (OOP) ideas vs. my old way of thinking using functions. At first it was extremely difficult to think in OO ways; the first time I tried to create a character-creator program I got about halfway before I got confused. This time it went easier, most likely because I revised what was needed for a basic character and designed for that. Plus, I didn't just try to pull over my procedural-based modules and make it work; I rewrote the code in a more OO way and had many fewer errors this time. (One of the benefits of coding in Python, whether it will be your final code or if you use it to "flesh-out" your ideas before you write it in C++, Java, etc., is that you don't have to wait for a code-compile-debug cycle. The largest parts of this module [attribute generation and skill selection] probably took me 3 hours each to code and troubleshoot. I don't know what the normal "turnaround" for you experienced programmers is, but that's quite an achievement for me. Especially considering I'm learning the language as I go.) The code below is a complete module for creating a generic character; you just have to have a copy of my dice rolling program to make it work. It's an interactive console program (GUI version coming later) that will let you choose a name, gender and skills and will output your name, gender, age, attributes, hit points, chosen skills, and a generic equipment list. Because I use the SPE IDE for my coding environment, some of the commented sections may not make sense. SPE uses these special comments to highlight sections, making it easier to mark off areas and jump to sections. Python Code Example: ###################################################################### #BasicCharacter.py # #Purpose: A revised version of the Marine character using classes. #Author: Cody Jackson #Date: 6/16/06 # #Copyright 2006 Cody Jackson #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 2 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. # #You should have received a copy of the GNU General Public License #along with this program; if not, write to the Free Software Foundation, #Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #---------------------------------------------------------------------- #Version 0.1 # Initial build ###################################################################### #TODO: make I/O operations (save to file) from dice_roller import multiDie class Character: def __init__(self): """Constructor to initialize each data member to zero.""" #---Personal info self.name = "" self.gender = "" self.age = 0 #---Attribute info self.attrib = 0 self.attrib_dict = {} self.setAttribute("str") self.setAttribute("intel") self.setAttribute("build") self.setAttribute("char") self.setAttribute("will") self.setAttribute("throw") self.setAttribute("mass") self.setAttribute("load") #---Hit point info self.hp_dict = {} self.body_part = 0 self.setHitPoints("head") self.setHitPoints("torso") self.setHitPoints("rarm") self.setHitPoints("larm") self.setHitPoints("lleg") self.setHitPoints("rleg") #---Skills info self.chosenSkills = {} self.subskills = {} self.skillPoints = 0 self.skillLevel = 0 self.skillChoice = 0 self.maximum = 0 self.subskillChoices = [] self.baseSkills = ["Armed Combat", "Unarmed Combat", "Throwing", "Small Arms", "Heavy Weapons", "Vehicle Weapons", "Combat Engineer", "First Aid", "Wheeled Vehicles", "Tracked Vehicles", "Aircraft", "Interrogation", "Swimming", "Reconnaissance", "Mechanic", "Forward Observer", "Indirect Fire", "Electronics", "Computers", "Gunsmith", "Supply", "Mountaineering", "Parachute", "Small Boats", "Harsh environments", "Xenomorphs", "Navigation", "Stealth", "Chemistry", "Biology"] #---Equipment list self.equipment = [] #---Get personal info---#008000#FFFFFF------------------------------------------ def setName(self): """Get the name of the character.""" self.name = raw_input("Please enter your character's name.\n") def setGender(self): """Get the gender of the character.""" while 1: self.gender = raw_input("Select a gender: 1=Male, 2=Female: ") if int(self.gender) == 1: self.gender = "Male" break elif int(self.gender) == 2: self.gender = "Female" break else: print "Invalid choice. Please choose 1 or 2." continue def setAge(self): """Calculate the age of character, between 18 and 45 years old.""" self.age = 15 + multiDie(3,2) #3d10 #---Create attributes---#008000#FFFFFF------------------------------------------ def setAttribute(self, attr): """Generate value for an attribute, between 2 and 20.""" #---Get secondary attributes if attr == "throw": self.attrib_dict[attr] = self.attrib_dict["str"] * 2 #meters elif attr == "mass": self.attrib_dict[attr] = (self.attrib_dict["build"] * 5) + 15 #kg elif attr == "load": self.attrib_dict[attr] = (self.attrib_dict["str"] + self.attrib_dict["build"]) #kg #---Get core attributes else: self.attrib_dict[attr] = multiDie(2, 2) #2d10 def setHitPoints(self, body_part): """Generate hit points for each body part, based on 'build' attribute.""" if body_part == "head": self.hp_dict[body_part] = self.attrib_dict["build"] elif body_part == "torso": self.hp_dict[body_part] = self.attrib_dict["build"] * 4 else: #arms & legs self.hp_dict[body_part] = self.attrib_dict["build"] * 2 #---Choose skills---#008000#FFFFFF---------------------------------------------- def printSkills(self): """Print list of skills available for a character.""" print "Below is a list of available skills for your character." print "Some skills may have specializations and will be noted when chosen." for i in range(len(self.baseSkills)): print " ", i, self.baseSkills[i], #5 spaces between columns if i % 3 == 0: print "\n" def setSkills(self): """Calculate skill points and pick base skills and levels. Skill points are randomly determined by dice roll. Certain skills have specialty areas available and are chosen separately.""" self.skillPoints = multiDie(2,2) * 10 while self.skillPoints > 0: #---Choose skill self.printSkills() print "\n\nYou have", self.skillPoints, "skill level points available." self.skillChoice = int(raw_input("Please pick a skill: ")) self.pick = self.baseSkills[self.skillChoice] #Chosen skill print "\nYou chose", self.skillChoice, self.baseSkills[self.skillChoice], "." #---Determine maximum skill level if self.skillPoints > 98: self.maximum = 98 else: self.maximum = self.skillPoints #---Choose skill level print "The maximum points you can use are", self.maximum, "." self.skillLevel = int(raw_input("What skill level would you like? ")) if self.skillLevel > self.skillPoints: #See if level chosen exceeds points available print "Sorry, you don't have that many points." continue self.chosenSkills[self.pick] = self.skillLevel #Chosen skill level self.skillPoints -= self.skillLevel #Decrement skill points #print self.skillPoints, self.chosenSkills #debug #---Pick specialty if self.skillLevel >= 20: #Minimum level for a specialty self.pickSubSkill(self.pick) def pickSubSkill(self, skill): """If a base skill level is 20 or greater, a specialty may be available, depending on the skill. Chosen skill text string passed in as argument.""" self.skill = skill #---Set speciality lists if self.skill == "Armed Combat": self.subskillChoices = ["Blunt Weapons", "Edged Weapons", "Chain Weapons"] elif self.skill == "Unarmed Combat": self.subskillChoices = ["Grappling", "Pummeling", "Throttling"] elif self.skill == "Throwing": self.subskillChoices = ["Aerodynamic", "Non-aerodynamic"] elif self.skill == "Small Arms": self.subskillChoices = ["Flamer", "Pulse Rifle", "Smartgun", "Sniper rifle", "Pistol"] elif self.skill == "Heavy Weapons": self.subskillChoices = ["PIG", "RPG", "SADAR", "HIMAT", "Remote Sentry"] elif self.skill == "Vehicle Weapons": self.subskillChoices = ["Aircraft", "Land Vehicles", "Water Vehicles"] elif self.skill == "Combat Engineer": self.subskillChoices = ["Underwater demolitions", "EOD", "Demolitions", "Land structures", "Vehicle use", "Bridges"] elif self.skill == "Aircraft": self.subskillChoices = ["Dropship", "Conventional", "Helicopter"] elif self.skill == "Swimming": self.subskillChoices = ["SCUBA", "Snorkel"] elif self.skill == "Mechanic": self.subskillChoices = ["Wheeled", "Tracked", "Aircraft"] elif self.skill == "Electronics": self.subskillChoices = ["Radio", "ECM"] elif self.skill == "Computers": self.subskillChoices = ["Hacking", "Programming"] elif self.skill == "Gunsmith": self.subskillChoices = ["Small Arms", "Heavy Weapons", "Vehicles"] elif self.skill == "Parachute": self.subskillChoices = ["HALO", "HAHO"] elif self.skill == "Harsh Environments": self.subskillChoices = ["No atmosphere", "Non-terra"] else: return self.statement(self.skill) for i in range(len(self.subskillChoices)): print i, self.subskillChoices[i] self.choice = int(raw_input()) if self.choice == -1: #Specialization not desired return else: #Speciality chosen print "You chose the", self.subskillChoices[self.choice], "specialty.\n\ It has an initial skill level of 10." self.subskills[self.subskillChoices[self.choice]] = 10 print self.subskills return def statement(self, skill): """Prints a generic statement for choosing a skill specialty.""" self.skill = skill print "\n", self.skill, "has specializations. If you desire to specialize in\ a field,\nplease choose from the following list. Enter -1 if you don't want a\n\ specialization.\n" #---Equipment access methods---#008000#FFFFFF----------------------------------- def setEquipment(self, item): self.equipment.append(item) def getEquipment(self): print self.equipment def test(): person = Character() person.setName() person.setGender() person.setAge() person.setSkills() person.setEquipment("Rucksack") person.setEquipment("Knife") person.setEquipment("Flashlight") print "\nName = ", person.name print "Gender = ", person.gender print "Age = ", person.age for key in person.attrib_dict.keys(): print key, person.attrib_dict[key] for key in person.hp_dict.keys(): print key, person.hp_dict[key] print person.chosenSkills print person.subskills person.getEquipment() if __name__ == "__main__": test()
|
GIDNetwork Sites
Archives
Recent GIDBlog Posts
Recent GIDForums Posts
Contact Us
|
« Linux on Dell Precision M90 - Part VII: Peripherals | ChronoPay Payment Solutions now HACKER SAFE » |