【问题标题】:Python Tkinter: Loop The Computer's Turn A Certain Amount of TimesPython Tkinter:循环计算机运行一定次数
【发布时间】:2014-06-13 07:24:06
【问题描述】:

我正在为骰子游戏(猪)编写程序。在游戏中,玩家将掷出 d6 直到他们决定保持分数(传递给计算机)或直到他们掷出 1,这将自动轮到计算机。

我遇到的问题是我需要轮到计算机循环十次的功能。我希望计算机将骰子掷出十次,它要么掷出一个并传回给玩家,要么在掷出十次后保持不变。如何在不使用 Tk 内部循环的情况下让计算机掷骰子十次?

代码如下:

from Tkinter import *
from random import *

class App(Tk):
    def __init__(self):
        Tk.__init__(self)

        self.headerFont = ("courier new", "16", "bold")

        self.title("Pig, The Dice Game")
        self.headers()
        self.rollDie()

    def headers(self):
        Label(self, text = "Instructions", font = self.headerFont).grid(columnspan = 4)
        Label(self, text = "Text", font = self.headerFont).grid(row = 1, columnspan = 4)

        Label(self).grid(row = 1, columnspan = 4)
        Label(self, text = "The Game of Pig", font = self.headerFont).grid(row = 2, columnspan = 4)

    def rollDie(self):
        self.btnRoll = Button(self, text = "Roll The Die")
        self.btnRoll["state"] = 'active'
        self.btnRoll.grid(row = 3, columnspan = 4)
        self.btnRoll["command"] = self.playerTurn

        self.btnHold = Button(self, text = "Hold")
        self.btnHold["state"]= 'active'
        self.btnHold.grid(row = 4, columnspan = 4)
        self.btnHold["command"] = self.compTurn

        self.btnPass = Button(self, text = "Pass")
        self.btnPass.grid(row = 5, columnspan = 4)
        self.btnPass["command"] = self.compTurn

        Label(self, text = "You Rolled:").grid(row = 6, column = 0)
        self.lblYouRolled = Label(self, bg = "#fff", anchor = "w", relief = "groove")
        self.lblYouRolled.grid(row = 6, column = 1, columnspan = 1, sticky = "we")

        Label(self, text = "Options:").grid(row = 7, column = 0)
        self.lblOptions = Label(self, bg = "#fff", anchor = "w", relief = "groove")
        self.lblOptions.grid(row = 7, column = 1, sticky = "we")

        Label(self, text = "Player One Turn Score:").grid(row = 8, column = 0)
        self.lblPlayerOneTurnScore = Label(self, bg = "#fff", anchor = "w", relief = "groove")
        self.lblPlayerOneTurnScore.grid(row = 8, column = 1, sticky = "we")


    def playerTurn(self):
        self.oneTurnTotal = [0]
        self.oneRoll = randint(1,6)
        self.btnHold["state"] = 'active'

        self.lblYouRolled["text"] = self.oneRoll

        if self.oneRoll != 1:
            self.oneTurnTotal.append(self.oneRoll)
            self.lblOptions["text"] = "Roll again, or hold and pass the dice to Player Two."
        else:
            self.lblOptions["text"] = "You rolled a 1! Click 'Pass' to pass your turn to the computer."
            self.oneTurnTotal = [0]
            self.btnRoll["state"] = 'disabled'
            self.btnHold["state"] = 'disabled'


    def calculatePlayerOneTurnScore(self):
        turnScore = sum(self.oneTurnTotal)
        self.lblPlayerOneTurnScore["text"] = turnScore



    def compTurn(self):

        self.compTurnTotal = [0]
        self.compRoll = randint(1,6)

        self.lblYouRolled["text"] = self.compRoll

        if self.compRoll != 1:
            self.compTurnTotal.append(self.compRoll)
            self.lblOptions["text"] = "The computer will roll again."

        else:
            self.lblOptions["text"] = "The computer rolled a 1! Its turn has ended."
            self.compTurnTotal = [0]
            self.btnRoll["state"] = 'active'

    def calculatePlayerTwoTurnScore(self):
        turnScore = sum(self.twoTurnTotal)
        self.lblPlayerTwoTurnScore["text"] = turnScore


def main():
  app = App()
  app.mainloop()

if __name__ == "__main__":
  main()

【问题讨论】:

  • “不使用 Tk 内部的循环”是什么意思?
  • 使用循环有什么问题?一个只做一点数学运算的短循环是完全无害的。
  • 您是否希望计算机滚动一次,暂停一秒钟以让用户知道发生了什么,再次滚动,暂停,滚动,暂停?或者,您是否希望计算机最多模拟 10 次滚动然后返回结果?
  • 好吧,有人告诉我,你真的不应该在 Tk 中使用循环,因为主函数已经是一个循环。我如何让计算机的功能重复直到它滚动一个或滚动十次?模拟十次滚动并返回结果就可以了。
  • 在 Tk 中使用循环没有任何问题。实际上,如果您的骰子滚动在顶层窗口中,您可以调用 wait_window() 并且您的主循环将暂停,直到滚动完成。

标签: python user-interface tkinter tk dice


【解决方案1】:

您可以将 dicerolling 设为顶级小部件,然后让您的根“wait_window”完成滚动小部件。在顶层小部件中创建一个生成滚动并调用它十次的函数

示例

from Tkinter import *

yourscorevalue=12
cpuscorevalue=10

class dice:
    def __init__(self,parent):
        rollcount=0
        top=self.top=Toplevel(parent)
        while 1:
            roll=self.diceroll()
            rollcount+=1
            if rollcount==10 or roll==1:
                break

    def diceroll(self):
        #Random Dice Roll code

class dicegame:
    def __init__(self):
        self.root=Tk()
        self.root.title('Dicerolling Game')
        Label(self.root, text='Your Score').grid(column=0,row=0,sticky='ew')
        Label(self.root, text=yourscorevalue, background='black',foreground='red').grid(column=1,row=0,sticky='ew')
        Label(self.root, text='Computer Score').grid(column=0,row=1,sticky='ew')
        Label(self.root, text=cpuscorevalue, background='black',foreground='red').grid(column=1,row=1,sticky='ew')
        b=Button(self.root, text='Roll The Dice', command=self.roll).grid(column=0,row=2,sticky='ew')
        c=Button(self.root, text="Done", command=self.root.destroy).grid(column=1,row=2,sticky='ew')

        mainloop()

    def roll(self):
        d=dice(self.root)
        self.root.wait_window(d.top)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2021-06-15
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    相关资源
    最近更新 更多