Ich versuche, in Python ein "Rock, Paper, Scissors" -Spiel zu erstellen, und ich möchte eine Variable so einstellen, dass sie größer ist als die andere.

Etwas wie:

paper > rock
scissors > paper
rock > scissors

Wie könnte ich das machen ..?

2
ikuro 18 Jän. 2019 im 18:20

5 Antworten

Beste Antwort

Ja, wie Daniel sagte, mit der Überschreibung von __cmp__ können Sie Folgendes erreichen:

class Comparable(object):
    def __init__(self, below_class, above_class):
        self.above_class = above_class
        self.below_class = below_class

    def __cmp__(self, other):
        if isinstance(other, self.below_class):
            return 1
        if isinstance(other, self.above_class):
            return -1
        return 0

class Paper(Comparable):
    pass

class Rock(Comparable):
    pass

class Scissors(Comparable):
    pass

scissors = Scissors(Paper, Rock)
paper = Paper(Rock, Scissors)
rock = Rock(Scissors, Paper)

# True

print paper > rock
print scissors > paper
print rock > scissors

# False

print paper < rock
print scissors < paper
print rock < scissors

Die Dokumentation zur Funktionsweise finden Sie hier: https: // docs. python.org/2.6/reference/datamodel.html#object. cmp

5
sknat 18 Jän. 2019 im 15:37

In Ihrem Fall würde ich vorschlagen, eine Funktion zu erstellen, die den Gewinner zurückgibt. Etwas wie

def winner(J1, J2):
    if J1 == 'rock':
        if J2 == 'paper':
            return('J2')
        if J2 == 'rock':
            return('draw')
        if J2 == 'paper':
            return('J1')
    ...

So können Sie sehen, wer gewinnt.

2
Statistic Dean 18 Jän. 2019 im 15:44

Für eine einfache Lösung, bei der Operatoren nicht neu definiert werden:

Definieren Sie zuerst die Spielregeln:

rules = ['paper>rock', 'rock>scissors', 'scissors>paper']

Und verwenden Sie eine Funktion wie diese, um die Daten anhand der Regeln zu überprüfen:

def greater(opt1, opt2):
    if opt1 == opt2:
        return None # draw
    return "{0}>{1}".format(opt1, opt2) in rules

>>> greater('paper','rock')
True
>>> greater('paper','scissors')
False
>>> greater('rock','paper')
False
1
BoarGules 18 Jän. 2019 im 15:45

Sie können das Verhalten des Operators > überschreiben, indem Sie eine __gt__ -Methode für das Objekt definieren. Weitere Informationen finden Sie in der Dokumentation zum Python-Datenmodell.

1
Daniel Pryden 18 Jän. 2019 im 15:32

Dies ist eigentlich eine interessante Frage, da sie einige nützliche Ideen aufwirft.

Wenn zum Beispiel eine Papier-Stein-Schere den Gesetzen von mathematischer Ungleichung folgte wäre ein triviales Problem. Angenommen, paper > rock > scissors ist mathematisch wahr (d. H. paper > scissors, entgegen den Spielregeln):

class fist(object):

   def __init__(self, weapon):
       WEAPON_VALUES = {'paper': 2, 'rock': 1, 'scissors': 0}
       self.weapon_value = WEAPON_VALUES[weapon]

   def __gt__(self, other):
       return self.weapon_value > other.weapon_value

   def __lt__(self, other):
       return self.weapon_value < other.weapon_value

   def __eq__(self, other):
       return self.weapon_value == other.weapon_value

   def __ne__(self, other):
       return self.weapon_value != other.weapon_value    

paper = fist('paper')

rock = fist('rock')

scissors = fist('scissors')

Jetzt können wir überprüfen:

In [7]: paper > rock
Out[7]: True

In [8]: rock == rock
Out[8]: True

In [9]: paper < scissors
Out[9]: False

In [10]: scissors < rock
Out[10]: True

Leider hat eine Papier-Stein-Schere eine zirkuläre Logik, und daher funktioniert das übliche Konzept der Ungleichung in diesem Fall nicht (daher ergibt paper < scissors False).

Sie können benutzerdefinierte Vergleiche verwenden, wie in einer anderen Antwort erläutert, aber denken Sie daran, dass dies natürlich Paradoxe wie rock > scissors > paper == True aufwirft rock < paper.

3
ajrwhite 18 Jän. 2019 im 16:27