ThePythonGameBook

learn Python. Create Games

User Tools

Site Tools


en:python:goblins:step002

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
en:python:goblins:step002 [2011/12/11 17:33]
Horst JENS
en:python:goblins:step002 [2017/09/03 16:21] (current)
Horst JENS
Line 1: Line 1:
-[[:en:python:step001| ← previous]] [[en:python:start| ↑ Overview]] [[:en:python:step003| → next ]] +===== 002 values ===== 
-====== Step 002 - thousand goblin dice duels ======+[[step001|←]] ​ | step 002 [[start|↑]] ​ ​|  ​[[step003|→]] ​ |
  
-If you tried **balancing** the values for the goblins Stinky and Grunty in [[en:​python:​step001|step 001]] you will feel the law of [[wp>Law_of_large_numbers]]: If Stinky wins 5 times in a row over Grunty, that does not proof that Stinky'​s values are superior over Grunty. Maybe Stinky has a streak of luck or Grunty'​s random numbers are specially unlucky. Only if you test a game (several) thousands times you can start to make qualified statements.+[<>]
  
-Well, pushing thousand times the "run program"​ button on my text editor is not my idea of fun. (Maybe later if the program becomes better). Good thing that there is a python function to repeat a given task a many times: the **for loop**. ​+=== changing variables ===
  
-The **for loop** **iterates** over given **list**. If you give the **for loop** a list with thousand items to iterate over, it will do the same task thousand times. But where to get a list with thousand items ? Lucky for you, python provides also a function to generate lists: the **range** function (and the **xrange** function).+During ​game of goblin dice duel, each hit on the head will decrease ​the victim'​s remaining hitpoints.
  
-===== playing with python'​s ​direct mode =====+Let'​s ​assume that Stinky swings his club and hit Grunty over the head so that Grunty looses one hitpoint ( or hitting him for 1 point of damage).
  
-This is a good time to play around with python's direct mode. If you start the editor **Idle** (shippedas you know, together with python), you are by default in the direct mode. If you -like me- dislike idle (inner values aside, the thing is simply ugly) you can open a terminal and enter <​code>​python</​code>​. The result in both cases is that you are in python'​s **direct mode**, symbolized ​by the 3 leading "​greater than" signs: <​code>>>></​code>​ +In python, ​this is done by writing either:
- +
-As soon as you enter some commands and press the <​key>​ENTER</​key>​ python will try to interpret the command and print the result. This is handy to try out functions you do not know by heart, to access python'​s help system with the **help()** command or -if you are really bored- create some infinite loops like that one:+
 <code python> <code python>
-while True: +hitpointsGrunty = hitpointsGrunty - 1
-   print "​it'​s never boring with you"+
 </​code>​ </​code>​
- +or more common because less to type:
-==== list ==== +
-Let's use python'​s direct mode to learn about list's and the **range** function. A list in python is a comma seperated list of items, starting and ending with square brackets. If you want to put text strings in the list you need quotes:+
 <code python> <code python>
->>>​shoppinglist ​["​banana","​apple",​555,​ 3.13]+hitpointsGrunty -1
 </​code>​ </​code>​
-The interesting thing about list's is that each list item gets an number, starting with 0. You can access an list item by it's number: 
-<code python> 
->>>​shoppinglist[0] 
-'​banana'​ 
->>>​shoppinglist[2] 
-555 
-</​code>​ 
-More about list later or if you are interested here: http://​www.swaroopch.com/​notes/​Python_en:​Data_Structures 
  
-==== range ====+In both cases, the python interpreter will first calculate the right side of the equation (hitpointsGrunty - 1) and assign the result to the variable on the left side of the equation....hitpointsGrunty. The old value of the variable is overwritten.
  
-If you just want to have a list with 1000 items in it, all you need to type is+=== source code === 
-<code python> +//click reload on your browser if you see no source code here or visit [[https://​github.com/​horstjens/​ThePythonGameBook/​blob/​master/​python/​goblins/​slowgoblins002.py|Github.com]] // 
->>>​mylist ​range(1000) +<html><script src="​http://​gist-it.appspot.com/​github/​horstjens/​ThePythonGameBook/​blob/​master/​python/​goblins/​slowgoblins002.py?​footer=minimal"​></script></html>
->>>​mylist +
-</code>+
  
-You will get a list starting with "​[0,​1,​2,​3,​4,"​ and ending with "​997,​998,​999] 
  
-==== for loop ====+=== test === 
 +Tricky question: How many hitpoints has Grunty left now ?
  
-You can iterate over this list with a **for loop** (and break out of it using the **break** command): +Find out by either coding in your pyhton shell or online (just click on the graphic): \\ 
-Write this little program in the direct ​mode or in your python ​text editor:+[[http://​www.pythontutor.com/​visualize.html#​code=hitpointsStinky+%3D+22%0AhitpointsGrunty+%3D+43%0AhitpointsGrunty+-%3D+1&​mode=display&​cumulative=true&​heapPrimitives=true&​drawParentPointers=false&​textReferences=false&​showOnlyOutputs=false&​py=3&​curInstr=3|{{:​en:​python:goblins:​slowgoblins002.png|click on the graphic}}]]
  
-<code python> 
->>>​ for x in range(1000):​ 
- print x 
  
-</code+The answer is 42((If you don't laugh now, you should read [[wp>The_Hitchhiker%27s_Guide_to_the_Galaxy_(novel)|this book]])) 
-Note that all **indented** lines after the for loop will be repeated for each item in the list and also note that the for loop line ends with a colon <​key>:</​key>​.+=== inspecting variables ===
  
-It is now time to leave python'​s direct mode (if you work in a terminal, press <​key>​CTRL</​key>​ and <​key>​d</​key>​ and go back to your "real" ​python text editor. +If you click the grey "forward" ​button on the online example above you can see how the values ​of the variables change each timeIF you work with the python shell, you must tell python to show the value of a variable by typing ​the variable name:
- +
-====== Code discussion ====== +
-===== functions ===== +
- +
-So far you know 2 functions: ​the **randint()** function ​of the **random** module and now the **range()** functionsYou know you are looking at a function if you see a pair of round brackets at the end of the function name. +
- +
-Like in every other programming language, you can **def**ine your own functions. Let us do that: Let's make a function out of the programm 001_goblindice.py !  +
-This is actually very simple: You just write those lines in text editor (or copy the whole example from Github, see below):+
  
 +Do this in the python shell:
 <code python> <code python>
-#​!/​usr/​bin/​env python +>>>​hitpointsGrunty
-# -*- coding: utf-8 -*- +
-#... +
-import random +
- +
-#... +
- +
-def combat(): +
- """​a function that let 2 goblins fight and return the winners name"""​ +
-     +
- # define Grunty and Stinky. Note that variables are lowercase +
- stinky_hitpoints = 50 # Stinky is weak but smart +
- grunty_hitpoints = 60 # Srunty is strong but dumb+
 </​code>​ </​code>​
  
-below the variable assignments comes the whole rest of 001_goblindice.py ​complete with the while loopbut additional indented because it is now part of the **combat()** function. See below at the github code to get an overview. Note that the first line after **def combat():** is a docstring in triple quotes. It's like a comment, but python'​s help function can make more use of it.+Lateryou will learn other methods to inspect variableslike the print() function ​and how to work with debuggers.
  
-===== Calling a function many times ===== +Generally, if you want to print the value of a variable, ​you code:
- +
-To call the combat function 1000 times you could write:+
 <code python> <code python>
-   for x in range(1000):​ +print(hitpointsGrunty)
-       ​combat()+
 </​code>​ </​code>​
  
-But i will instead write another function to do that: +[[step001|]]  | step 002 [[start|]]  |  [[step003|→]] ​ |
- +
-<code python>​ +
-def many_games(number_of_fights=1000):​ +
- """​calls the combat function 1000 times"""​ +
- stinky_wins = 0 +
- grunty_wins = 0  +
- for fight in range(number_of_fights):​ +
- print "fight number %i" % fight +
- winner = combat() +
- if winner == "​Grunty":​ +
- grunty_wins += 1 +
- else: +
- stinky_wins += 1 +
- print "​==============================="​ +
- print " * * * end results * * * " +
- print "​==============================="​ +
- print "​Grunty wins: %i  vs. Stinky wins: %i" % (grunty_wins,​ stinky_wins) +
-</​code>​ +
- +
-Note that this **many_games()** function has a so called **default parameter** inside it's parantheses:​ **number_of_fights=1000**. That means that if you code <code python>​many_games():</​code>​ the computer notices that there is no value inside the round brackets and default to 1000. +
- +
-If you rather want to test out one billion games you have to code: +
-<code python>​ +
-many_games(1000000) +
-</​code>​ +
-===== calling the calling function ===== +
-the last line in this program actually calls the many_games() function: +
- +
-<code python>​ +
-# start ! +
-many_games() # enter another number in the parantheses +
-</​code>​ +
- +
-====== ideas ====== +
- +
-Now you really have a tool to balance out the values of Stinky and Grunty ! Try to give different values for hitpoints, min_damage and maxdamage while still keeping the game fair (nearly exact 50%:50% win chance). Try out your values with large number of games. Obey the [[http://​en.wikipedia.org/​wiki/​Law_of_large_numbers|law of large numbers]] +
- +
- +
- +
-====== Source Code on Github ====== +
- +
-To start this example you need: +
- +
- file  ^  in folder ​ ^  download ​ ^  comment ​ ^ +
- [[https://​github.com/​horstjens/​ThePythonGameBook/​raw/​master/​python/​001_goblindice.py|002_goblindice.py]]  |  ​python ​ |  Download the whole Archive with all files from Github: ​ \\  https://​github.com/​horstjens/​ThePythonGameBook/​archives/​master ​ |  version for python2.x | +
- +
- +
-\\ +
-===== python 2.x ===== +
- +
- +
- +
-View/​Edit/​Download the file directly in Github: https://​github.com/​horstjens/​ThePythonGameBook/​blob/​master/​python/​002_goblindice.py  +
- +
-//click reload in your browser if you see no code here:// +
-<​html>​ +
- <​script src="​http://​gist-it.appspot.com/​github/​horstjens/​ThePythonGameBook/​blob/​master/​python/​002_goblindice.py">​ +
- </​script></​html>​ +
- +
-[[:​en:​python:​step001| ← previous]] ^ [[en:​python:​start| ↑ Overview]] ^ [[:​en:​python:​step003| → next ]] +
-====== Comment this Page ====== +
-~~DISQUS~~ +
-\\ +
/var/www/horst/thepythongamebook.com/data/attic/en/python/goblins/step002.1323621230.txt.gz · Last modified: 2014/01/09 11:07 (external edit)