如何更改点数以更好地模拟田纳西游戏?

2024-05-15 02:04:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个模拟田纳西游戏的程序。我从0-4开始计算积分,得到4分可以赢得比赛,我这样做只是作为一个临时解决方案。现在我差不多完成了,我不知道如何把分数改为0,15,30,40

这是我的班级:

class Players: #define class players
    ratio = 0
    def __init__(self, name, winningProb, wonGames, playedGames):
        self.name = name
        self.winningProb = winningProb
        self.wonGames = wonGames
        self.playedGames = playedGames
        if playedGames == 0:
            self.ratio = 0
        else:
            self.ratio = self.wonGames/self.playedGames
        self.score = 0
    def showPlayerInfo(self):
        print(self.name, self.wonGames, self.playedGames, self.winningProb)
    def playerInfo(self, position): 
        return [str(position), self.name, str(self.wonGames), str(self.playedGames), str(self.winningProb)]
    def getWinningProb(self):
        return self.winningProb
    def getScore(self):
        return self.score
    def setScore(self, score):
        self.score = score
    def getName(self):
        return self.name
    def getWonGames(self):
        return self.wonGames
    def getPlayedGames(self):
        return self.playedGames

定义游戏的函数:

def playGame(players, displayBoardPerBall, displayBoardPerGame, flag, pauseAfterBalls):
    ballCounter = 0
    while True:
        if flag == 1:
            flag = 2
            if isWonTheBall(players[0]):
                players[0].setScore(players[0].getScore() + 1)
            else:
                players[1].setScore(players[1].getScore() + 1)
        elif flag == 2:
            flag == 1
            if isWonTheBall(players[1]):
                players[1].setScore(players[1].getScore() + 1)
            else:
                players[0].setScore(players[0].getScore() + 1)
        ballCounter += 1
        if displayBoardPerBall:
            print("\nBall scores until now")
            print(players[0].name, players[0].getScore())
            print(players[1].name, players[1].getScore())
            print()
        if pauseAfterBalls ==  ballCounter:
            ballCounter = 0
            nothing = input("Game Paused. Enter Any Letter To Continue.")
        #whoWon stores 0 if nobody won
        whoWon = checkGameWinner(players)
        if whoWon!=0:
            print("\n\nPlayer",whoWon+1,"won this game.")
            players[0].setScore(0)
            players[1].setScore(0)
            return whoWon
        if players[0].getScore() == 3 and players[1].getScore() == 3:
            print("\nDEUCE!!\n")

不确定此功能是否有用,但它只是检查谁赢得了游戏:

def checkGameWinner(players):
    if players[0].getScore() == 4 and players[1].getScore() <= 2:
        return 1
    if players[1].getScore() == 4 and players[0].getScore() <= 2:
        return 2
    if players[1].getScore() > 2 and players[0].getScore() > 2:
        if players[1].getScore() >= players[0].getScore()+2:
            return 2
        elif players[0].getScore() >= players[1].getScore()+2:
            return 1
    return 0

感谢您的帮助!我试着算出一个方程式,这样它可以数到0,15,30,40,但无法算出一个可行的方程式

如果你有更多的代码,也许是主要的功能,只是评论,我会张贴它


Tags: nameselfreturnifdefflagscoreprint
3条回答

如果您不想更改任何内部代码,可以编写一个简单的函数将分数转换为显示值

def getDisplayScore(self):
    score_map = [0, 15, 30, 40]
    return score_map[self.score]

定义将分数转换为分数的函数

比如说

def getPoints(score):
    # TODO: Handle score == 4

    if score == 3:
        return 40
    return 15 * score

使用列表查找要显示的分数,在内部,您可以在每次得分时增加一个计数器

display_score = [0, 15, 30, 40]
...
def get_score():
    return display_score[self.score]
    

更好的实现还可以检查无效分数,以防止读取超过数组末尾,但如果在类中实现,则应该在set/increment score方法中执行此操作

使用类的优点是封装逻辑,对使用类的代码隐藏逻辑。要保持分数,可以将此代码的逻辑移入类中:

players[0].setScore(players[0].getScore() + 1)

setScore方法替换为incrementScore,因为对象已经知道其当前分数

def increment_score():
    if (self.score < 3):  # player has not reached 40 points
        self.score += 1

然后,您可以从更改您的分数代码

if isWonTheBall(players[0]):
    players[0].setScore(players[0].getScore() + 1)
else:
    players[1].setScore(players[1].getScore() + 1)

对此

if isWonTheBall(players[0]):
    players[0].incrementScore()
else:
    players[1].incrementScore()

此代码不处理'deuce'和'advantage'的情况,但由于可以在python数组中混合字符串和整数,因此可以在玩家的分数增加时将它们添加到display_score列表和一些额外的逻辑中。我把它留给你去试一下

通过删除setScore方法,可以防止有人将玩家分数更改为某个愚蠢的值(如-10或236),从而简化对无效分数的检查。一旦删除了分数设置,您还需要使用reset_score等方法将分数设置为零,以便下一场比赛

目前,您的类是一组方法,可以直接访问成员变量,转而使用方法对对象执行一些操作,这有助于抽象。您可能会发现这篇关于why getter and setter methods are evil的文章很有趣,它是关于Java编写的,但该原则适用于所有面向对象语言

相关问题 更多 >

    热门问题