Laboration 0 - Repetition
Introduktion
Syftet med laborationen är att ni ska repetera era Python-kunskaper. Detta ska ni göra genom att bygga en väldigt enkelt variant av spelet Pokémon, där användaren väljer en pokemon och kan slåss mot andra tränares pokémon.
Del 1 - Pokémon
Vi ska i denna laboration utgå ifrån en nerbantad version av spelet, och vi nöjer oss med att ha 4st pokémon i vårt spel. De pokemon som ska finnas är:
- Charmander
- Bulbasaur
- Squirtle
- Pikachu
Varje pokémon har i sin tur egenskaperna HP (health points), damage (hur mycket skapa de gör vid en attack), weakness (vilken annan typ av pokémon de är svaga mot). Vi utgår från denna JSON-fil i laborationen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"Charmander": {
"type": "fire",
"damage": 15,
"hp": 75,
"weakness": "water"
},
"Bulbasaur": {
"type": "grass",
"damage": 12,
"hp": 87,
"weakness": "fire"
},
"Squirtle": {
"type": "water",
"damage": 13,
"hp": 79,
"weakness": "electric"
},
"Pikachu": {
"type": "electric",
"damage": 18,
"hp": 68,
"weakness": "grass"
}
}
Del 2 - Val av pokémon
När man startar spelet ska användaren få välja pokémon att strida med, samt döpa pokémonen till valfritt namn.
Det är här viktigt att användaren bara kan välja en av de som finns i JSON-dokumentet ovan, så kontrollera att det inmatade namnet på den önskade pokémonen finns med. Detta för att vi (ev.) enkelt ska kunna lägga till en pokémon i JSON-dokumentet, utan att vi behöver ändra i vår källkod.
Skulle användaren skriva in ett felaktivt namn på typen av pokémon ska tips på vilka pokémon som finns att välja på. Exempellayout:

Del 3 - Meny
Vi ska nu bygga en meny där man ska kunna göra tre saker:
- Kunna duellera mot en annan tränare (datorn)
- Kunna byta ut sin pokémon
- Avsluta programmet
Det skulle kunna se ut såhär:

Del 4 - Att duellera
Nu till spelets huvudfunktion! Dags att bygga så att vi kan tävla med vår pokemon. Det finns tre viktiga aspekter att tänka på när det kommer till duelleringen:
hp, hur mycket liv en pokémon hardamage, hur mycket skada en pokémon gör vid varje attackweakness, den svaget som en pokémon har
En fight ska följa följande struktur:
- Det slumpas fram vilken pokémon som motståndaren (datorn) har
- Det
hpsom motståndarens pokémon har ska bara dess bas-hp+/- 50%. Alltså kan Charmandershpvariera mellan37.5&112.5
- Det
- Det ska slumpas fram vem som får göra första attacken
- Attackerna ska efter detta ske varannan gång
- Varje attacks skada ska baseras på dess pokémons
damage+/- 50%. Alltså kan Charmandersdamagevariera mellan7.5&22.5- Om den pokémon man attackerar har som svaghet den typ som attackerar, så addeas ytterliggar
25%till skadan. T.ex. om:- Charmander attackerar Bulbasaur
- Bulbasaur attackerar Pikachu
- Squirtle attackerar Charmander
- Pikachu attackerar Squirtle
- Om den pokémon man attackerar har som svaghet den typ som attackerar, så addeas ytterliggar
- Duellen ska fortsätta tills en av pokémonen har 0 i
hp - Under duelleringens gång ska följande rapporteras till användaren
- Aktuell ställning i
hpför samtliga Pokémon i matchen - Den attackerandes pokémon skada på den försvarande pokémon
- För att skapa lite spänning ska man vänta 0.5s mellan varje attack
- Aktuell ställning i
- Slutligen ska vinnaren presenteras.
Varje attack ska ta 0.5s så att det blir lite spänning i det hela. Använda funktionen time.sleep() för att åstakomma detta.
Exempel på hur detta kan se ut:

Del 5 - Byte av pokémon
Möjliggör för användaren att byta pokémon genom ett menyalternativ. Exempel på hur detta kan se ut:

Del 6 - Statistik
Gör det möjligt för användaren att se statistik över vinster / förluster i spelet. Det är upp till dig hur avancerad du vill göra detta, men som minimum ska antal vinster & antal förluster visas.
Del 7 - Bonus: Fler pokémon
Om ditt program nu är implementerat på korrekt sätt så är det enkelt att lägga till fler pokémon i JSON-filen, och dit program hanterar dessa automatiskt! Testa först med den utökade JSON-filen nedan, och passa sedan öven på att lägga till dina egna typer! =)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{
"Charmander": {
"type": "fire",
"damage": 15,
"hp": 75,
"weakness": "water"
},
"Bulbasaur": {
"type": "grass",
"damage": 12,
"hp": 87,
"weakness": "fire"
},
"Squirtle": {
"type": "water",
"damage": 13,
"hp": 79,
"weakness": "electric"
},
"Pidgey": {
"type": "flying",
"damage": 13,
"hp": 76,
"weakness": "fire"
},
"Rattata": {
"type": "ground",
"damage": 8,
"hp": 56,
"weakness": "grass"
},
"Zubat": {
"type": "poison",
"damage": 19,
"hp": 56,
"weakness": "fire"
},
"Goldeen": {
"type": "Water",
"damage": 21,
"hp": 79,
"weakness": "electric"
},
"Pikachu": {
"type": "electric",
"damage": 18,
"hp": 68,
"weakness": "grass"
}
}
Exempellösning
Här finns en exempellösning
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
import random
import time
pokemons = {
"Charmander": {
"type": "fire",
"damage": 15,
"hp": 75,
"weakness": "water"
},
"Bulbasaur": {
"type": "grass",
"damage": 12,
"hp": 87,
"weakness": "fire"
},
"Squirtle": {
"type": "water",
"damage": 13,
"hp": 79,
"weakness": "electric"
},
"Pidgey": {
"type": "flying",
"damage": 13,
"hp": 76,
"weakness": "fire"
},
"Rattata": {
"type": "ground",
"damage": 8,
"hp": 56,
"weakness": "grass"
},
"Zubat": {
"type": "poison",
"damage": 19,
"hp": 56,
"weakness": "fire"
},
"Goldeen": {
"type": "Water",
"damage": 21,
"hp": 79,
"weakness": "electric"
},
"Pikachu": {
"type": "electric",
"damage": 18,
"hp": 68,
"weakness": "grass"
}
}
pokemon_name = ""
pokemon_type = ""
wins = 0
lost = 0
def app():
print("*" * 40)
print("Välkommen till Pokémon!")
print("*" * 40)
set_pokemon()
choice = False
while choice != "0":
print_menu()
choice = input("Ange val: ")
if choice == "1":
fight()
if choice == "2":
set_pokemon()
elif choice == "0":
print("*" * 40)
print("Good game!")
print("*" * 40)
exit()
print("\n")
def fight():
keys = list(pokemons.keys())
op = random.choice(keys)
opponent = pokemons[op]
opponent_damage = round(random.uniform(0.5, 1.5) * opponent["damage"])
opponent_life = round(random.uniform(0.5, 1.5) * opponent["hp"])
you_life = pokemons[pokemon_type]["hp"]
you_damage = pokemons[pokemon_type]["damage"]
print("Duell mellan:")
print("- Du: " + pokemon_name + "(" + pokemon_type + "), HP: ",
you_life, ", Attack:", you_damage)
print("- Dator: " + op + ", HP: ", opponent_life,
", Attack:", opponent_damage)
turn = random.randint(1, 10)
print("*" * 40)
if turn % 2 == 0:
print("- Du börjar")
else:
print("- Datorn börjar")
print("*" * 40)
while opponent_life > 0 and you_life > 0:
# Note: type/weakness not implemented yet
time.sleep(0.5)
print("Du: {}hp, Datorn: {}hp".format(you_life, opponent_life))
print("*" * 40)
time.sleep(0.5)
if turn % 2 == 0:
# You attack
your_temp_damage = int(you_damage * random.uniform(0.5, 1.5))
print(pokemon_name, "(" + pokemon_type +
") attackerar:", your_temp_damage)
opponent_life = round(opponent_life - your_temp_damage)
else:
# Opponent
computer_temp_damage = int(
opponent_damage * random.uniform(0.5, 1.5))
print(op + " attackerar:", computer_temp_damage)
you_life = round(you_life - computer_temp_damage)
turn += 1
print("*" * 40)
if you_life > 0:
print("Vinnare är du: " + pokemon_name, "(" + pokemon_type + ")")
else:
print("Vinnare är datorn: " + op)
def set_pokemon():
global pokemon_name
pokemon_name = input("Vad heter din pokémon? ")
global pokemon_type
pokemon_type = get_pokemon_type()
def print_menu():
print("*" * 40)
print("Menu")
print("*" * 40)
print("1) Duellera")
print("2) Byt pokémon")
print("0) Avsluta")
def get_pokemon_type():
pokemon_type = False
while pokemon_type == False:
pokemon = input("Vilken pokémon är det? ")
if pokemon in pokemons:
return pokemon
else:
print("\nDen pokémon du försöker välja finns inte, välj någon av följande:")
for p in pokemons:
print("-" + p)
app()