2015-05-21 5 views
1

Для моего класса информатики я работаю над проектом конца года, и я решил создать игру Yahtzee с использованием Python и Tkinter. Я начал код, но то, что у меня до сих пор не работает, и я не знаю, почему, может кто-нибудь мне помочь?Может кто-нибудь помочь мне сделать игру Yahtzee?

Код после «# roll1», «# roll2» и т. Д. заключается в создании точек для каждой возможности броска на пяти игральных костях. Они хранятся в определениях, о которых я мало что знаю. Флажки используются для определения того, какие кости требуется игроку, но когда я проверил кнопку roll с возможностью проката 1, он не работал. Также я хотел, чтобы флажки были организованы по горизонтали, но по какой-то причине они вертикальны. Кто-то, пожалуйста, помогите!

from Tkinter import * 
import random 


root = Tk() 

drawpad = Canvas(root, width=600, height=600, background='white') 
dice1 = drawpad.create_rectangle(10, 10, 110, 110, fill="white") 
dice2 = drawpad.create_rectangle(130, 10, 230, 110, fill="white") 
dice3 = drawpad.create_rectangle(250, 10, 350, 110, fill="white") 
dice4 = drawpad.create_rectangle(370, 10, 470, 110, fill="white") 
dice5 = drawpad.create_rectangle(490, 10, 590, 110, fill="white") 
check1 = False 
check2 = False 
check3 = False 
check4 = False 
check5 = False 

# roll 1 
roll1 = [] 
for i in range(1, 6, 1): 
    x = (120 * i) - 65 
    y = x + 10 
    roll1.append(drawpad.create_oval(x, 55, y, 65, fill="red", state=HIDDEN)) 
# roll 2 
roll2 = {} 
for i in range(1, 6, 1): 
    x = (120 * i) - 98 
    y = x + 10 
    x2 = (120 * i) - 33 
    y2 = x2 + 10 
    roll2[i] = [drawpad.create_oval(x, 23, y, 33, fill="red", state=HIDDEN), drawpad.create_oval(
     x2, 87, y2, 97, fill="red", state=HIDDEN)] 
# roll3 
roll3 = {} 
for i in range(1, 6, 1): 
    x = (120 * i) - 65 
    y = x + 10 
    x2 = (120 * i) - 98 
    y2 = x2 + 10 
    x3 = (120 * i) - 33 
    y3 = x3 + 10 
    roll3[i] = [drawpad.create_oval(x, 55, y, 65, fill="red", state=HIDDEN), drawpad.create_oval(
     x2, 23, y2, 33, fill="red", state=HIDDEN), drawpad.create_oval(x3, 87, y3, 97, fill="red", state=HIDDEN)] 
# roll4 
roll4 = {} 
for i in range(1, 6, 1): 
    x = (120 * i) - 98 
    y = x + 10 
    x2 = (120 * i) - 33 
    y2 = x2 + 10 
    roll4[i] = [drawpad.create_oval(x, 23, y, 33, fill="red", state=HIDDEN), drawpad.create_oval(x2, 23, y2, 33, fill="red", state=HIDDEN), drawpad.create_oval(
     x2, 87, y2, 97, fill="red", state=HIDDEN), drawpad.create_oval(x, 87, y, 97, fill="red", state=HIDDEN)] 
# roll5 
roll5 = {} 
for i in range(1, 6, 1): 
    x = (120 * i) - 98 
    y = x + 10 
    x2 = (120 * i) - 33 
    y2 = x2 + 10 
    x3 = (120 * i) - 65 
    y3 = x3 + 10 
    roll5[i] = [drawpad.create_oval(x, 23, y, 33, fill="red", state=HIDDEN), drawpad.create_oval(x2, 23, y2, 33, fill="red", state=HIDDEN), drawpad.create_oval(
     x2, 87, y2, 97, fill="red", state=HIDDEN), drawpad.create_oval(x, 87, y, 97, fill="red", state=HIDDEN), drawpad.create_oval(x3, 55, y3, 65, fill="red", state=HIDDEN)] 
# roll6 
roll6 = {} 
for i in range(1, 6, 1): 
    x = (120 * i) - 98 
    y = x + 10 
    x2 = (120 * i) - 33 
    y2 = x2 + 10 
    roll6[i] = [drawpad.create_oval(x, 23, y, 33, fill="red", state=HIDDEN), drawpad.create_oval(x2, 23, y2, 33, fill="red", state=HIDDEN), drawpad.create_oval(x2, 87, y2, 97, fill="red", state=HIDDEN), drawpad.create_oval(
     x, 87, y, 97, fill="red", state=HIDDEN), drawpad.create_oval(x, 55, y, 65, fill="red", state=HIDDEN), drawpad.create_oval(x2, 55, y2, 65, fill="red", state=HIDDEN)] 


class MyApp(object): 

    def __init__(self, parent): 
     global drawpad 
     self.myParent = parent 
     self.myContainer1 = Frame(parent) 
     self.myContainer1.pack() 

     # Roll Button 
     self.rollButton = Button(self.myContainer1) 
     self.rollButton.configure(text="Roll", background= "green") 
     self.rollButton.grid(row=0,column=0) 

     # Stop Button 
     self.stop = Button(self.myContainer1) 
     self.stop.configure(text="End Turn", background= "green") 
     self.stop.grid(row=0,column=1) 

     # Dice Checkboxes 
     self.var1 = IntVar() 
     c = Checkbutton(root, text="Dice 1",variable = self.var1,command=self.cb) 
     c.grid(row=1,column=0) 
     self.var2 = IntVar() 
     c2 = Checkbutton(root, text="Dice 2",variable = self.var2,command=self.cb2) 
     c2.grid(row=1,column=1) 
     self.var3 = IntVar() 
     c3 = Checkbutton(root, text="Dice 3",variable = self.var3,command=self.cb3) 
     c3.grid(row=1,column=2) 
     self.var4 = IntVar() 
     c4 = Checkbutton(root, text="Dice 4",variable = self.var4,command=self.cb4) 
     c4.grid(row=1,column=3) 
     self.var5 = IntVar() 
     c5 = Checkbutton(root, text="Dice 5",variable = self.var5,command=self.cb5) 
     c5.grid(row=1,column=4) 

     self.rollButton.bind("<Button-1>", self.rollButtonClick) 

     c.pack() 
     c2.pack() 
     c3.pack() 
     c4.pack() 
     c5.pack() 
     drawpad.pack() 

    def cb(self): 
     global check1 
     if(self.var1.get() == 1): 
      check1 = True 
     else: 
      check1 = False 

    def cb2(self): 
     global check2 
     if(self.var2.get() == 1): 
      check2 = True 
     else: 
      check2 = False 

    def cb3(self): 
     global check3 
     if(self.var3.get() == 1): 
      check3 = True 
     else: 
      check3 = False 

    def cb4(self): 
     global check4 
     if(self.var4.get() == 1): 
      check4 = True 
     else: 
      check4 = False 

    def cb5(self): 
     global check5 
     if(self.var5.get() == 1): 
      check5 = True 
     else: 
      check5 = False 

    def rollButtonClick(self, event): 
     global drawpad 
     global roll1 
     global check 
     global check2 
     global check3 
     global check4 
     global check5 
     dice1=0 
     dice2=0 
     dice3=0 
     dice4=0 
     dice5=0 
     diceValues = [dice1,dice2,dice3,dice4,dice5] 
     if(check1==True): 
      dice1 = random.randint(1,6) 
     if(check2==True): 
      dice2 = random.randint(1,6) 
     if(check3==True): 
      dice3 = random.randint(1,6) 
     if(check4==True): 
      dice4 = random.randint(1,6) 
     if(check5==True): 
      dice5 = random.randint(1,6) 
     for i in (0,4,1): 
      if(diceValues[i]==1): 
       drawpad.itemconfig(roll1[i],state=NORMAL) 


app = MyApp(root) 
root.mainloop() 
+0

Этот код, полный 'globals', сумасшедший. Это недостаток Python, у вас много плохого программирования ... Также вы можете подумать о том, чтобы иметь список для длинного перечисления переменных, которые у вас есть с помощью вашего кода ... – nbro

+1

@Xenomorph Я не думаю, что плохое OP дизайн - это ошибка Python ... – jonrsharpe

+0

@Xenomorph Я действительно не знаю, что я делаю, пожалуйста, помогите! И список для каких переменных? –

ответ

3

Вот что я предлагаю:

Фокус на одна вещь, и только одна вещь. Не пытайтесь заставить все кости работать одновременно. Рисунок, как получить один игральные кости. Ничего больше. Нет игровой логики, никаких других кубиков. Прямо сейчас, как будто вы учитесь жонглировать, начиная с 10 мячей. Вам нужно начать с самой простой вещи.

На самом деле, не беспокойтесь обо всех функциональных возможностях костей. Выберите один аспект умирающего и решите это. Выясните, как его нарисовать. ИЛИ, выяснить, как вычислить случайную роль. Решите только одну из этих проблем.

Как только вы решите эту проблему, перейдите к следующему. Итак, если вы можете нарисовать кубик, выяснить, как вычислить рулон и перерисовать кубик. Получите эту работу на 100%. Затем добавьте функцию, которая возвращает текущее значение матрицы.

Затем выясните, как взять все, что вы сделали, и поместить его в класс. Вы хотите, чтобы иметь возможность написать основную логику, чтобы сделать это (и только это):

<import the Die class, or define it here> 
root = Tk() 
drawpad = Canvas(...) 
die = Die(drawpad, x, y) # draw a die at coordinate (x,y) 
die.roll() # roll the die, and redraw it with the value 
print(die.value()) # print out the value 

После того как вы все это, то вы можете начать сосредотачиваться на создании других костей в простом цикле. После этого вы можете сосредоточиться на других частях игры - меню, кнопки и т. Д.

0

Как указано выше, начните с одной вещи. Ниже приведен код для одной матрицы. Вы бы назвали это из другого класса, но для простоты он стоит отдельно. Я использую формулу с мультипликаторами для вычисления позиций точек на матрице, поскольку это проще, и не требует дублирования кода X 5 для шести умирающих. 6 разных цветов присутствуют для тестирования, чтобы определить, на какую из них влияют. Отметим также, что все, что связано с матрицей, содержится в классе.

from Tkinter import * 
import random 


class OneDie(): 
    def __init__(self, drawpad, x1, x2, color): 
     self.drawpad=drawpad 
     self.x1=x1 
     self.x2=x2 
     self.color=color 
     self.dots_location={1:[[0.5, 0.5]], 
          2:[[0.25, 0.25], [0.75, 0.75]], 
          3:[[0.25, 0.25], [0.5, 0.5], [0.75, 0.75]], 
          4:[[0.25, 0.25], [0.25, 0.75], [0.75, 0.25], [0.75, 0.75]], 
          5:[[0.5, 0.5], [0.25, 0.25], [0.25, 0.75], [0.75, 0.25], [0.75, 0.75]], 
          6:[[0.25, 0.25], [0.25, 0.75], [0.75, 0.25], [0.75, 0.75], [0.50, 0.25], [0.50, 0.75]]} 
     self.die = self.drawpad.create_rectangle(x1, 10, x2, 110, fill="red") 
     self.update_this_die(6) ## initialize every die to 6 

    def roll_this_die(self): 
     num=random.randint(1, 6) 
     self.update_this_die(num) 

    def update_this_die(self, num): 
     self.drawpad.delete(self.die) 
     self.die = self.drawpad.create_rectangle(self.x1, 10, self.x2, 110, fill="red") 
     location_list = self.dots_location[num] 
     for ctr in range(len(location_list)): 
      multiplier_x_y = location_list[ctr] 
      x=(self.x2-self.x1)*multiplier_x_y[0]+self.x1-10 ## 10 is 1/2 of circle size 
      y=(110-10)*multiplier_x_y[1] 
      self.drawpad.create_oval(x, y, x+20, y+20, fill=self.color, outline="red") 

root = Tk() 

drawpad = Canvas(root, width=600, height=300) 
drawpad.grid() 
Button(root, text="Exit", command=root.quit, bg="orange").grid(row=100) 

instance_list=[] 
x1=10 
x2=110 
colors=["white", "lightblue", "yellow", "black", "green"] ## identify each die while testing 
for ctr in range(5): 
    OD=OneDie(drawpad, x1, x2, colors[ctr]) 
    x1 += 120 
    x2 += 120 
    instance_list.append(OD) 

## roll each die once 
for instance in instance_list: 
    instance.roll_this_die() 
root.mainloop() 
Смежные вопросы