你喜欢篮球吗?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 相关文章推荐
pygame播放音乐的方法
May 19 Python
Python3遍历目录树实现方法
May 22 Python
1 行 Python 代码快速实现 FTP 服务器
Jan 25 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
python简单实现矩阵的乘,加,转置和逆运算示例
Jul 10 Python
使用Python和Scribus创建一个RGB立方体的方法
Jul 17 Python
python科学计算之narray对象用法
Nov 25 Python
python数据爬下来保存的位置
Feb 17 Python
Django 自定义权限管理系统详解(通过中间件认证)
Mar 11 Python
python实现数字炸弹游戏程序
Jul 17 Python
django创建css文件夹的具体方法
Jul 31 Python
python爬虫智能翻页批量下载文件的实例详解
Feb 02 Python
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
使用python+pygame开发消消乐游戏附完整源码
You might like
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
2014/11/20 PHP
mysql_escape_string()函数用法分析
2016/04/25 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
node.js中的fs.symlink方法使用说明
2014/12/15 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
JS实现超简单的鼠标拖动效果
2015/11/02 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
2016/01/01 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
微信小程序使用Socket的实例
2017/09/19 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
发布订阅模式在vue中的实际运用实例详解
2019/06/09 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
Python中join和split用法实例
2015/04/14 Python
在Python中使用第三方模块的教程
2015/04/27 Python
Python 列表排序方法reverse、sort、sorted详解
2016/01/22 Python
python去除字符串中的换行符
2017/10/11 Python
python 将数据保存为excel的xls格式(实例讲解)
2018/05/03 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
2018/05/24 Python
python 解压pkl文件的方法
2018/10/25 Python
Python闭包思想与用法浅析
2018/12/27 Python
python实现人脸签到系统
2020/04/13 Python
日语求职信范文
2013/12/17 职场文书
暑期社会实践证明书
2014/11/17 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
小学教师年度个人总结
2015/02/05 职场文书
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL
Node实现搜索框进行模糊查询
2021/06/28 Javascript
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技