pygame实现的《躲小球》

pygame安装 pip install pygame

在CMD中输入python -m pygame.examples.aliens可以看到一个自带的pygame的演示小游戏

学了几天pygame,那就实践一下吧,如图实现玩家操控小鸟躲避小球的游戏,当碰撞到小球游戏结束,关闭游戏

所以我们需要实现以下几个功能:

1.操控小鸟

2.小球移动

3.碰撞检测

4.结束游戏

一. 控制小鸟我们用pygame.KEYDOWN来检测,当用户敲击下键盘上下左右时,改变鸟的位置坐标,并消除之前的图片

 1 #键盘敲击事件
 2         elif event.type == pygame.KEYDOWN:
 3             #上
 4             if event.key == pygame.K_UP:
 5                 if imageRect.top != 0:
 6                     pygame.draw.rect(screen,THECOLORS[‘white‘],imageRect)
 7                     imageRect = imageRect.move(0,birdspeed[0])
 8                     count = count + 1
 9             #下
10             elif event.key == pygame.K_DOWN:
11                 if imageRect.bottom != 360:
12                     pygame.draw.rect(screen, THECOLORS[‘white‘], imageRect)
13                     imageRect = imageRect.move(0,birdspeed[1])
14                     count = count + 1
15             #左
16             elif event.key == pygame.K_LEFT:
17                 if imageRect.left != 0:
18                     pygame.draw.rect(screen, THECOLORS[‘white‘], imageRect)
19                     imageRect = imageRect.move(birdspeed[3],0)
20             #右
21             elif event.key == pygame.K_RIGHT:
22                 if imageRect.right != 540:
23                     pygame.draw.rect(screen, THECOLORS[‘white‘], imageRect)
24                     imageRect = imageRect.move(birdspeed[2],0)
25             #按ESC退出游戏
26             elif event.key == pygame.K_ESCAPE:
27                 sys.exit()

二.我们先设置小球的初始位置,然后让小球从右向左移动,并用draw.rect画掉之前的图像,当小球到达屏幕最左端的时候,我们让它重新出现,并且修改纵坐标为鸟的同一行

 1 replace_rect = pygame.draw.rect(screen, THECOLORS[‘white‘], ballRect)
 2     #小球自右向左移动
 3     if ballLocation[0] > -60:
 4         if count > 10 and count < 8:
 5             ballLocation[0] = ballLocation[0] + ballspeed[count//10]
 6         else:
 7             ballLocation[0] = ballLocation[0] + ballspeed[0]
 8     else:
 9         ballLocation[0] = 540
10     #小球移动到最左端时改变出现的位置
11     if ballLocation[0]  == -60:
12         ballLocation[1] = imageRect.top
13     #纵坐标超出范围时修改
14     if ballLocation[1] > 359:
15         ballLocation[1] = ballLocation_change[random.randint(1,6)]

三.碰撞检测和结束

我将鸟的图像创建一个Rect对象,相当于这个rect对象帮我获取的鸟这个图像的上下左右的坐标,这样我们就可以用来判断它的位置信息,这里我用ballLocation来存储球的位置

 1 #碰撞检测的实现
 2     if imageRect.bottom == ballLocation[1]+60 and imageRect.top == ballLocation[1] :
 3         if imageRect.left-ballLocation[0] < 60 and imageRect.left-ballLocation[0] > 0 :
 4             #如果碰撞就结束游戏
 5             print("Game Over")
 6             pygame.mixer.music.load(gameOver_musci)
 7             pygame.mixer.music.play()
 8             screen.blit(game_over_image,[0,0])
 9             pygame.display.update()
10             pygame.time.delay(1500)
11             sys.exit()

完整代码如下,注释还挺多的,图片和音乐资源网上自己都能找到,用自己喜欢的图片就行了,最好是透明的图片,如果和我一样图片不是透明的而是白色背景,就得加这个了不然就不用

将透明色设置为白色control_image = pygame.image.load(‘资源/img/bird.png‘).convert()control_image.convert_alpha()control_image.set_colorkey(ALPHA)
  1     #导入和常量设置
  2 import pygame,sys
  3 from pygame.color import THECOLORS
  4 import random
  5 size = wdith , height = 540 ,360#设置屏幕尺寸
  6 birdspeed = [-60,60,60,-60]
  7 ballspeed = [-8,-9,-10,-11,-12,-13,-14,-15,-16]
  8 ballLocation = [540,60]
  9 ballLocation_change = [0,60,120,180,240,300,360]
 10 ALPHA = (255,255,255)#设置透明色
 11 fps = 120#屏幕刷新率
 12 count = 1#用于统计操控次数来改变游戏难度
 13     #初始化界面
 14 pygame.init()
 15 fclock = pygame.time.Clock()
 16 screen = pygame.display.set_mode(size)
 17 pygame.display.set_caption(‘躲小球1.0‘)
 18     #音乐载入
 19 music = ‘资源/music/letter.mp3‘
 20 gameOver_musci = ‘资源/music/gameover2.mp3‘
 21 pygame.mixer.music.load(music)
 22 pygame.mixer.music.play()
 23     #图片载入
 24 imag = ‘资源/img/cat1.png‘
 25 imag = pygame.image.load(imag)
 26 pygame.display.set_icon(imag)
 27 #将透明色设置为白色
 28 control_image = pygame.image.load(‘资源/img/bird.png‘).convert()
 29 control_image.convert_alpha()
 30 control_image.set_colorkey(ALPHA)
 31
 32 game_over_image = pygame.image.load(‘资源/img/gameover.jpg‘)
 33 game_over_image = pygame.transform.scale(game_over_image,[540,360])#设置为指定大小的图片
 34 ball_image = pygame.image.load(‘资源/img/ball.png‘)
 35 background = pygame.image.load(‘资源/img/sky.png‘)
 36 background = pygame.transform.scale(background,[540,360])
 37 control_image = pygame.transform.scale(control_image,[60,60])#设定为指定大小的图片
 38 ball_image = pygame.transform.scale(ball_image,[60,60])
 39 ballRect = ball_image.get_rect()
 40 imageRect = control_image.get_rect()
 41     #背景色和贴图片
 42 screen.fill(THECOLORS[‘white‘])
 43 screen.blit(control_image,imageRect)
 44 screen.blit(ball_image,ballLocation)
 45     #事件循环响应队列
 46 while True:
 47     for event in pygame.event.get():
 48         if event.type == pygame.QUIT:
 49             sys.exit()
 50         #键盘敲击事件
 51         elif event.type == pygame.KEYDOWN:
 52             #上
 53             if event.key == pygame.K_UP:
 54                 if imageRect.top != 0:
 55                     pygame.draw.rect(screen,THECOLORS[‘white‘],imageRect)#将前一个图像覆盖掉
 56                     imageRect = imageRect.move(0,birdspeed[0])
 57                     count = count + 1
 58             #下
 59             elif event.key == pygame.K_DOWN:
 60                 if imageRect.bottom != 360:
 61                     pygame.draw.rect(screen, THECOLORS[‘white‘], imageRect)
 62                     imageRect = imageRect.move(0,birdspeed[1])
 63                     count = count + 1
 64             #左
 65             elif event.key == pygame.K_LEFT:
 66                 if imageRect.left != 0:
 67                     pygame.draw.rect(screen, THECOLORS[‘white‘], imageRect)
 68                     imageRect = imageRect.move(birdspeed[3],0)
 69             #右
 70             elif event.key == pygame.K_RIGHT:
 71                 if imageRect.right != 540:
 72                     pygame.draw.rect(screen, THECOLORS[‘white‘], imageRect)
 73                     imageRect = imageRect.move(birdspeed[2],0)
 74             #按ESC退出游戏
 75             elif event.key == pygame.K_ESCAPE:
 76                 sys.exit()
 77     #抹除操作前的图像
 78     replace_rect = pygame.draw.rect(screen, THECOLORS[‘white‘], ballRect)
 79     #小球自右向左移动
 80     if ballLocation[0] > -60:
 81         if count > 10 and count < 8:
 82             ballLocation[0] = ballLocation[0] + ballspeed[count//10]
 83         else:
 84             ballLocation[0] = ballLocation[0] + ballspeed[0]
 85     else:
 86         ballLocation[0] = 540
 87     #小球移动到最左端时改变出现的位置
 88     if ballLocation[0]  == -60:
 89         ballLocation[1] = imageRect.top
 90     #纵坐标超出范围时修改
 91     if ballLocation[1] > 359:
 92         ballLocation[1] = ballLocation_change[random.randint(1,6)]
 93     #碰撞检测的实现
 94     if imageRect.bottom == ballLocation[1]+60 and imageRect.top == ballLocation[1] :
 95         if imageRect.left-ballLocation[0] < 60 and imageRect.left-ballLocation[0] > 0 :
 96             #如果碰撞就结束游戏
 97             print("Game Over")
 98             pygame.mixer.music.load(gameOver_musci)
 99             pygame.mixer.music.play()
100             screen.blit(game_over_image,[0,0])
101             pygame.display.update()
102             pygame.time.delay(1500)
103             sys.exit()
104     #背景
105     screen.blit(background,(0,0))
106     #小球
107     screen.blit(ball_image,ballLocation)
108     #控制对象
109     screen.blit(control_image,imageRect)
110
111     pygame.display.update()#刷新
112     fclock.tick(fps)

原文地址:https://www.cnblogs.com/Truedragon/p/12545565.html

时间: 2024-10-12 08:09:02

pygame实现的《躲小球》的相关文章

openSUSE滚动版安装后简单配置

openSUSE 快速配置 面向使用Tumbleweed的新手,希望能让你用更少的时间来配置openSUSE,拿出更多的时间去做该做的事! Leap看这里Leap新手指南 ?? 内容丰富,一份优秀的中文文档 有不懂的地方可以留言大家讨论.有写错的地方麻烦您指正,谢谢! 你可能需要的: openSUSE中文论坛 openSUSE网页版应用商店 openSUSE_Wiki Archlinux_Wiki 鸟哥的Linux私房菜 1.软件源 (1) 添加一个软件源 sudo zypper ar -f 软

pygame系列_小球完全弹性碰撞游戏

之前做了一个基于python的tkinter的小球完全碰撞游戏: 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名称: 小球完全弹性碰撞游戏规则: 1.游戏初始化的时候,有5个不同颜色的小球进行碰撞 2.玩家可以通过在窗口中单击鼠标左键进行增加小球个数 3.玩家可以通过在窗口中单击鼠标右键进行删减小球个数 4.玩家可以通过键盘的方向键:上,右键进行对小球加速 5.玩家可以通过键盘的方向键:下,左键进行对小球减速 6.玩家可以按键盘:f键实现全屏显示 7.玩家可以按键盘:Esc

python学习之GUI(pygame键盘)

keys=pygame.key.get_pressed(),接受游戏中当前按下的所有按键,并把它们保存为一个列表,放在keys变量中 pygame.K_w告诉PyGame你在检查w键,通过修改最后的一个字母,你可以把它修改为任何你想要检查的按键 import pygame pygame.init() size=[400,300] screen=pygame.display.set_mode(size) clock=pygame.time.Clock() done=False while not 

pygame碰撞检测

最近在学Pygame,花一段时间做了一个异常简陋版的"打砖块". 这次重点说一下困扰我比较长时间的碰撞检测(个人太菜..). 按照网上教程比较普遍的方法(也可能是我没看见别的),碰撞检测依次计算移动物体与被碰撞物体各个边之间坐标是否相交.例如下列代码,检测小球与窗口的碰撞: def baffleJudge(self): ''' 与墙壁之间的碰撞判断 ''' if self.vector.x > WINDOW_X - self.image.get_width(): self.vec

各个小组对“躲避小球”游戏的评价

1)318小分队:三人行组他们设计的是一个躲球的小游戏,适合休闲打发时间,基本完成了已经,做的很有趣. 但希望他们把游戏中加一些特效,界面做的更生动有趣些,再加上联网模块,可以与好友一起玩,分享自己 的胜利,另外把难度调低一些,永远让玩家可以继续,但难度会变高随时间. 2五人行:和之前的7-Magic同属于游戏类软件,所以难免要从界面,游戏形式,游戏梯度设定,背景等方面惊醒综合分析.躲避小球软件中设计了三个难度,但是感觉并没有很好的区分开:最关键的一点在于最低难度的管卡难度都不小,不利于吸引用户

python的pygame模拟太阳-地球-月亮-金星等动态示意图代码分析

本文参考原文-http://bjbsair.com/2020-03-25/tech-info/6268/ 1.太阳系 2.今天来模拟太阳系的运动的行星,用python3和pygame来制作. 3.第1步: #---第1步---导出模块--- import pygame import sys import math from pygame.locals import * 4.第2步: #---第2步---游戏初始化--- pygame.init() 5.第3步: #---第3步---定义颜色---

小tips:用java模拟小球做抛物线运动

这几天刚刚学习了java线程,然后跟着书做了几个关于线程的练习,其中有一个练习题是小球动起来.这个相信很简单,只要运用线程就轻松能够实现.然后看到了它的一个课后思考题,怎样让小球做个抛物线运动,这点我调试了很久,上网也找了很多资料,但是没有那种适合我们小白的教程,于是我简单讲讲我的思路.我将从如何画一个小球开始到一步步实现小球进行抛物线运动.嘿嘿!! 一.任务分解 现在我们来做抛物线运动的小球,先不急写代码,先来想象一下做好的结果是什么样子的.我将这个任务分成三步,第一步,画一个小球:第二步,该

win7/64+pip+pygame=pygame安装

2016/01/09 安装pygame win7/64,之前python版本为3.4 pygame下载地址: http://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame 因为需要兼容,所以下载pygame-1.9.2a0-cp34-none-win_amd64.whl 适合Python3.4的版本文件名中包含cp34,适合64位操作系统的版本,文件名中包含amd64: 选择开始>运行,输入cmd打开命令提示符,在命令提示符中输入: pip install

没有躲过的坑--成对使用new和delete时要采取相同的形式

new创建类对象与不new区别: new创建类对象需要指针接收,一处初始化,多处使用 new创建类对象使用完需delete销毁 new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间 new对象指针用途广泛,比如作为函数返回值.函数参数等 而且每个学习C++编程的人都知道成对的使用new和delete,也也就是new申请的内存用delete释放,new []申请的内存由delete []释放. std::string* first_string = new std::string;