python 实现弹球游戏的示例代码

运行效果

实现代码

# -*- coding: utf-8 -*-
import tkinter as tkinter
import tkinter.messagebox as mb
import random,time

class Ball():
  '''
  创建Ball类,初始化对象,即创建对象设置属性,
  init函数是在对象被创建的同时就设置属性的一种方法,Python会在创建新对象时自动调用这个函数。
  '''

  def __init__(self,canvas,paddle,score,color,init_x=100,init_y=100):
    '''
    Ball类初始化属性
    :param canvas:画布
    :param paddle:球拍
    :param score:得分
    :param color:小球的颜色
    :param init_x:小球球的初始横坐标,有默认值,可不传
    :param init_y:小球球的初始纵坐标,有默认值,可不传
    '''
    self.canvas = canvas
    self.paddle = paddle
    self.score = score
    self.color = color

    # 保存tkinter画小球返回的id,为后期移动屏幕上的小球做准备,
    # 参数分别表示为:(10,10)表示左上角x,y坐标,(30,30)表示右下角x,y坐标,即创建一个直径为20的圆
    # fill为小球的填充色
    self.id = canvas.create_oval(10,10,30,30,fill=self.color)
    # 将小球移动到初始位置,初始位置可通过传参进行更改,有默认值
    self.canvas.move(self.id,init_x,init_y)

    # 给一串x分量的起始值(x和y代表横坐标和纵坐标的分量)
    starts = [-3,-2,-1,1,2,3]
    # shuffle() 方法将序列的所有元素随机排序
    random.shuffle(starts)
    # 随机混排序,赋值给对象变量x,让它起始的时候获得随机分量值,引起球每次起始角度都不同
    self.x = starts[0]
    # 对象变量y就是垂直分量移动的初始值,等价于上下移动,值代表移动多少像素点
    self.y = -3

    # winfo_height()函数来获取画布当前的高度,赋值给对象变量
    self.canvas_height = self.canvas.winfo_height()
    # winfo_width()函数来获取画布当前的宽度,赋值给对象变量
    self.canvas_width = self.canvas.winfo_width()
    # 小球是否碰触到画布底部,初始值为False,即没有碰到
    self.hit_bottom = False

  def draw(self):
    '''
    该函数用于让小球水平和垂直运动,在运动的过程中,判断是否得分、游戏是否结束
    '''
    # 让小球可以水平和垂直运动
    self.canvas.move(self.id,self.x,self.y)
    # coords函数通过id返回画布球的坐标列表(两个坐标,左上角的坐标和右下角的两个坐标)
    position = self.canvas.coords(self.id)
    # 判断小球是否撞到画布顶部或者底部,保证小球反弹回去,不消失
    if position[1] <= 0: # 如果小球的左上角y坐标小于0,则向下移动3个像素
      self.y = 3
    if position[3] >= self.canvas_height: # 如果小球的右下角y坐标大于画布宽度,则表示小球碰到了画布底部,游戏结束
      self.hit_bottom = True
    if self.hit_paddle(position) == True: # 判断 球 是否碰到了 球拍,如果碰到了则使小球回弹
      self.y = -3
    if position[0] <= 0: # 如果小球的左上角x坐标 小于等于0,则向右移动3个像素
      self.x = 3
    if position[2] >= self.canvas_width: # 如果小球的右下角x坐标 大于等于画布宽度,则向左移动3个像素
      self.x = -3

  def hit_paddle(self,position):
    '''
    该函数用于判断 球 是否碰到了 球拍,如果碰到了则使小球回弹,否则游戏结束
    :param position:小球的坐标
    '''
    # 获取球拍在画布的坐标,返回一个数组(两个坐标,左上角的坐标和右下角的两个坐标)
    paddle_position = self.canvas.coords(self.paddle.id)
    print ('paddle_position:',paddle_position[0],paddle_position[1],paddle_position[2],paddle_position[3])
    # 如果小球的右下角x坐标 大于等于 球拍左上角x坐标,且小球左上角x坐标 小于等于 球拍右下角x坐标
    if position[2] >= paddle_position[0] and position[0] <= paddle_position[2]:
      # 如果小球右下角y坐标 大于等于 球拍左上角y坐标,且小球右下角y坐标 小于等于 球拍右下角坐标
      if position[3] >= paddle_position[1] and position[3] <= paddle_position[3]:
        # 横坐标 等于
        self.x += self.paddle.x
        colors = ['red','green']
        # shuffle() 方法将序列的所有元素随机排序,以便随机获得小球颜色
        random.shuffle(colors)
        self.color= colors[0]
        #
        self.canvas.itemconfig(self.id,fill=colors[0])
        # 计算得分并展示,且同时将小球的颜色、关卡颜色同步
        self.score.hit(ball_color = self.color)
        self.canvas.itemconfig(self.paddle.id,fill=self.color)
        # 增加或减少球拍的宽度
        self.adjust_paddle(paddle_position)
        return True

    return False

  def adjust_paddle(self,paddle_position):
    '''
    该函数用于增加或减少球拍的宽度
    :paddle_position:球拍的位置坐标
    '''
    # 球拍每次的增量大小
    paddle_grow_length = 30
    # 球拍的宽度 = 球拍的右下角x坐标 - 球拍的左上角x坐标
    paddle_width = paddle_position[2] - paddle_position[0]
    if self.color == 'red': # 如果当前球的颜色为红色
      if paddle_width > 30: # 如果球拍的宽度大于60
        if paddle_position[2] >= self.canvas_width: # 如果球拍右下角的x坐标 大于等于 画布宽度
          # 球拍右下角x坐标 = 球拍右下角x坐标 - 增量值
          paddle_position[2] = paddle_position[2] - paddle_grow_length
        else:
          # 球拍的左上角x坐标 = 球拍的左上角x坐标 + 增量值
          paddle_position[0] = paddle_position[0] + paddle_grow_length

    elif self.color == 'green': # 如果当前球的颜色为绿色
      if paddle_width < 300: # 如果球拍的宽度小于300
        if paddle_position[2] >= self.canvas_width: # 如果球拍的右下角x坐标 大于等于 画布宽度
          # 球拍左上角x坐标 - 增量值
          paddle_position[0] = paddle_position[0] - paddle_grow_length
        else:
          # 球拍右下角x坐标 + 增量值
          paddle_position[2]=paddle_position[2]+paddle_grow_length

class Paddle:
  '''
  球拍类
  '''
  def __init__(self,canvas,color):
    '''
    :param canvas:画布
    :param color:球拍的颜色
    '''
    self.canvas = canvas
    # winfo_width()函数来获取画布当前的宽度,赋值给对象变量
    self.canvas_width = self.canvas.winfo_width()
    # winfo_height()函数来获取画布当前的高度,赋值给对象变量
    self.canvas_height = self.canvas.winfo_height()
    # 保存tkinter画球拍时返回的id,为后期移动屏幕上的球拍做准备,
    # create_rectangle 画矩形,fill为球拍的颜色
    self.id = canvas.create_rectangle(0,0,180,15,fill=color)
    # 将球拍移动至初始位置
    self.canvas.move(self.id,200,self.canvas_height*0.75)
    # 设置对象变量x,初始值为0.也就是球拍先不移动
    self.x = 0
    # 游戏是否开始,默认为Flase,即 不开始
    self.started = False
    # 是否继续游戏,默认值为 否
    self.continue_game = False
    # 初始化时将事件‘按下左键'和函数向左移动绑定
    self.canvas.bind_all('<KeyPress-Left>',self.turn_left)
    # 初始化时将事件‘按下右键'和函数向右移动绑定
    self.canvas.bind_all('<KeyPress-Right>',self.turn_right)
    # 初始化时将事件‘按下Enter键'和函数继续游戏绑定
    self.canvas.bind_all('<KeyPress-Enter>',self.continue_game)
    # 按任意键开始游戏
    self.canvas.bind_all('<Button-1>',self.start_game)
    # 初始化时将事件‘按下space键'和函数暂停游戏绑定
    self.canvas.bind_all('<space>',self.pause_game)

  def turn_left(self,event):
    '''
    该函数用于向左移动时,
    '''
    # 获取球拍的位置坐标
    position = self.canvas.coords(self.id)
    # 如果球拍的左上角x坐标 小于 0
    if position[0] <= 0:
      # 则再次按向左移动时,移动距离为0
      self.x = 0
    else:
      # 每次向左移动3个像素
      self.x = -3

  def turn_right(self,event):

    # 获取球拍的位置坐标
    position = self.canvas.coords(self.id)
    # 如果球拍的右下角x坐标 大于等于 画布宽度
    if position[2] >= self.canvas_width:
      # 则再次按向右移动时,移动距离为0
      self.x = 0
    else:
      # 每次向右移动3个像素
      self.x = 3

  def start_game(self,evt):
    self.started = True

  def pause_game(self,evt):
    if self.started:
      self.started=False
    else:
      self.started=True

  def draw(self):
    '''
    该函数用于移动球拍
    '''
    # 球拍类可以水平移动
    self.canvas.move(self.id,self.x,0)
    # 获取球拍的位置坐标
    position = self.canvas.coords(self.id)
    # 如果球拍左上角x坐标小于等于0,则停止移动
    if position[0] <= 0:
      self.x = 0
    # 如果球拍右下角x坐标大于等于0,则停止移动
    elif position[2] >= self.canvas_width:
      self.x = 0

class Score():
  '''
  得分类
  '''
  def __init__(self,canvas,color):
    '''
    初始化得分类
    :param canvas:画布
    :param color:得分文本的颜色
    '''
    # 初始化得分为0
    self.score = 0
    # 把参数canvas赋值给对象变量canvas
    self.canvas = canvas
    # winfo_width()函数来获取画布当前的宽度,赋值给对象变量
    self.canvas_width = self.canvas.winfo_width()
    # winfo_height()函数来获取画布当前的高度,赋值给对象变量
    self.canvas_height = self.canvas.winfo_height()
    # 创建文本控件,用户保存用户保存得分
    self.id = canvas.create_text(self.canvas_width-150,10,text='score:0',fill=color,font=(None, 18, "bold"))
    # 用户保存游戏的关卡颜色
    self.note = canvas.create_text(self.canvas_width-70,10,text='--',fill='red',font=(None, 18, "bold"))

  def hit(self,ball_color='grey'):
    '''
    该函数用于将计算得分并展示,且同时将小球的颜色、关卡颜色同步
    :param ball_color:小球的颜色,默认为'grey'
    '''
    # 得分递增
    self.score += 1
    # 将得分展示在文本控件中
    self.canvas.itemconfig(self.id,text='score:{}'.format(self.score))
    # 将小球的颜色同步至游戏关卡的颜色
    if ball_color == 'red':
      self.canvas.itemconfig(self.note,text='{}-'.format('W'),fill='red')
    elif ball_color=='green':
      self.canvas.itemconfig(self.note,text='{}+'.format('W'),fill='green')
    else:
      self.canvas.itemconfig(self.note,text='--',fill='grey')

def main():
  # tkinter.Tk()类创建一个tk对象,它就是一个基本窗口,可以在其上增加其他东西
  tk = tkinter.Tk()
  # call back for Quit
  def callback():
    '''
    该函数用于,当点击窗口 关闭 按钮时,展示一个消息提示框,询问是否要关闭,
    点击 是,则退出窗口
    '''
    if mb.askokcancel("Quit", "Do you really wish to quit?"):
      # Ball.flag = False
      tk.destroy()
  # 使用protocol将 WM_DELETE_WINDOW 与 callback 绑定,程序在退出时打印 'WM_DELETE_WINDOW'
  tk.protocol("WM_DELETE_WINDOW", callback)

  # 画布的宽
  canvas_width = 600
  # 画布的高
  canvas_hight = 500
  # 窗口标题
  tk.title("Ball Game V1.2")
  # 窗口不可被拉伸,(0,0)的意思是“窗口的大小在水平方向上和垂直方向上都不能改变”
  tk.resizable(0,0)
  # 调用wm_attributes,将窗口始终放到所有其他窗口之前(-topmost),将1改为0画布窗口不在其他窗口之前
  tk.wm_attributes("-topmost",1)
  # 创建画布,bd=0,highlightthickness=0 作用是画布之外没有边框,可以使游戏屏幕看上去更加美观。最后一个bd是画布的背景色。
  canvas = tkinter.Canvas(tk,width=canvas_width,height=canvas_hight,bd=0,highlightthickness=0,bg='#00ffff')
  # 按照上面一行指定的宽度高度参数调整其自身大小
  canvas.pack()
  # update强制更新屏幕,实时更新画布
  tk.update()

  # 创建得分类,得分控件的颜色为红色
  score = Score(canvas,'red')
  # 创建 球拍类,
  paddle = Paddle(canvas,"red")
  # 创建 小球类,小球的默认颜色为灰色
  ball = Ball(canvas,paddle,score,"grey")

  # 游戏结束时的提示
  game_over_text = canvas.create_text(canvas_width/2,canvas_hight/2,text='Game over',state='hidden',fill='red',font=(None, 18, "bold"))
  # 游戏开始时的提示
  introduce = 'Welcome to Ball GameV1.2:\nClick Any Key--Start\nStop--Enter\nContinue-Enter\n'
  game_start_text = canvas.create_text(canvas_width/2,canvas_hight/2,text=introduce,state='normal',fill='magenta',font=(None, 18, "bold"))

  # 主循环,让tkinter不停地重画屏幕
  while True:
    # 如果小球没有碰到了底部,且 游戏尚未开始
    if (ball.hit_bottom == False) and ball.paddle.started:
      canvas.itemconfig(game_start_text,state='hidden')
      ball.draw()
      paddle.draw()
    # 如果小球碰到了底部,则游戏结束
    if ball.hit_bottom == True:
      time.sleep(0.1)
      canvas.itemconfig(game_over_text,state='normal')
    # 不停的刷新画布
    tk.update_idletasks()
    # 强制更新屏幕
    tk.update()
    time.sleep(0.01)

if __name__=='__main__':
  main()

以上就是python 实现弹球小游戏的详细内容,更多关于python 弹球游戏的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python基于Tkinter模块实现的弹球小游戏

    本文实例讲述了Python基于Tkinter模块实现的弹球小游戏.分享给大家供大家参考,具体如下: #!usr/bin/python #-*- coding:utf-8 -*- from Tkinter import * import Tkinter import random import time #创建小球的类 class Ball: def __init__(self,canvas,paddle,color): #参数:画布,球拍和颜色 self.canvas = canvas self

  • python3实现弹弹球小游戏

    本文实例为大家分享了python3实现弹弹球小游戏的具体代码,供大家参考,具体内容如下 from tkinter import * from tkinter import messagebox import random import time from PIL import Image, ImageTk import sys class Game: def __init__(self): self.tk = Tk() self.times = 0 sw = self.tk.winfo_scre

  • python pygame实现挡板弹球游戏

    学了一天pygame,用python和pygame写一个简单的挡板弹球游戏 GitHub: EasyBaffleBallGame # -*- coding:utf-8 -*- from sys import exit import pygame from pygame.locals import * pygame.init() # 创建窗口 ScreenWidth = 500 ScreenHright = 720 ScreenSize = (ScreenWidth, ScreenHright)

  • Python实现的弹球小游戏示例

    本文实例讲述了Python实现的弹球小游戏.分享给大家供大家参考,具体如下: 弹球 1. Ball 类 draw负责移动Ball 碰撞检测,反弹,Ball检测Paddle 2.Paddle类 draw负责移动Paddle 碰撞检测,确定能不能继续 监听键盘事件 3.主循环 绘制Ball和Paddle update sleep 代码 from Tkinter import * import random import time class Ball: def __init__(self, canv

  • 使用python和pygame制作挡板弹球游戏

    python是个很有趣的语言,可以在cmd命令窗口运行,还有很多的功能强大的模块. 学了一天pygame,用python和pygame写一个简单的挡板弹球游戏. 2018年6月21日 00:15:21 GitHub: EasyBaffleBallGame # -*- coding:utf-8 -*- from sys import exit import pygame from pygame.locals import * pygame.init() # 创建窗口 ScreenWidth = 5

  • python运用pygame库实现双人弹球小游戏

    使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截失败的一方输掉游戏,规则类似于简化版的乒乓球. 因为是第一次用pygame写python小游戏并且只用了两三个小时,所以有些粗糙,部分方面有些bug,比如板子可以移动出屏幕外,游戏结束后的提示显示不全. 但是关键部分如小球的移动和基本功能等,还算比较完善. 代码如下: 运行环境为python 3.7,需要安装pygame库 import pygame,sys,time,

  • python编写弹球游戏的实现代码

    弹球游戏: from tkinter import * import time import random tk=Tk() #创建一个界面 tk.title("弹球游戏") canvas=Canvas(tk,width=800,height=600,bg="skyblue",bd=0,highlightthickness = 0) tk.resizable(0,0) #表示边框不能被拉伸 canvas.pack() #使部件放在主窗口中 tk.update() #刷

  • python 实现弹球游戏的示例代码

    运行效果 实现代码 # -*- coding: utf-8 -*- import tkinter as tkinter import tkinter.messagebox as mb import random,time class Ball(): ''' 创建Ball类,初始化对象,即创建对象设置属性, init函数是在对象被创建的同时就设置属性的一种方法,Python会在创建新对象时自动调用这个函数. ''' def __init__(self,canvas,paddle,score,col

  • 基于Python实现超级玛丽游戏的示例代码

    目录 效果演示 基础源码 1.基础设置(tools部分) 2.设置背景音乐以及场景中的文字(setup部分) 3.设置游戏规则(load_screen) 4.设置游戏内菜单等(main_menu) 5.main() 6.调用以上函数实现 效果演示 基础源码 1.基础设置(tools部分) 这个部分设置马里奥以及游戏中蘑菇等怪的的移动设置. import os import pygame as pg keybinding = { 'action':pg.K_s, 'jump':pg.K_a, 'l

  • 基于Python实现围棋游戏的示例代码

    目录 1.导入模块 2.初始化棋盘 3. 开始游戏 4.放弃当前回合落子 5.悔棋判断 6.重新开始 7.右侧太极图的设置 8.落子设置 9.吃子规则判定设置 10.其他 11.程序入口 12.效果图 文件自取 1.导入模块 tkinter:ttk覆盖tkinter部分对象,ttk对tkinter进行了优化 copy:深拷贝时需要用到copy模块 tkinter.messagebox:围棋应用对象定义 如没有以上模块,在pycharm终端输入以下指令: pip install 相应模块 -i h

  • Python实现生命游戏的示例代码(tkinter版)

    目录 生命游戏(Game of Life) 游戏概述 生存定律 图形结构 代码实现 运行界面 使用简介 后续改进 生命游戏(Game of Life) 由剑桥大学约翰·何顿·康威设计的计算机程序.美国趣味数学大师马丁·加德纳(Martin Gardner,1914-2010)通过<科学美国人>杂志,将康威的生命游戏介绍给学术界之外的广大渎者,一时吸引了各行各业一大批人的兴趣,这时细胞自动机课题才吸引了科学家的注意. 游戏概述 用一个二维表格表示“生存空间”,空间的每个方格中都可放置一个生命细胞

  • python实现生命游戏的示例代码(Game of Life)

    生命游戏的算法就不多解释了,百度一下介绍随处可见. 因为网上大多数版本都是基于pygame,matlab等外部库实现的,二维数组大多是用numpy,使用起来学习成本比较高,所以闲暇之余写一个不用外部依赖库,console输出的版本. # -*- coding: utf-8 -*- from time import sleep from copy import deepcopy WORLD_HIGH = 20 #世界长度 WORLD_WIDE = 40 #世界宽度 ALIVE_CON = 3 #复

  • Python使用random模块实现掷骰子游戏的示例代码

    引入内容 根据人民邮电出版社出版的<Python程序设计现代设计方法>P102习题中的第7题--掷骰子游戏,进行代码编写. 题目要求 一盘游戏中,两人轮流掷骰子5次,并将每次掷出的点数累加,5局之后,累计点数较大者获胜,点数相同则为平局.根据此规则实现掷骰子游戏,并算出50盘之后的胜利者( 50盘中嬴得盘数最多的,即最终胜利者). 审题: 共有50盘游戏.一盘游戏有5局,每一局双方各掷骰子一次,5局结束以后统计分数,分数高的一方获胜.至此,一盘游戏结束.50盘游戏结束后,赢得盘数最多的一方为最

  • Python实现炸金花游戏的示例代码

    今天的第二个作品,哈哈哈哈,搞起来感觉还挺有意思的,不过代码里纸牌J,Q,K,A几个数字被我替换成了11,12,13,14......主要是没有想到简单的办法让其比较,索性都用数字了,我太菜了,希望有大佬指点一下. 代码如下: import random   #导入随机数函数 def puke():     """     生成一副52张的扑克牌(除去大小王)     :return:     """     list1 = ['黑桃', '红桃

  • 通过Python实现猜灯谜游戏的示例代码

    目录 导语 猜灯谜界面 程序讲解 构造初始界面 构造灯谜类对象 监控鼠标事件 源码 导语 新的一年迎来了元宵节,元宵佳节在陪伴家人的同时,自然也少不了赏花灯,猜灯谜的项目.当然,受到疫情的影响,许多地方今年无法出门赏花灯,猜灯谜. 但是不要紧,小编昨晚用Python弄了一猜灯谜的小程序让大家享受一把猜灯谜乐趣 猜灯谜界面 来看一下猜灯谜的小程序是怎么玩的.先看一下效果图: 程序讲解 构造初始界面 对于程序界面的构造,利用的是python3.6版本下安装2.0.1版本的pygame库.其界面的初始

  • 基于Python编写简易版的天天跑酷游戏的示例代码

    写出来的效果图就是这样了: 下面就更新一下全部的代码吧 还是老样子先定义 import pygame,sys import random 写一下游戏配置 width = 1200            #窗口宽度 height = 508            #窗口高度 size = width, height    score=None              #分数 myFont=myFont1=None     #字体 surObject=None          #障碍物图片   

随机推荐