learn Python. Create Games

User Tools

Site Tools



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 [ideas]
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> 
-More about list later or if you are interested here: http://​​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://​​horstjens/​ThePythonGameBook/​blob/​master/​python/​goblins/​|]] // 
->>>​mylist ​range(1000) +<html><script src="​http://​​github/​horstjens/​ThePythonGameBook/​blob/​master/​python/​goblins/​​footer=minimal"​></script></html>
->>>​mylist +
-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://​​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 !  +
-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 ​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://​​wiki/​Law_of_large_numbers|law of large numbers]] +
-====== flow chart ====== +
- +
-====== Code Discussion ====== +
- +
-===== comments ===== +
- +
- +
-====== Source Code on Github ====== +
- +
-To start this example you need: +
- +
- file  ^  in folder ​ ^  download ​ ^  comment ​ ^ +
- [[https://​​horstjens/​ThePythonGameBook/​raw/​master/​python/​|]]  |  ​python ​ |  Download the whole Archive with all files from Github: ​ \\  https://​​horstjens/​ThePythonGameBook/​archives/​master ​ |  version for python2.x | +
- +
- +
-\\ +
-===== python 2.x ===== +
- +
- +
- +
-View/​Edit/​Download the file directly in Github: https://​​horstjens/​ThePythonGameBook/​blob/​master/​python/​  +
- +
-//click reload in your browser if you see no code here:// +
-<​html>​ +
- <​script src="​http://​​github/​horstjens/​ThePythonGameBook/​blob/​master/​python/​">​ +
- </​script></​html>​ +
- +
-[[:​en:​python:​step001| ← previous]] ^ [[en:​python:​start| ↑ Overview]] ^ [[:​en:​python:​step003| → next ]] +
-====== Comment this Page ====== +
-~~DISQUS~~ +
-\\ +
/var/www/horst/ · Last modified: 2014/01/09 11:07 (external edit)