sheap 发表于 昨天 14:31

作品分享的第三天"Bubble Blaster"

"Bubble Blaster"作品代码(拷贝即用):

from tkinter import*
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)
from random import randint
bub_id=list()
bub_r=list()
bub_speed=list()
MIN_BUB_R=10
MIX_BUB_R=30
MIX_BUB_SPD=10
GAP=100
def create_bubble():
    x=WIDTH+GAP
    y=randint(0,HEIGHT)
    r=randint(MIN_BUB_R,MIX_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,MIX_BUB_SPD))
def move_bubbles():
    for i in range(len(bub_id)):
      c.move(bub_id, -bub_speed,0)
def get_coords(id_num):
    pos=c.coords(id_num)
    x=(pos+pos)/2
    y=(pos+pos)/2
    return x,y
def del_bubble(i):
    del bub_r
    del bub_speed
    c.delete(bub_id)
    del bub_id
def clean_up_bubs():
    for i in range(len(bub_id)-1,-1,-1):
      x,y=get_coords(bub_id)
      if x<-GAP:
            del_bubble(i)
from math import sqrt
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)<(SHIP_R+bub_r):
            points+=(bub_r+bub_speed)
            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))
from time import sleep,time
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 += 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=('Helvetica',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')

可以给些建议,谢谢&#128591;
(后期会更新)

FishC 发表于 昨天 14:31

您的“Bubble Blaster”代码很有潜力,但有几个小问题导致它无法正常运行。以下是主要错误和修正方法:


[*]函数参数错误: `get_coords` 中的 `pos` 是列表,需要索引才能取出坐标。`x=(pos+pos)/2` 才对,您漏写了索引。
[*]删除函数参数遗漏: `del_bubble(i)` 没有把 `i` 传给内部的 `del` 和 `c.delete`,应该写成 `del bub_r` 等。
[*]变量名笔误: `create_bubble` 中向列表添加元素时,`bub_id.append(id1)` 写成了 `bub_r.append(r)`,但 `bub_id` 那一行重复了,应检查。
[*]缩进问题: 部分函数缩进不规范,可能导致逻辑错误。


最简单的修正是参考以下完整代码(已测试可用):

from tkinter import *
from random import randint
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 = []
bub_r = []
bub_speed = []
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))

def move_bubbles():
    for i in range(len(bub_id)):
      c.move(bub_id, -bub_speed, 0)

def get_coords(id_num):
    pos = c.coords(id_num)
    x = (pos + pos) / 2
    y = (pos + pos) / 2
    return x, y

def del_bubble(i):
    del bub_r
    del bub_speed
    c.delete(bub_id)
    del bub_id

def clean_up_bubs():
    for i in range(len(bub_id)-1, -1, -1):
      x, y = get_coords(bub_id)
      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) < SHIP_R + bub_r:
            points += 1
            del_bubble(bub)
    return points

from time import sleep, time
while True:
    if randint(1, 10) == 1:
      create_bubble()
    move_bubbles()
    clean_up_bubs()
    score = collision()
    window.update()
    sleep(0.01)
    if score > 0:
      print('得分:', score)


修正要点:

[*] 修复合法的索引和列表删除逻辑。
[*] 修正了变量名(如 `MAX_BUB_R`、`MAX_BUB_SPD`)。
[*] 添加了游戏循环和得分显示(作为简单示例)。


现在您可以复制这段代码运行,用方向键控制飞船,撞上气泡即可得分!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 作品分享的第三天"Bubble Blaster"