你喜欢篮球吗?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 相关文章推荐
pycharm: 恢复(reset) 误删文件的方法
Oct 22 Python
使用Python正则表达式操作文本数据的方法
May 14 Python
简单了解python中对象的取反运算符
Jul 01 Python
Python read函数按字节(字符)读取文件的实现
Jul 03 Python
Django MEDIA的配置及用法详解
Jul 25 Python
TensorFlow——Checkpoint为模型添加检查点的实例
Jan 21 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
Feb 10 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
Jun 04 Python
Python暴力破解Mysql数据的示例
Nov 09 Python
Django框架请求生命周期实现原理
Nov 13 Python
python 生成正态分布数据,并绘图和解析
Dec 21 Python
pytorch--之halfTensor的使用详解
May 24 Python
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
使用python+pygame开发消消乐游戏附完整源码
You might like
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
syphon 虹吸式咖啡冲泡冲煮倒水的得与失
2021/03/03 冲泡冲煮
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
php的dl函数用法实例
2014/11/06 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
PHP实现清除MySQL死连接的方法
2016/07/23 PHP
php识别翻转iphone拍摄的颠倒图片
2018/05/17 PHP
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
关于JavaScript中string 的replace
2013/04/12 Javascript
Bootstrap精简教程
2015/11/27 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
Node.js测试中的Mock文件系统详解
2016/11/21 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
vue中typescript装饰器的使用方法超实用教程
2019/06/17 Javascript
Vue中axios拦截器如何单独配置token
2019/12/27 Javascript
JavaScript canvas实现跟随鼠标事件
2020/02/10 Javascript
Vue实现图书管理案例
2021/01/20 Vue.js
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
pandas分批读取大数据集教程
2020/06/06 Python
python 5个顶级异步框架推荐
2020/09/09 Python
python调用百度AI接口实现人流量统计
2021/02/03 Python
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
物业管理计划书
2014/01/10 职场文书
校园文化建设方案
2014/02/03 职场文书
音乐专业自荐信
2014/02/07 职场文书
cf战队收人广告词
2014/03/14 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
机电一体化专业求职信
2014/07/22 职场文书
个人职业及收入证明
2014/10/13 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
正规借条模板
2015/05/26 职场文书