你喜欢篮球吗?Python实现篮球游戏


Posted in Python onJune 11, 2021

一、前言

准备编写一个篮球游戏,运动员带球跑,跳起投篮。在每帧图片中包括运动员和篮球,使用多帧图片,实现运动员运球跑动的效果。运动员运球跑动作每帧图形的宽和高可能不同,例如,跨一大步,和两腿并拢,其宽和高不可能相同。如果不考虑两个角色的碰撞,所有帧图形的宽和高取最大值,使所有帧宽和高相同,可采用将所有帧图形放到一个大图形中,实现动画,见博文“pygame.surface.blit()方法4个参数的使用方法”。pygame中两个角色碰撞,实际上是图形外矩形框的碰撞,即两个矩形框重合,表示两个角色发生碰撞。为了逼真,每个矩形框要尽量靠近内部图形。因此无法保证每帧图形的宽和高都相同。在这种情况下,必须把每帧图形用列表保存。

本例运球只有4帧造型,用来完成带球跑动的动画,注意球也是造型的一部分。如下图。造型采用火柴人,这是因为火柴人造型容易找到,自己画一个也不难。可惜本人画图能力太差,只能从一段视频中一帧一帧抠出造型。4帧图形背景都设置为透明。

你喜欢篮球吗?Python实现篮球游戏

用3个例子说明实现方法。例1是运动员带球折返跑,遇到左右边界反向返回。运行效果图如下:

二、例一

你喜欢篮球吗?Python实现篮球游戏

例1完整程序如下。仅拷贝源程序不能运行,要将上边4帧造型截图,并分割为4个png图形文件,然后使背景透明。根据图形大小,在第11条语句中,将//6修改为适当值,使图形大小合适,将文件保存到源程序所在文件夹下的子文件夹pic中。

import pygame, sys
bgcolor = pygame.Color('blue')                   #创建颜色
pygame.init()
size = width, height = 300,200
screen = pygame.display.set_mode(size)           #创建指定大小游戏窗口
pygame.display.set_caption("投手带球往返跑")     #设置窗口标题
images=[]                                        #列表保存运球所有帧图形
for n in range(4):
    p = pygame.image.load('pic/'+str(n+1)+'.png')
    r=p.get_rect()      
    p = pygame.transform.scale(p, (r.width//6, r.height//6))#调整图像的大小
    images.append(p)
fclock = pygame.time.Clock()            #创建控制频率的clock
fps = 4                                 #定义刷新频率
x=0                                     #blit方法第2个参数的x坐标,y坐标不变
frameNum=0                  #帧号从0-3,初始为0,完成1帧,其值加1,到4,变0
direction=0                 #=0,从左到右跑,=1,从右到左跑
running = True
while running:    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:           #处理退出事件
            running = False
    screen.fill(bgcolor)                        #设置背景的颜色
    p=images[frameNum]                          #从列表得到当前帧的图形
    if direction==1:                #=0,从左向右跑,=1,从右向左跑,图形反向
        p=pygame.transform.flip(p,True,False)   #反向
    screen.blit(p, (x, 70))                     #在屏幕指定位置绘制图形
    frameNum+=1             #帧号从0-3,初始为0,完成1帧,其值加1,到4,变0
    if frameNum==4:
        frameNum=0
    if direction==0:                            #=0,从左到右跑,x增加
        x+=20
        if x+80>width:                          #如到右边界,从右向左跑
            direction=1
    else:
        x-=20
        if x<0:
            direction=0
    pygame.display.flip()                       #刷新游戏场景    
    fclock.tick(fps)#本帧中程序已运行了若干秒,为保证fps,该语句保证延迟余下时间
pygame.quit()

例2使运动员跟随鼠标跑动运球,下边是运行效果图。

三、例二

你喜欢篮球吗?Python实现篮球游戏

例2完整程序如下。也需用上边方法生成4帧造型文件保存到指定位置,拷贝源程序才能运行。

import pygame, sys
bgcolor = pygame.Color('blue')                  #创建颜色
pygame.init()
size = width, height = 600,300                  #创建指定大小游戏窗口
screen = pygame.display.set_mode(size)          #设置窗口标题
pygame.display.set_caption("投手运球随鼠标跑")  
images=[]
for n in range(4):
    p = pygame.image.load('pic/'+str(n+1)+'.png')
    r=p.get_rect()      
    p = pygame.transform.scale(p, (r.width//6, r.height//6))    #调整图像的大小
    images.append(p)
fclock = pygame.time.Clock()
fps = 4                   
x,y=0,0
frameNum=0
direction=0
running = True
while running:    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:           # 处理退出事件
            running = False
        if event.type == pygame.MOUSEMOTION:    #得到鼠标位置
            a,b=event.pos    
    screen.fill(bgcolor)   # 设置背景的颜色
    p=images[frameNum]
    if a-x<0:               #面向鼠标
        p=pygame.transform.flip(p,True,False)
    x,y=a,b
    screen.blit(p, (x, y)) #在屏幕指定位置绘制图形
    frameNum+=1
    if frameNum==4:
        frameNum=0
    pygame.display.flip()   #刷新游戏场景    
    fclock.tick(fps)#本帧中程序已运行了若干秒,为保证fps,该语句保证延迟余下时间
pygame.quit()

例3增加了一个篮球场背景,并使运动员只能在球场内运动。为了使程序逻辑清楚,代码易读,将运球所有代码用类封装。运行效果如下,可以看到,即使鼠标移出篮球场,运动员不会移出篮球场。

四、例三

你喜欢篮球吗?Python实现篮球游戏

例3完整程序如下,除了生成4帧造型文件保存到指定位置外,还要截图下边篮球场背景,保存为文件到源程序所在文件夹下的子文件夹pic中。篮球场背景图片尺寸为800*600。

import pygame
class Player():
    def __init__(self,screen):
        self.screen=screen
        self.images=[]
        for n in range(4):              #将4帧图像保存到列表中
            p = pygame.image.load('pic/'+str(n+1)+'.png')      #文件名为1.png,2.png...
            r=p.get_rect()      
            p = pygame.transform.scale(p, (r.width//6, r.height//6))    #调整图像的大小
            self.images.append(p)
        self.frameNum=0                 #帧编号
        self.x,self.y=0,0               #图像在窗体的坐标
        self.mouseX,self.mouseY=0,0     #鼠标坐标
    def draw(self):                     #在游戏窗口显示指定帧图形
        p=self.images[self.frameNum]    #得到指定帧图形
        if self.mouseX-self.x<0:
            p=pygame.transform.flip(p,True,False)
        self.x,self.y=self.mouseX,self.mouseY
        if self.x<1:                    #4个if语句保证运动员在篮球场中
            self.x=1
        if self.x+90>width:
            self.x=width-90
        if self.y<230:
            self.y=230
        if self.y+120>height:
            self.y=height-120
        self.screen.blit(p, (self.x, self.y)) #在屏幕指定位置绘制图形
        self.frameNum+=1
        if self.frameNum==4:
                self.frameNum=0
bgcolor = pygame.Color('blue')
pygame.init()
size = width, height = 800,600          # 创建指定大小游戏窗口
screen = pygame.display.set_mode(size)  # 设置窗口标题
pygame.display.set_caption("投手跟随鼠标运球跑")
bg_img = pygame.image.load("pic/篮球场1.png").convert()
fclock = pygame.time.Clock()    # 创建控制频率的clock
fps = 4                         # 定义刷新频率
player=Player(screen)
running = True
while running:    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:           # 处理退出事件
            running = False
        if event.type == pygame.MOUSEMOTION:
            player.mouseX,player.mouseY=event.pos    
    #screen.fill(bgcolor)   # 设置背景的颜色
    screen.blit(bg_img, (0, 0))  # 绘制背景
    player.draw()    
    pygame.display.flip()# 刷新游戏场景    
    fclock.tick(fps)#本帧中程序已运行了若干秒,为保证fps,该语句保证延迟余下时间
pygame.quit()

篮球场背景如下图,其尺寸为800*600。

你喜欢篮球吗?Python实现篮球游戏

到此这篇关于你喜欢篮球吗?Python实现篮球游戏的文章就介绍到这了,更多相关Python篮球游戏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
实例讲解Python编程中@property装饰器的用法
Jun 20 Python
python机器学习实战之最近邻kNN分类器
Dec 20 Python
Python wxpython模块响应鼠标拖动事件操作示例
Aug 23 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
解决python写入带有中文的字符到文件错误的问题
Jan 31 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
Pyqt5 基本界面组件之inputDialog的使用
Jun 25 Python
Python pip替换为阿里源的方法步骤
Jul 02 Python
python中如何使用insert函数
Jan 09 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
Aug 03 Python
一篇文章搞懂python混乱的切换操作与优雅的推导式
Aug 23 Python
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
使用python+pygame开发消消乐游戏附完整源码
You might like
网络资源
2006/10/09 PHP
php 魔术方法详解
2014/11/11 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
php的扩展写法总结
2019/05/14 PHP
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
Prototype Array对象 学习
2009/07/19 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
Vue实现table上下移动功能示例
2019/02/21 Javascript
vue实现多条件和模糊搜索功能
2019/05/28 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
讲解python参数和作用域的使用
2013/11/01 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
python 3.5实现检测路由器流量并写入txt的方法实例
2017/12/17 Python
mac下如何将python2.7改为python3
2018/07/13 Python
Python tkinter label 更新方法
2018/10/11 Python
Python函数参数分类原理详解
2020/05/28 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
英国最受欢迎的在线隐形眼镜商店:VisionDirect.co.uk
2018/12/06 全球购物
英国森林假期:Forest Holidays
2021/01/01 全球购物
公司前台辞职报告
2014/01/19 职场文书
消防安全员岗位职责
2014/03/10 职场文书
环保倡议书500字
2014/05/15 职场文书
九一八事变演讲稿
2014/09/05 职场文书
工作经验交流材料
2014/12/30 职场文书
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android