📜  Python | 接球比赛

📅  最后修改于: 2020-05-20 03:11:10             🧑  作者: Mango

Python是一种多用途语言,几乎可以在所有开发领域中使用。Python也可以用于开发不同类型的游戏。让我们尝试使用Python和TKinter 开发一个简单的接球游戏
游戏很简单。游戏窗口底部有一个栏,可使用游戏窗口中的按钮向左或向右移动。红球会从上到下连续下落,并且可以从任意x轴距离开始。任务是通过向左或向右移动将该杆移到合适的位置,以使红色球落在该杆上(将球捕获到杆上)而不是在地面上。如果玩家将球接在杆上,则得分将增加,该球将消失,并且新的红色球将从随机x轴距离开始从上到下下降。如果玩家错过了在球杆上接球的机会,那么您将输掉比赛,最后计分卡将出现在比赛窗口中。

方法:

  1. 在Python中使用Tkinter包构建GUI(图形用户界面)。
  2. 使用Canvas在Python中绘制对象– Canvas是用于绘制图片或其他复杂布局的矩形区域。我们可以在Canvas上放置图形,文本,小部件或框架。语法:
    w = Canvas ( master, option=value, ... )

    参数:

    master-这代表父窗口。
    options-此小部件最常用的选项列表。
    这些选项可以用作以逗号分隔的键/值对。
    示例-宽度,高度等
  3. 使用canvas.create_oval 创建圆。
    create_oval在给定的坐标处创建一个圆或一个椭圆。它需要两对坐标。椭圆的边界矩形的左上角和右下角。语法:
    oval = canvas.create_oval(x0, y0, x1, y1, options
  4. 使用canvas.create_rectangle创建条形图。
    create_rectangle在给定的坐标处创建一个矩形。它需要两对坐标。左上角和右下角坐标。语法:
    oval = canvas.create_rectangle(x0, y0, x1, y1, options)
  5. 使用canvas.move移动球或棒。
    canvas.move使对象可以使用指定的(x,y)坐标移动。语法:
    move=canvas.move(name of object, x, y)

    注意: *将 x = 0仅沿垂直方向移动球,将y = 0仅沿水平方向移动球。*当球接触canvas.delete(object)时,使球与地面或杆分离。

  6. 使用“按钮”向前或向后移动栏,然后在其上应用动作事件。

Python代码:

# 用于接球的Python代码
# 导入合适的包
from tkinter import Tk,Button,Label
from tkinter import Canvas
from random import randint
# 从Tkinter定义Tk
root = Tk()
root.title("Catch the ball Game")
root.resizable(False,False)
# 用于定义画布
canvas = Canvas(root, width=600, height=600)
canvas.pack()
# 球移动的垂直距离#的变量
limit = 0
# 变量距x轴的水平距离的变量
dist = 5
# 分数变量
score = 0
# 创造和移动球类
class Ball:
    # 用于在画布上创建球
    def __init__(self, canvas, x1, y1, x2, y2):
        self.x1 = x1
        self.y1 = y1
        self.x2 = x2
        self.y2 = y2
        self.canvas = canvas
        # 用于创建球对象
        self.ball = canvas.create_oval(self.x1, self.y1, self.x2, self.y2,
                                                fill = "red",tags = 'dot1')
    # 用于移动球
    def move_ball(self):
        # 定义偏移
        offset = 10
        global limit
        # 检查球是否落在地面或杆上
        if limit >= 510:
            global dist,score,next
            # 检查球落在杆上
            if(dist - offset <= self.x1 and
               dist + 40 + offset >= self.x2):
                # 增加分数
                score += 10
                # 消失的球
                canvas.delete('dot1')
                # 调用该函数以再次创建球对象
                ball_set()
            else:
                # 消失的球
                canvas.delete('dot1')
                bar.delete_bar(self)
                # 显示分数
                score_board()
            return
        # 使球移动的垂直距离增量
        limit += 1
        # 通过取x = 0和y = deltay在垂直方向上移动球
        self.canvas.move(self.ball,0,1)
        # for continuous moving of ball again call move_ball
        self.canvas.after(10,self.move_ball)
# 创建和移动栏的类
class bar:
    # 创建栏的方法
    def __init__(self,canvas,x1,y1,x2,y2):
        self.x1 = x1
        self.y1 = y1
        self.x2 = x2
        self.y2 = y2
        self.canvas = canvas
        # for creating bar using create_rectangle
        self.rod=canvas.create_rectangle(self.x1, self.y1, self.x2, self.y2,
                                                  fill="yellow",tags='dot2')
    # 条移动方法
    def move_bar(self,num):
        global dist
        # 检查前进或后退按钮
        if(num == 1):
            # 通过获取x轴正距离并获取垂直距离y = 0来向前移动bar
            self.canvas.move(self.rod,20,0)
            # 从x轴增加bar的距离
            dist += 20
        else:
            # 通过取x轴负距离并取垂直距离y = 0向后移动bar
            self.canvas.move(self.rod,-20,0)
            # 减少bar与x轴的距离
            dist-=20
    def delete_bar(self):
        canvas.delete('dot2')
# 定义球尺寸的功能
def ball_set():
    global limit
    limit=0
    # 从球开始掉落的位置开始的随机x轴距离
    value = randint(0,570)
    # define the dimensions of the ball
    ball1 = Ball(canvas,value,20,value+30,50)
    # 球移动的函数
    ball1.move_ball()
# 游戏结束后显示分数的功能
def score_board():
    root2 = Tk()
    root2.title("Catch the ball Game")
    root2.resizable(False,False)
    canvas2 = Canvas(root2,width=300,height=300)
    canvas2.pack()
    w = Label(canvas2,text="\nOOPS...GAME IS OVER\n\nYOUR SCORE = "
                                            + str(score) + "\n\n")
    w.pack()
    button3 = Button(canvas2, text="PLAY AGAIN", bg="green",
                           command=lambda:play_again(root2))
    button3.pack()
    button4 = Button(canvas2,text="EXIT",bg="green",
                     command=lambda:exit_handler(root2))
    button4.pack()
# 处理再次播放请求的函数
def play_again(root2):
    root2.destroy()
    main()
# 处理退出请求的函数
def exit_handler(root2):
    root2.destroy()
    root.destroy()
# 主函数
def main():
    global score,dist
    score = 0
    dist = 0
    # 定义钢筋的尺寸
    bar1=bar(canvas,5,560,45,575)
    # 定义按钮的文本,颜色以及通过单击适当的方法在单击按钮后定义操作
    button = Button(canvas,text="==>", bg="green",
                    command=lambda:bar1.move_bar(1))
    # 将按钮放置在画布上的适当位置
    button.place(x=300,y=580)
    button2 = Button(canvas,text="<==",bg="green",
                     command=lambda:bar1.move_bar(0))
    button2.place(x=260,y=580)
    # 调用定义球尺寸的函数
    ball_set()
    root.mainloop()
# 测试代码
if(__name__=="__main__"):
    main()