你喜欢篮球吗?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获取一组汉字拼音首字母的方法
Jul 01 Python
Python闭包之返回函数的函数用法示例
Jan 27 Python
python list是否包含另一个list所有元素的实例
May 04 Python
使用Python监控文件内容变化代码实例
Jun 04 Python
Python生成MD5值的两种方法实例分析
Apr 26 Python
python使用opencv在Windows下调用摄像头实现解析
Nov 26 Python
python实现数据清洗(缺失值与异常值处理)
Dec 02 Python
Python日期格式和字符串格式相互转换的方法
Feb 18 Python
解决windows下python3使用multiprocessing.Pool出现的问题
Apr 08 Python
Python子进程subpocess原理及用法解析
Jul 16 Python
python中24小时制转换为12小时制的方法
Jun 18 Python
Python写情书? 10行代码展示如何把情书写在她的照片里
Apr 21 Python
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
使用python+pygame开发消消乐游戏附完整源码
You might like
php &amp;&amp; 逻辑与运算符使用说明
2010/03/04 PHP
php 高性能书写
2010/12/11 PHP
php+ajax导入大数据时产生的问题处理
2014/06/11 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
PHP微信开发之二维码生成类
2015/06/26 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
Postman参数化实现过程及原理解析
2020/08/13 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
对python中return和print的一些理解
2017/08/18 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
Tensorflow训练模型越来越慢的2种解决方案
2020/02/07 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
Python基于class()实现面向对象原理详解
2020/03/26 Python
django实现日志按日期分割
2020/05/21 Python
Python判断远程服务器上Excel文件是否被人打开的方法
2020/07/13 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
python爬取youtube视频的示例代码
2021/03/03 Python
学校十一活动方案
2014/02/01 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
万能检讨书2000字
2014/10/17 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
初中数学教学反思范文
2016/02/17 职场文书
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题
Redis 常见使用场景
2021/08/30 Redis
Innodb存储引擎中的后台线程详解
2022/04/03 MySQL