首页 > 编程问答 >有人可以帮我完成我作为我的第一个基本游戏编写的代码吗?

有人可以帮我完成我作为我的第一个基本游戏编写的代码吗?

时间:2024-08-01 04:02:24浏览次数:16  
标签:python tkinter overlapping

最近,我做了一个项目,基本上是一只飞扬的小鸟(有点),你可以使用箭头键上下左右移动来躲避障碍物,我编写了用于创建和移动障碍物的代码。但它不起作用。

我尝试搜索网络和所有内容,但仍然无法解决它。要了解我的期望,请参阅我从头开始制作的这个项目 - Dodging Game

from itertools import cycle
from random import randrange
from tkinter import Canvas, Tk, messagebox, font

canvas_width = 1400
canvas_height = 700

root = Tk()
root.title("Basic Jumper Game")

c = Canvas(root, width=canvas_width, height=canvas_height, background="sky blue")
c.create_rectangle(-5, canvas_height - 100, canvas_width + 5, canvas_height + 5, fill="forest green", width=0)
c.create_oval(-80, -80, 120, 120, fill='orange', width=0)
c.pack()

color_cycle = cycle(["red2", "yellow", "lime green", "deep sky blue"])

spike_score = 10
spike_speed = 5
spike_interval = 4000
jumper = c.create_rectangle(50, 547, 100, 597, fill='cyan', outline='dark turquoise', width=8)
game_font = font.nametofont("TkFixedFont")
game_font.config(size=30)

score = 0
score_text = c.create_text(575, 10, anchor="nw", font=game_font, fill="black", text="Score: " + str(score))
spikes = []
lives = 1


def create_spike():
    y = randrange(0, 100)
    new_spike = c.create_rectangle(1300, 600 - y, 1400, 200 - y, fill='red2', outline='red', width=4)
    spikes.append(new_spike)
    root.after(spike_interval, create_spike)


def move_spikes():
    for spike in spikes:
        (spikex, spikey, spikex2, spikey2) = c.coords(spike)
        c.move(spike, -5, 0)
        if spikex2 < 0:
            spike_cleared(spike)
    root.after(spike_speed, move_spikes)


def spike_cleared(spike):
    spikes.remove(spike)
    c.delete(spike)
    (jumperx, jumpery, jumperx2, jumpery2) = c.coords(jumper)
    (spikex, spikey, spikex2, spikey2) = c.coords(spike)
    if jumper.colliderect(spike):
        lose_a_life()
        if lives == 0:
            messagebox.showinfo("Game Over!", "Final Score: " + str(score))
        root.destroy()


def lose_a_life():
    global lives
    lives -= 1


def move_up(event):
    (x1, y1, x2, y2) = c.coords(jumper)
    if y1 > 0:
        c.move(jumper, 0, -20)
    if y1 < 8:
        c.move(jumper, 0, 20)


def move_down(event):
    (x1, y1, x2, y2) = c.coords(jumper)
    if y1 > 0:
        c.move(jumper, 0, 20)

    if y2 > 577:
        c.move(jumper, 0, -20)


def move_left(event):
    (x1, y1, x2, y2) = c.coords(jumper)
    if x1 > 0:
        c.move(jumper, -20, 0)


def move_right(event):
    (x1, y1, x2, y2) = c.coords(jumper)
    if x2 < canvas_width:
        c.move(jumper, 20, 0)


c.bind("<Up>", move_up)
c.bind("<Down>", move_down)
c.bind("<Left>", move_left)
c.bind("<Right>", move_right)
c.focus_set()

root.after(1000, create_spike)
root.after(1000, move_spikes)
root.mainloop()

该代码似乎没有正确检测尖刺与玩家之间的碰撞。另外,你没有增加分数,而且你尝试检测碰撞的方式有点问题。以下是对代码的更正,可以使其按预期工作:

from itertools import cycle
from random import randrange
from tkinter import Canvas, Tk, messagebox, font

canvas_width = 1400
canvas_height = 700

root = Tk()
root.title("Basic Jumper Game")

c = Canvas(root, width=canvas_width, height=canvas_height, background="sky blue")
c.create_rectangle(-5, canvas_height - 100, canvas_width + 5, canvas_height + 5, fill="forest green", width=0)
c.create_oval(-80, -80, 120, 120, fill='orange', width=0)
c.pack()

color_cycle = cycle(["red2", "yellow", "lime green", "deep sky blue"])

spike_width = 100
spike_score = 10
spike_speed = 5
spike_interval = 4000
jumper = c.create_rectangle(50, 547, 100, 597, fill='cyan', outline='dark turquoise', width=8)
game_font = font.nametofont("TkFixedFont")
game_font.config(size=30)

score = 0
score_text = c.create_text(575, 10, anchor="nw", font=game_font, fill="black", text="Score: " + str(score))
spikes = []
lives = 1


def create_spike():
    y = randrange(0, 100)
    new_spike = c.create_rectangle(1300, 600 - y, 1400, 200 - y, fill='red2', outline='red', width=4)
    spikes.append(new_spike)
    root.after(spike_interval, create_spike)


def move_spikes():
    global score
    for spike in spikes:
        (spikex, spikey, spikex2, spikey2) = c.coords(spike)
        c.move(spike, -spike_speed, 0)
        if spikex2 < 0:
            c.delete(spike)
            spikes.remove(spike)
            score += spike_score
            c.itemconfig(score_text, text="Score: " + str(score))
        if detect_collision(jumper, spike):
            lose_a_life()

    root.after(spike_speed, move_spikes)


def detect_collision(jumper, spike):
    jumper_coords = c.coords(jumper)
    spike_coords = c.coords(spike)
    if jumper_coords[2] > spike_coords[0] and jumper_coords[0] < spike_coords[2]:
        if jumper_coords[3] > spike_coords[1] and jumper_coords[1] < spike_coords[3]:
            return True
    return False


def spike_cleared(spike):
    spikes.remove(spike)
    c.delete(spike)


def lose_a_life():
    global lives
    lives -= 1
    if lives == 0:
        messagebox.showinfo("Game Over!", "Final Score: " + str(score))
        root.destroy()


def move_up(event):
    (x1, y1, x2, y2) = c.coords(jumper)
    if y1 > 0:
        c.move(jumper, 0, -20)
    if y1 < 8:
        c.move(jumper, 0, 20)


def move_down(event):
    (x1, y1, x2, y2) = c.coords(jumper)
    if y1 > 0:
        c.move(jumper, 0, 20)

    if y2 > 577:
        c.move(jumper, 0, -20)


def move_left(event):
    (x1, y1, x2, y2) = c.coords(jumper)
    if x1 > 0:
        c.move(jumper, -20, 0)


def move_right(event):
    (x1, y1, x2, y2) = c.coords(jumper)
    if x2 < canvas_width:
        c.move(jumper, 20, 0)


c.bind("<Up>", move_up)
c.bind("<Down>", move_down)
c.bind("<Left>", move_left)
c.bind("<Right>", move_right)
c.focus_set()

root.after(1000, create_spike)
root.after(1000, move_spikes)
root.mainloop()

这些更改包括:

  1. detect_collision 函数: 此函数已添加以专门检查玩家与尖刺之间的碰撞,使用两个对象的坐标。
  2. move_spikes 函数: 此函数现在调用 detect_collision 来检查是否有碰撞。如果是,则调用 lose_a_life 函数。
  3. 分数增加: 当一个尖刺离开屏幕时,现在会增加分数。
  4. 代码清理: 一些不必要的代码已被删除或简化。

通过这些更改,该游戏现在应该能够按预期工作,正确检测碰撞和增加分数。

标签:python,tkinter,overlapping
From: 78818141

相关文章

  • 在Python中,如何在一段时间内接受输入
    我正在尝试用Python制作一个蛇游戏,但不知道如何制作它,以便蛇在没有玩家输入的情况下继续移动,所以如果有人知道一个简单的方法来做到这一点,我需要在2秒后取消输入将不胜感激代码如下:importrandomimportsysplayerY=(1)playerX=(0)appleY=random.randint(1,10)appl......
  • 在Python中单步执行代码时是否可以引发异常
    当我在IDE(例如PyCharm)中单步执行代码时,我想转储函数的参数(以供以后使用,例如复制它)。计划的场景是在某处设置断点,然后引发异常(这不在我运行的代码中,这就是重点),并捕获它。代码应该如下所示:defexception_cathcher_decorator(func):try:returnfunc(*f_args,**f_k......
  • 解决python自动化操作异常处理的问题
    在python自动化领域,往往要用到pyautogui,pywin32等模块实现自动化操作。然而,这种自动化操作,本身具有一定的局限性,其中最主要的一个问题就是,一旦执行结果不按照脚本预设的来执行,往往会抛出异常,导致程序中断。解决这个问题,主要有这么几种思路:第一,每一次操作后分情况讨论。这种方......
  • Python爬虫入门03:用Urllib假装我们是浏览器
    文章目录引言Urllib库简介Request模块详解Error模块与异常处理Parse模块与URL解析Robotparser模块模拟浏览器请求使用Request方法添加请求头信息代码示例1.设置请求URL和请求头2.定义请求参数并转换为适当的格式3.使用Request方法封装请求4.发送请求并获取响应常用......
  • 请以零基础学Python 之 第二十讲 分组和贪婪匹配
    当我们处理字符串时,有时候需要根据特定的模式来分割或者提取信息。Python提供了强大的正则表达式库re,可以帮助我们实现这些复杂的字符串操作。本篇博客将介绍两个常用的正则表达式技巧:分组和贪婪匹配。分组(Grouping)在正则表达式中,分组是将多个模式单元组合为一个单元,以便......
  • 零基础学python 之 第十九讲 正则表达式
    当你开始学习Python编程时,正则表达式是一项非常强大的工具,用于处理文本数据中的模式匹配和搜索。本篇博客将带你从零开始学习如何在Python中使用正则表达式。1.什么是正则表达式?正则表达式(RegularExpression)是用于描述字符串模式的一种工具,可以用来匹配、查找、替换符合特......
  • python之贪吃蛇
    废话不多说,直接上代码(确保已经安装pygame)importpygameimportrandom#基础设置#屏幕高度SCREEN_HEIGHT=480#屏幕宽度SCREEN_WIDTH=600#小方格大小GRID_SIZE=20#颜色设置WHITE=(255,255,255)BLACK=(0,0,0)GREEN=(0,255,0)#初始化Pyg......
  • Python - Context Managers
    withstatementHereisthesyntaxofthewithstatement:withexpressionasvar:statementsTheexpressionshouldbeacontextmanagerobject,oritshouldproduceacontextmanagerobject.Whenthiswithstatementisexecuted,thefirstthingthat......
  • python装饰器
    一前言环境:win10python3.10二函数中的函数如果定义了一个函数A,现在想在不影响函数A原先功能的情况下,新增加一些额外的功能,怎么办,下面是一个例子如上,本来原先执行test_except那句话只会打印over那句话,但现在执行test_except却会输出一些另外的东西这其中有个巧妙地东西就......
  • Python - Built-in Exceptions: Python Exceptions Class Hierarchy
     Figure20.4:Built-inexceptionsTheclassBaseExceptionisthebaseclassofallthebuilt-inexceptionclasses.FromBaseException,fourclassesnamedException,SystemExit,KeyboardInterruptandGeneratorExitarederived.Alltheremainingbuilt-in......