2014-10-03 103 views
0

我试图解决这一问题的代码:不支持的操作数类型(S)为+: '诠释' 和 'NoneType'

from tkinter import * 
from random import randint 
from time import sleep, time 
from math import sqrt 
HEIGHT = 500 
WIDTH = 800 
window = Tk() 
window.title('Bubble Blaster') 
c = Canvas(window, width=WIDTH, height=HEIGHT, bg='darkblue') 
c.pack() 
ship_id = c.create_polygon(5, 5, 5, 25, 30, 15, fill='red') 
ship_id2 = c.create_oval(0, 0, 30, 30, outline='red') 
SHIP_R = 15 
MID_X = WIDTH/2 
MID_Y = HEIGHT/2 
c.move(ship_id, MID_X, MID_Y) 
c.move(ship_id2, MID_X, MID_Y) 
SHIP_SPD = 10 
def move_ship(event): 
    if event.keysym == 'Up': 
     c.move(ship_id, 0, -SHIP_SPD) 
     c.move(ship_id2, 0, -SHIP_SPD) 
elif event.keysym == 'Down': 
    c.move(ship_id, 0, SHIP_SPD) 
    c.move(ship_id2, 0, SHIP_SPD) 
elif event.keysym == 'Left': 
    c.move(ship_id, -SHIP_SPD, 0) 
    c.move(ship_id2, -SHIP_SPD, 0) 
elif event.keysym == 'Right': 
    c.move(ship_id, SHIP_SPD, 0) 
    c.move(ship_id2, SHIP_SPD, 0) 
c.bind_all('<Key>', move_ship) 
bub_id = list() 
bub_r = list() 
bub_speed = list() 
MIN_BUB_R = 10 
MAX_BUB_R = 30 
MAX_BUB_SPD = 10 
GAP = 100 
def create_bubble(): 
    x = WIDTH + GAP 
    y = randint(0, HEIGHT) 
    r = randint(MIN_BUB_R, MAX_BUB_R) 
    id1 = c.create_oval(x - r, y - r, x + r, y + r, outline='white') 
    bub_id.append(id1) 
    bub_r.append(r) 
    bub_speed.append(randint(1, MAX_BUB_SPD)) 
    `enter code here`def move_bubbles(): 
    for i in range(len(bub_id)): 
     c.move(bub_id[i], -bub_speed[i], 0) 
def get_coords(id_num): 
    pos = c.coords(id_num) 
    x = (pos[0] + pos[2])/2 
    y = (pos[1] + pos[3])/2 
    return x, y 
def del_bubble(i): 
    del bub_r[i] 
    del bub_speed[i] 
    c.delete(bub_id[i]) 
    del bub_id[i] 
def clean_up_bubs(): 
    for i in range(len(bub_id)-1, -1, -1): 
     x, y = get_coords(bub_id[i]) 
     if x < -GAP: 
      del_bubble(i) 
def distance(id1, id2): 
    x1, y1 = get_coords(id1) 
    x2, y2 = get_coords(id2) 
    return sqrt((x2 - x1)**2 + (y2 - y1)**2) 
def collision(): 
    points = 0 
    for bub in range(len(bub_id)-1, -1, -1): 
     if distance(ship_id2, bub_id[bub]) < (SHIP_R + bub_r[bub]): 
      points += (bub_r[bub] + bub_speed[bub]) 
      del_bubble(bub) 
     return points 
c.create_text(50, 30, text='TIME', fill='white') 
c.create_text(150, 30, text='SCORE', fill='white') 
time_text = c.create_text(50, 50, fill='white') 
score_text = c.create_text(150, 50, fill='white') 
def show_score(score): 
    c.itemconfig(score_text, text=str(score)) 
def show_time(time_left): 
    c.itemconfig(time_text, text=str(time_left)) 
BUB_CHANCE = 10 
TIME_LIMIT = 30 
BONUS_SCORE = 1000 
score = 0 
bonus = 0 
end = time() + TIME_LIMIT 
#MAIN GAME LOOP 
while time() < end: 
    if randint(1, BUB_CHANCE) == 1: 
     create_bubble() 
    move_bubbles() 
    clean_up_bubs() 
    score = score + collision() 
    if (int(score/BONUS_SCORE)) > bonus: 
     bonus += 1 
     end += TIME_LIMIT 
    show_score(score) 
    show_time(int(end - time())) 
    window.update() 
    sleep(0.01) 
c.create_text(MID_X, MID_Y, \ 
       text='GAME OVER', fill='white', font=('Helvietica', 30)) 
c.create_text(MID_X, MID_Y + 30, \ 
       text='Score: '+ str(score), fill='white') 
c.create_text(MID_X, MID_Y + 45, \ 
       text='Bonus time: '+ str(bonus*TIME_LIMIT), fill='white') 

而且我得到这个错误:

Traceback (most recent call last): 
    File "C:\Python34\Bubble Blaster.py", line 97, in <module> 
    score = score + collision() 
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType' 

我已经弄清楚它的含义了;这意味着其中一个变量不是整数。我不知道如何解决它。我认为主要问题区域是:

def collision(): 
     points = 0 
     for bub in range(len(bub_id)-1, -1, -1): 
      if distance(ship_id2, bub_id[bub]) < (SHIP_R + bub_r[bub]): 
       points += (bub_r[bub] + bub_speed[bub]) 
       del_bubble(bub) 
      return points 

我的python版本是3.4.1。现在

回答

2
 
Traceback (most recent call last): 
    File "C:\Python34\Bubble Blaster.py", line 97, in 
    score = score + collision() 
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType' 

NoneTypeNone对象的类型。所以,错误表示collision()返回None。让我们看看它的实现。

def collision(): 
    points = 0 
    for bub in range(len(bub_id)-1, -1, -1): 
     if distance(ship_id2, bub_id[bub]) < (SHIP_R + bub_r[bub]): 
      points += (bub_r[bub] + bub_speed[bub]) 
      del_bubble(bub) 
     return points 

如果return发言中所执行的,那么int会被退回。如果函数在没有遇到return语句时终止,则该函数隐式返回None。这一定是发生在这里的事情。而且只有在for循环没有被输入时才会发生。

我没有试图提出解决问题的办法,只是为了诊断其原因。

+0

对于python新手来说,值得一提的是,当执行程序发现范围的末尾没有显式的'return'时,函数会返回一个隐含的'None'。 – 2014-10-03 14:18:45

+0

@BrianCain完成 – 2014-10-03 14:20:13

0

我修好了!我改变

def collision(): 
    points = 0 
    for bub in range(len(bub_id)-1, -1, -1): 
     if distance(ship_id2, bub_id[bub]) < (SHIP_R + bub_r[bub]): 
      points += (bub_r[bub] + bub_speed[bub]) 
      del_bubble(bub) 
     return points 

def collision(): 
     points = 0 
     for bub in range(len(bub_id)-1, -1, -1): 
      if distance(ship_id2, bub_id[bub]) < (SHIP_R + bub_r[bub]): 
       points += (bub_r[bub] + bub_speed[bub]) 
       del_bubble(bub) 
     return points 

和现在的作品!

相关问题