---
# System prepended metadata

title: 'Guide: sten-sax-påse i Kivy'

---

# 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.

