Schere Stein Papier / Rock Paper Scissors

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
pythonstarter1
User
Beiträge: 8
Registriert: Montag 29. Oktober 2018, 14:38

Liebe Wissende!
Ich brauche Eure konkrete Hilfe und damit meine ich Code-Snippets. Es geht um eine Code-Erstellung, die ich derzeit nicht ohne Weiteres hinbekomme. :|
Ich „besuche“ gerade einen E-Learning-Kurs zum Thema Programmieren. Eingestiegen bin ich mit HTML und CSS, war recht gut soweit, auch die Aufgabe, die zu lösen war ging recht easy von der Hand.

Dann kam Python. Anfangs ließen wir Turtles alles mögliche machen und ich fühlte mich auch da recht gut. Dann kam der „Cut“. Zum einen war unsere Kleine über Wochen krank und hat uns wach gehalten. Zum anderen war ein Lernen neben dem Vollzeitberuf dadurch sehr schwierig und ich bin nicht so richtig mitgekommen.

Nun ist ein weiteres Projekt abzugeben und zwar: Schere Stein Paper. Es gibt einen Starter-Code (den poste ich weiter unten), das, was ich bisher so zusammengestopselt haben (poste ich weiter unten) und diese Vorgaben:

Der Zug soll zufällig sein:

Create a subclass called RandomPlayer that chooses its move at random. When you call the move method on a RandomPlayer object, it should return one of 'rock', 'paper', or 'scissors' at random. Change the code so it plays a game between two RandomPlayer objects.

Das Programm soll mitzählen und Unentschieden anzeigen:
Update the Game class so that it displays the outcome of each round, and keeps score for both players. You can use the provided beats function, which tells whether one move beats another one. Make sure to handle ties — when both players make the same move!

Das Programm soll menschliche Spieler zulassen
Create a HumanPlayer subclass, whose move method asks the human user what move to make. Set the program to play a game between HumanPlayer and RandomPlayer.

Das Programm soll “lernen”/sich einen Zug merken und ihn ausspielen
At the end of each game round, the Game class calls the learn method on each player object, to tell that player what the other player's move was. This means you can have computer players that change their moves depending on what has happened earlier in the game. To do this, you will need to implement learn methods that save information into instance variables. Create a ReflectPlayer class that remembers what move the opponent played last round, and plays that move this round. (In other words, if you play 'paper' on the first round, a ReflectPlayer will play 'paper' on the second round.)
Create a CyclePlayer class that remembers what move _it_ played last round, and cycles through the different moves. (If it played 'rock' this round, it should play 'paper' in the next round.)

Rechtschreibfehler berücksichtigen:
The human player might sometimes make typos. If they enter roxk instead of rock, the HumanPlayer code should let them try again. (See how this works in the demo if you type something in that isn't a valid move.)

Den Gewinner bekanntgeben
It's up to you how long the game should run. The starter code always plays three rounds, but that's not the only way it could work. You could choose to continue until the player types quit, or you could have the game run until one player is ahead by three points, or any other rule that makes sense to you. At the end of the game, have it print out which player won, and what the final scores are.

Und dann alles durch pycodestyle jagen.

Hier ist das Ergebnis/das Programm, mit dem man Rock Papers Scissors spielen kann. Datei heißt RPS demo 37
https://github.com/udacity/ipnd_rps_starter_code

Im Folgenden der Starter-Code:

#!/usr/bin/env python3

"""This program plays a game of Rock, Paper, Scissors between two Players,
and reports both Player's scores each round."""

moves = ['rock', 'paper', 'scissors']

"""The Player class is the parent class for all of the Players
in this game"""


class Player:
def move(self):
return 'rock'

def learn(self, my_move, their_move):
pass


def beats(one, two):
return ((one == 'rock' and two == 'scissors') or
(one == 'scissors' and two == 'paper') or
(one == 'paper' and two == 'rock'))


class Game:
def __init__(self, p1, p2):
self.p1 = p1
self.p2 = p2

def play_round(self):
move1 = self.p1.move()
move2 = self.p2.move()
print(f"Player 1: {move1} Player 2: {move2}")
self.p1.learn(move1, move2)
self.p2.learn(move2, move1)

def play_game(self):
print("Game start!")
for round in range(3):
print(f"Round {round}:")
self.play_round()
print("Game over!")


if __name__ == '__main__':
game = Game(Player(), Player())
game.play_game()


Und hier was ich bisher habe:

#!/usr/bin/env python3

"""This program plays a game of Rock, Paper, Scissors between two Players,
and reports both Player's scores each round."""
#we have parts in the code which shall answer randomly so

import random
moves = ['rock', 'paper', 'scissors']

"""The Player class is the parent class for all of the Players
in this game"""

#the "normal" player
class Player:
def __init__(self):
self.my_move = None
self.notmy_move = None
self.score = 0

def learn(self, my_move, notmy_move):
self.my_move = my_move
self.notmy_move = notmy_move

#the reflect player
class ReflectPlayer:
def move(self):
if not self.notmy_move:
return random.choice(moves)
else:
return self.notmy_move
#the cycle player
class CyclePlayer(Player):
def move(self):
for n in range(rounds):
return moves[n % 3]

#nothing to do here - code makes clear which value beats the other
def beats(one, two):
return ((one == 'rock' and two == 'scissors') or
(one == 'scissors' and two == 'paper') or
(one == 'paper' and two == 'rock'))

#nothing to do here - code creates the players
class Game:
def __init__(self, p1, p2):
self.p1 = p1
self.p2 = p2

#With this code I want to start the game
def play_game(self):
print("Game start! Let's play RPS! Like we did when we were children.")
print(f"{self.player1.behavior} versus "
f"{self.player2.behavior}!")
for round in range(self.rounds):
print(f"Round {round+1}:")
self.play_round()
if self.player1_score > self.player2_score:
print(f"{self.player1.behavior} Win!!! Player 1 is the winner here, oooooh yeah! Haha!")
else:
print(f"{self.player2.behavior} Win!!! Player 2 is the rps king. Well, for now. Wohooo!")
print("Game over! But why shouldn't we play right again?")

#Code to process each game round
def play_round(self):
while True:
move1 = self.player1.move()
move2 = self.player2.move()
print(f"{self.player1.behavior}: {move1} and "
f"{self.player2.behavior}: {move2}")
if move1 != move2:
break
else:
print("There was a tie, play again! Now! Do it!")
self.compute_score(move1, move2)
self.player1.learn(move1, move2)
self.player2.learn(move2, move1)

#Count the score
def compute_score(self, move1, move2):
if self.beats(move1, move2):
self.player1_score += 1
else:
self.player2_score += 1
print(f"Scores - {self.player1.behavior}: {self.player1_score}, "
f"{self.player2.behavior}: {self.player2_score}")

if __name__ == '__main__':
game = Game(Player(), Player())
game.play_game()


Danke Euch schon jetzt im Voraus für Eure Hilfe.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Da fehlt irgendwie eine Frage??

Zum Code: Konstanten werden komplett groß geschrieben, also »MOVES«. Doc-Strings gehören in die Klasse und nicht davor. In `beats` sind die Namen der Argumente nicht sehr aussagekräftig, was sollen zwei Zahlen bedeuten? Bei »game« sollten p1 und p2 auch eher player1 oder player2 heißen.

Was soll den notmy_move sein? Die beiden anderen Möglichkeiten? Bei ReflectPlayer sind die Einrückungen nicht korrekt. Das Attribut notmy_move wird nie definiert. Bei CyclePlayer macht die for-Schleife keinen Sinn, denn sie wird nach dem ersten druchgang per return beendet.
Der Kommentar vor »Game« ist falsch, weil keine Player erzeugt werden.
self.rounds wird nirgends definiert. behavior auch nicht. player1_score und player2_score auch nicht.
pythonstarter1
User
Beiträge: 8
Registriert: Montag 29. Oktober 2018, 14:38

Hallo zurück und schon jetzt vielen Dank.
Die "Frage" war eigentlich ganz unverblümt, ob mir jemand den Code schreiben kann, da ich merke, dass ich es nicht packe.
Ich weiß auch nicht warum, HTML und CSS gingen super und die Turtles rumlaufen lassen auch. Und dann ging es dahin.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Damit ist Dir ja nicht geholfen, denn nächste Woche stehst Du wieder da.

Die Fragen sind so aufgebaut, dass man Schritt für Schritt das Programm erweitert. Alles auf einmal machen zu wollen, führt nur dazu, dass man nicht mehr weiß, wo vorne und hinten ist. Programmiern bedeutet auch, eine Teilaufgabe nach der anderen zu lösen und dazwischen das geschriebene zu Testen.

Fang doch mit »RandomPlayer« an und schau, dass das funktioniert. Gibt es dabei eine konkrete Frage, kannst Du gerne fragen.
pythonstarter1
User
Beiträge: 8
Registriert: Montag 29. Oktober 2018, 14:38

Das trifft es fast. Wenn ich den Code habe, reiche ich den ein und habe mit Python nichts mehr zu tun. Warum ich das "los" haben will?
Tja, danach geht es nahtlos weiter mit JavaScript, auf das ich eigentlich spekuliere... Das benötige ich beruflich viel mehr.
Python wäre dann erledigt für mich.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Die gleichen Probleme wie mit Python wirst Du vermutlich auch mit JavaScript bekommen. Denn beim Programmieren geht es nicht alleine darum eine Sprache zu lernen, sondern Konzepte zu verstehen. Ob diese nun in JavaScript oder Python umgesetzt werden, ist unerheblich.

Zwar hat Sirus3 recht, dass fertige Lösungen zum Lernen nicht beitragen (verstehen muss man selbst, abschreiben hilft überhaupt nicht), bisweilen kann aber ein kleiner Anstoß helfen, wenn man gedanklich feststeckt.

Hier daher der RandomPlayer ('Create a subclass called RandomPlayer that chooses its move at random.'):

Code: Alles auswählen

import random


ITEMS = ['rock', 'paper', 'scissors']


class Player:

    def move(self):
        return 'rock'
        
        
class RandomPlayer(Player):

    def move(self):
        return random.choice(ITEMS)
Die Aufgabe ist an dieser Stelle bezüglich Vererbung nicht sonderlich hilfreich, da der Player zu wenig kann, um den Sinn des Ganzen zu demonstrieren. Vielleicht fällt Dir aber nun die zweite Teilaufgabe leichter ('Change the code so it plays a game between two RandomPlayer objects.').
pythonstarter1
User
Beiträge: 8
Registriert: Montag 29. Oktober 2018, 14:38

Abschreiben hilft nicht und ist auch sonst nicht mein Stil. Ich will / wollte das ja auch lernen, aber ich bin zuletzt durch die Lektionen gerade ohne Notizen ohne alles und hab da natürlich null mitgenommen. Einerseits aus Zeitdruck (Tochter krank und daher auch nachts wach gewesen), andererseits aus Frust, weil vieles nicht so funktioniert hat wie bei den Turtles.
Danke für das Code Snippet. Das ist hier alles schon viel mehr als ich verlangen kann.

Javascript: hier will ich versuchen, wieder wie bei html und css sauber und Schritt für Schritt vorzugehen. Da ist etwas Zeit und die Tochter bleibt hoffentlich gesund.
pythonstarter1
User
Beiträge: 8
Registriert: Montag 29. Oktober 2018, 14:38

Überhaupt bin ich langsam im Zweifel, ob das Format elearning ohne Rückmeldung von einem Dozenten bei Vollzeitjob und kleinem Kind das Richtige war...
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Solche Ausreden höre ich von meinen Studenten auch manchmal. Habe ich Verständnis für ihre Situation, ja. Habe ich Verständnis für ihre Einstellung, nein. Ich habe schon viele Bewerber angeschaut. Dabei habe ich schon viele lustige Zertifikate gesehen. Hat das irgendeinen Einfluß darauf, ob der Bewerber geeignet ist? Nein. Was dagegen ist wichtig? Ehrlichkeit. Kann der Bewerber erzählen, was er schon programmiert hat, z.B. ein Hobby, für den Verein eine Mitgliederverwaltung, etc., das ist relevant. Da kommt auch schnell heraus, ob jemand ehrlich ist, oder nur aufschneiden will.

Das was Du zeigst, läßt ehrlicherweise noch Defizite im allgemeinen Verständnis von Variablen, Objekten, Funktionen erkennen. Das ist nicht schlimm, das kann man alles lernen (indem man eigenständig Aufgaben löst). Aber genau das brauchst Du auch für JavaScript. Alles Verständnis, was Dir hier jetzt fehlt, wird um so schwieriger, später nachzuholen. Was Du dagegen anscheinend kannst, ist die Pythonsyntax, also genau das, was Du später angeblich nicht mehr brauchst.
pythonstarter1
User
Beiträge: 8
Registriert: Montag 29. Oktober 2018, 14:38

Ja, das stimmt,.diverse Zertifikate sind das Papier nicht wert. Bei derselben Plattform habe ich einen solchen Kurs zu GoogleAds gemacht und bestanden, was das nun über meine Fähigkeiten dahingehend aussagt, ist für einen Außenstehenden natürlich nicht einzuschätzen.

Mein derzeitiger Kurs soll insgesamt nur dabei helfen, ein Grundverständnis dafür zu bekommen, was unsere Agentur z.B. macht und ob die 10 Manntage so tatsächlich nötig sind... Mehr ist es nicht. (Dazu brauche ich genau genommen nicht mal das Zertifikat.)

Also wie gesagt: das hier ist eh schon alles mehr als ich erwarten kann. So komme ich zwar nicht durch den Kurs und mein Chef wird fragen, was los war (der zahlt das Ding). Aber es ist kein Weltuntergang.
Würde mich ja gerne ausführlich damit beschäftigen, aber der Kurs hat seine Deadline und da ist nix zu machen.
Und ich gebe zu: ob ich dann bei Javascript weiterkomme, ist die Frage. Aber dazu hab ich jetzt einfach mehr Zeit... Und bei CSS hat es auch hingehauen (ist aber nur bedingt vergleichbar... Wie man eben Sprachen nur bedingt vergleichen kann).
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Ich finde es gut, dass Du das nebenberuflich hinbekommen möchtest. Wenn der Chef den Kurs zahlt, sollte er Dir vielleicht auch etwas Zeit geben, diesen erfolgreich absolvieren zu können (was immer Erfolg bei dem Udacity nun bedeuten mag).

Die Zielsetzung, den Aufwand eines Projektes in Manntagen beurteilen zu können, wird Dir aber kein solcher Kurs erfüllen können. Dazu bedarf es viel Erfahrung und mindestens so viel Know How wie diejenigen, welche die Manntage leisten. Und selbst dann kann man sich dabei schwer verschätzen.

HTML und CSS sind übrigens Auszeichnungssprachen, keine Programmiersprachen. Das ist ein grundlegender Unterschied. Mit JavaScript wird es nicht besser. Meine Empfehlung: pack es jetzt an. Wenn Du verstanden hast, was der starter-code tut, dann ist das machbar.
pythonstarter1
User
Beiträge: 8
Registriert: Montag 29. Oktober 2018, 14:38

Ja, der Deal ist immer so: Ich zahle es, du machst es in der Freizeit. Naja, zielführend ist das nicht. Es ist meines Erachtens auch schwierig in der kurzen Zeit. Die setzen da 10h in der Woche an und das reicht denke ich nicht. V.a. Nicht für einen wie mich, der was völlig anderes studiert hat und sich im Onlinemarketing auskennt. Und nicht mehr mitbringt als ein Verständnis für Funktionen in der Mathematik...

Es anzupacken: das muss ich jetzt mit JS machen und den Phytoncode irgendwie hinbekommen, bin aber sehr skeptisch, ich bin eigentlich vollkommen blank. Ich verstehe gut nichts. Ich kann Turtles Sterne in unterschiedlichen Farben malen... Bis dahin lief es.

Und stimmt, HTML und CSS sind keine Programmiersprachen. Aber wenigstens kann man auf einem gewissen Niveau mit nem Webdesigner diskutieren.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das "gemeine" bei Programmiersprachen ist, dass man Erfolge oft nicht unmittelbar sehen kann. Bei HTML hat man die entsprechende Ausgabe im Browser nachdem man etwas verändert hat. Bei Turtle ist es der Verlauf der komischen Schildkröte mit ihrem Super-Design. Beim ernstzunehmenden Programmieren muss man aber viel abstrakter denken können. Man muss Dinge in sinnvolle Teilprobleme zerlegen und deren Ausgaben sozusagen als Zwischenstand korrekt interpretieren und für den weiteren Programmfluss verwenden können. Bis zu einem gewissen niedrigen Niveau fällt das vielen Menschen noch leicht, aber irgendwann reichen 2-3 Aufrufe nicht mehr aus, die Programmlogik wird komplexer und man kann sich dabei schnell verrennen. Genau daran verzweifeln leider viele oder bekommen es nicht in einer angemessenen Zeit auf die Reihe. Oft hat man dann am Ende etwas potenziell fehlerbehaftetes, das irgendwie läuft und die Deadline halbwegs erreicht hat...
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ach Du meine Güte. Die haben ja Python-Bytecode-Dateien mit einer ”Lösung” bei Github hochgeladen. Also hier ist dann mal die Musterlösung dekompiliert:

Code: Alles auswählen

# uncompyle6 version 3.2.4
# Python bytecode 3.6 (3379)
# Decompiled from: Python 3.6.6 (default, Sep 12 2018, 18:26:19) 
# [GCC 8.0.1 20180414 (experimental) [trunk revision 259383]]
# Embedded file name: /Users/zoe.gordin/ipnd-final-project/zoe_rps.py
# Compiled at: 2018-06-21 19:26:59
# Size of source mod 2**32: 3690 bytes
"""
Created on Fri May 25 14:54:36 2018

@author: zoe.gordin
"""
import random
moves = [
 'rock', 'paper', 'scissors']

class Player:

    def throw(self):
        return 'rock'

    def learn():
        pass


class User(Player):

    def throw():
        userThrow = input('What would you like to throw?\n')
        userThrow.lower
        while userThrow not in moves:
            if userThrow != 'z':
                userThrow = input('Please enter a valid throw: ' + 'rock, paper, scissors, or z.\n')

        return userThrow

    def learn():
        pass


class Random(Player):

    def throw(self):
        return RandomGenerator.getRandom()

    def learn():
        pass


class Reflect(Player):

    def __init__(self):
        self.reflected = RandomGenerator.getRandom()
        self.temp = ''

    def throw(self, userThrow):
        return Reflect.learn(self, userThrow)

    def learn(self, userThrow):
        self.temp = self.reflected
        self.reflected = userThrow
        return self.temp


class Cycle(Player):

    def __init__(self):
        self.move_idx = 0

    def throw(self):
        return Cycle.learn(self)

    def learn(self):
        if self.move_idx < 2:
            self.move_idx += 1
        else:
            self.move_idx = 0
        return moves[self.move_idx - 1]


class RandomGenerator:

    def getRandom():
        return moves[random.randint(0, 2)]


class Game(object):
    triumph = {'rock':{'paper':0, 
      'scissors':1}, 
     'paper':{'rock':1, 
      'scissors':0}, 
     'scissors':{'rock':0, 
      'paper':1}}

    def __init__(self):
        self.userWins = 0
        self.compWins = 0

    def print_rules():
        print('Here are the rules of the game: scissor cuts paper,' + 'paper covers rock, and rock crushes scissors.')
        print('Play either "rock", "paper", or "scissors"')
        print('If you want to stop playing, enter a "z".')
        player = input('Who would you like to play with? Please enter ' + '"random", "reflect", "repeat", or "cycle"\n')
        while player != 'random':
            if player != 'reflect':
                player = player != 'repeat' and player != 'cycle' and player != 'z' and input('Please select a valid player, "random", ' + '"reflect", "repeat", or "cycle"\n')

        return player

    def find_winner(self, uThrow, cThrow):
        if cThrow == uThrow:
            return "It's a tie!"
        elif Game.triumph[uThrow][cThrow] == 0:
            self.compWins += 1
            return 'Computer won!'
        else:
            self.userWins += 1
            return 'You won!'

    def play_game(self):
        playerChoice = Game.print_rules()
        playerChoice.lower
        if playerChoice == 'z':
            user = playerChoice
        else:
            user = User.throw()
        repeater = Player()
        reflecter = Reflect()
        cycler = Cycle()
        random = Random()
        while user != 'z' and playerChoice != 'z':
            if playerChoice == 'random':
                compThrow = random.throw()
            else:
                if playerChoice == 'reflect':
                    compThrow = reflecter.throw(user)
                else:
                    if playerChoice == 'repeat':
                        compThrow = repeater.throw()
                    else:
                        if playerChoice == 'cycle':
                            compThrow = cycler.throw()
                    print('the computer threw ' + compThrow)
                    print(Game.find_winner(self, user, compThrow))
                    user = User.throw()

        print('Thanks for playing!')


game = Game()
game.play_game()
# okay decompiling Downloads/rps_demo_36.pyc
Ich hoffe mal inständig dass das eine Lösung eines Schülers aus einer vorherigen Veranstaltung ist, aber selbst dann sind da Sachen drin die sehr klar zeigen dass das zwar ”läuft”, aber ganz klar Objektorientierung nicht verstanden wurde. Also was kann ein Kurs wert sein, der das hier als Musterlösung verwendet. Wenn auch kompiliert, damit's keiner sehen kann. Aber die müssen doch auch eine richtige Musterlösung haben die sie dafür hätten verwenden können.

Mir ist klar das das nicht 1:1 der originale Quelltext ist und einige komische Sachen sicher durch den Dekompiler zustande gekommen sind, aber das ”Methoden” über ihre Klassen aufgerufen werden, oder einfache Funktionen sinnlos in Klassen stecken, muss ja schon im Original drin sein.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn die Dame sich nicht einfach so zum Autor gemacht hat, dann läßt ihr Titel schlimmes vermuten:
Zoë Gordin
Content Developer Intern at Udacity
Dass `userThrow.lower` nicht richtig aufgerufen wird, kann man ja leicht durch ausprobieren testen.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pythonstarter1: Mal als Versuch zu illustrieren das die Python-Aufgabe gar nicht wirklich Python-spezifisch ist und das dort gelernte auch in den folgenden JavaScript-Lektionen gebraucht werden kann, hier mal der Starter-Code in JavaScript:

Code: Alles auswählen

#!/usr/bin/env node
'use strict';

const MOVES = ['rock', 'paper', 'scissors'];


class Player {
    move() {
        return 'rock';
    }
    
    learn(myMove, otherMove) {}
}


function beats(move, counterMove) {
    return move === 'rock' && counterMove === 'scissors' ||
           move === 'scissors' && counterMove === 'paper' ||
           move === 'paper' && counterMove === 'rock';
}


class Game {
    constructor(playerA, playerB) {
        this.playerA = playerA;
        this.playerB = playerB;
    }
    
    playRound() {
        const moveA = this.playerA.move();
        const moveB = this.playerB.move();
        console.log('Player 1: ' + moveA + '  Player 2: ' + moveB);
        this.playerA.learn(moveA, moveB);
        this.playerB.learn(moveB, moveA);
    }
    
    playGame() {
        console.log('Game start!');
        for (var i = 0; i < 3; i++) {
            console.log('Round ' + i + ':');
            this.playRound();
        }
        console.log('Game over!');
    }
}


function main() {
    const game = new Game(new Player(), new Player());
    game.playGame();
};


if (require.main === module) {
    main();
}
Das sieht nicht zufällig sehr ähnlich aus und auch in JavaScript kann man die Aufgabe gut so umsetzen wie sie formuliert wurde. Auch das generelle Vorgehen, wie es ja schon beschrieben wurde, ist gleich. In kleinere, lös- und testbare Teilprobleme aufteilen, und die schrittweise implementieren und testen. Da kommt am Ende in JavaScript fast das gleiche heraus wie in Python, nur mit anderer Syntax. Und bei JavaScript wahrscheinlich dann noch einen Tick komplizierter wegen der asynchronen Architektur mit Callbacks, die jetzt in dem Starter-Code noch nicht sichtbar wird, aber die spätestens dann grundlegend wird, wenn man das dann auf den Webbrowser überträgt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten