Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是Python中OOP的合理示例吗?_Python_Oop - Fatal编程技术网

这是Python中OOP的合理示例吗?

这是Python中OOP的合理示例吗?,python,oop,Python,Oop,我正在尝试学习Python(3),我想尝试一下OOP。 我写了这个程序,其中两个电脑“玩家”玩“石头剪刀”。 这是可行的,但我希望有人能看一下,告诉我我是否犯了愚蠢的错误 # rock.py # example of OOP import random class Rock: def main(self): self.Make_players() print("Best of Five - Let's play!\n") done =

我正在尝试学习Python(3),我想尝试一下OOP。 我写了这个程序,其中两个电脑“玩家”玩“石头剪刀”。 这是可行的,但我希望有人能看一下,告诉我我是否犯了愚蠢的错误

# rock.py
# example of OOP
import random

class Rock:
    def main(self):
        self.Make_players()
        print("Best of Five - Let's play!\n")
        done  = False
        while done == False:
            self.p1.go_player()
            self.p2.go_player()
            print()
            if self.p2.go == self.p1.go:
                print("No winner!\n")
                continue
            else:
                temp = self.check(self.p1, self.p2)
            if temp == False:
                temp = self.check(self.p2, self.p1)
            print(self.message, end = " ")
            print(temp.name + " won this round.")
            temp.scored()
            print(self.p1.name + ": " + str(self.p1.score))
            print(self.p2.name + ": " + str(self.p2.score))
            if self.p1.score == 3:
                self.winner = self.p1
                done = True
            elif self.p2.score == 3:
                self.winner = self.p2
                done = True
            else:
                done = False
                input()
        print("The winner was " + self.winner.name + "!")


def __init__(self):
    print("**** Welcome to Rock, Paper, Scissors!****\n")
    self.winner = False
    self.main()

def Make_players(self):
    temp = (input("What shall we call Player 1? "))
    self.p1 = Player(temp)
    temp = (input("What shall we call Player 2? "))
    self.p2 = Player(temp)

def check(self, p_a, p_b):
    if p_a.go == "rock" and p_b.go == "scissors":
        self.message = "Rock breaks scissors."
        return p_a
    elif p_a.go == "paper" and p_b.go == "rock":
        self.message = "Paper wraps stone."
        return p_a
    elif p_a.go == "scissors" and p_b.go == "paper":
        self.message = "Scissors cut paper."
        return p_a
    else:
        return False

class Player:
    def __init__(self, name):
        self.choices = ["rock", "paper", "scissors"]
        self.score = 0
        self.name = name
        print("Player:", self.name, "created!\n")

    def go_player(self):
        self.go = random.choice(self.choices)
        print(self.name + " chose " + self.go, end = ". ")
        return self.go

    def scored(self):
        self.score += 1

# Main
game = Rock()

OOP的好处是,您可以根据角色、职责和关注点将程序划分为不同的对象/类。目前,
Rock
职业和
Player
职业都有太多的职责

具体来说,您应该考虑打印、从控制台读取和游戏循环。我会把他们放在一个
游戏
类控制器中

无论您是否考虑它,您还应该将
Rock
主循环放入一个名为run的方法中。它不应该从构造函数开始循环

最后,您的模块级代码可能如下所示:

# Main
game = Game()
game.run()
print("Game ended.")

这看起来更像是一个候选人,除非你有一个问题可以根据回答。摇滚类和玩家类都有太多的责任。具体来说,您应该考虑打印、从控制台读取和游戏循环。或者至少将
Rock
主循环放入名为
run
的方法中。它不应该从构造函数开始循环。@Deestan:这个问题现在还没有解决,我认为你上面的评论应该作为答案发布。谢谢jsbueno。我不是很有经验,在使用这个网站。这很有帮助,再次感谢。对初学者很有帮助!