# Guide: sten-sax-påse i Kivy
### Del 1 - design
Det första vi behöver göra är att skapa en design för appen. I sten-sax-påse spelet behöver vi följande widgets:
* 3 knappar: sten, sax, påse
* 1 label för datorns val
* 1 label för resultatet
Vi kan göra layouten på olika sätt, men ett alternativ är att ha en vertikal BoxLayout med båda Labels följt av en horisontell layout för knapparna.
### Del 2 - funktion
Spelet kommer gå till så att varje knapp gör följande:
1. Sätter spelarens val utifrån vilken knapp som trycktes
2. Slumpar fram ett val för datorn
3. Skriver ut det valet i labeln för datorns val
4. Avgör vinnaren och skriver ut det i labeln för resultatet
### Del 3 - kod
#### 3a - skapa widgets
Vi börjar med att skapa template-koden för en tom app.
```python
from kivy.app import App
class AppName(App):
def build(self):
# Här skapar ni era widgets
```
I build-funktionen vill vi sedan skapa alla våra widgets. Till exempel kan vi skapa vår label för datorns val på följande sätt:
```python
def build(self):
outerLayout = BoxLayout(orientation="vertical")
compChoiceLabel = Label(text="")
outerLayout.add_widget(compChoiceLabel)
...
return outerLayout
```
För knapparna gör vi en BoxLayout *inuti* den andra Layouten
```python
def build(self):
...
buttonLayout = BoxLayout(orientation="vertical")
rockButton = Button(text="rock")
buttonLayout.add_widget(rockButton)
...
outerLayout.add_widget(buttonLayout)
return outerLayout
```
Se till att även skapa en label för resultatet och de andra två knapparna (påse och sax).
#### 3b - funktioner till knappar
Nu vill vi se till att knapparna faktiskt gör något när vi trycker på dem. Då är det två saker som vi behöver göra:
1. skapa en funktion som ska anropas när knappen trycks
2. koppla funktionen till knappen
För första steget kan vi skapa en funktion som heter `play`. Vi lägger till den i klassen, men utanför build-funktionen.
```python
class AppName(App):
def build(self):
# Här skapar ni era widgets
#...
def play(self, btn):
# Här skriver vi koden som körs när en knapp trycks
```
Vi lägger också till play-funktionen till våra knappar.
```python
def build(self):
...
rockButton = Button(text="rock")
rockButton.bind(on_press=self.play)
```
Vi ser vad `play`-funktionen ska göra under vår planering (*Del 2 - funktion*). Första steget är att avgöra vad spelaren har valt. Här finns två sätt:
* Alt. 1: vi skapar olika `play`-funktioner för varje knapp: `playRock` `playScissors` och `playPaper` och kopplar rätt funktion till rätt knapp.
* ALt. 2: vi läser texten på knappen som trycktes, den kommer vara "rock" "paper" scissors.
Alternativ 2 löser vi med `btn`-variabeln som finns tillgänlig i `play`-funktionen.
```python
def play(self, btn):
playerChoice = btn.text
```
Andra steget var att avgöra datorns val. Det gör vi genom att slumpa fram en siffra mellan 1 och 3 som får representara sten, sax eller påse:
1 --> rock
2 --> scissors
3 --> paper
```python
def play(self, btn):
playerChoice = btn.text
randomNum = random.randint(1,3)
computerChoiceText = ""
if randomNum == 1:
computerChoiceText = "Rock"
if randomNum == 2:
computerChoiceText = "Scissors"
if randomNum == 3:
computerChoiceText = "Paper"
```
När vi vi vet datorns val (som nu är sparat i variabeln `computerChoiceText`) kan vi sätta texten på labeln för datorns val. Då behöver vi komma åt variabeln `compChoiceLabel` från build funktionen. Det gör vi genom att lägga till `self.` innan variabelnamnet. I `play`-funktionen:
```python
self.compChoiceLabel.text = computerChoiceText
```
Sista steget är att avgöra vinnaren. Till det kommer vi behöva en rad if-satser:
```python
if playerChoice == computerChoiceText:
#Det blev lika
self.resultLabel.text = "Tie!"
if playerChoice == "Rock" and computerChoiceText == "Scissors":
self.resultLabel.text = "Player wins!"
if playerChoice == "Paper" and computerChoiceText == "Scissors":
self.resultLabel.text = "Computer wins!"
...
```
Totalt borde det bli sju if-satser inklusive den som kollar om det blev lika.
#### 3c - förbättringar
Nu borde vi ha ett fungerande spel. För att bygga vidare kan vi göra lite olika förbättringar:
* Lägga till bilder till våra knappar och datorns resultat
* Räkna poäng när man kör flera omgångar
* Egna idéer?
### Del 4 - reflektion
Denna del gör ni individuellt.
I ett google-dokument på classroom svara på följande frågor:
* Vad är du mest nöjd med i din app?
* Vad finns det för förbättringar man skulle kunna göra på er app?
* Välj ut en bit av koden och beskriv vad den gör.