飞行的小鸟论文python_80+行python代码实现简单的“飞行的小鸟”游戏

· pygame.init:初始化的一些定义

· pygame.font:使用字体

· pygame.time:管理时间和帧信息

另外因为游戏需要用到很多随机数,所以还需要random模块,也可以通过pip3命令安装。

既然是实现"飞行的小鸟"游戏,首先要有鸟和管子,这里我想通过类来分别定义小鸟和管子。小鸟和管子还要在屏幕上显示,所以这个屏幕的显示也是要定义的。首先看看这个屏幕的定义吧,下面是屏幕定义的代码和一些注释

pygame.init()

# 定义颜色

PIPE = (0,0,255)

SKY = (135,206,250)

BIRD = (220,20,60)

GROUND = (245,245,220)

# 设置游戏幕布大小

size = (800, 650)

screen = pygame.display.set_mode(size)

# 标题设置

pygame.display.set_caption("Flappy Block")

#字体设置

arial18 = pygame.font.SysFont('arial',18, False, False)

# 游戏未结束

done = False

# 时钟

clock = pygame.time.Clock()

# 游戏初始状态

gameState = 1 #未开始

pipes = []#定义管子的list

pygame.init函数,初始化pygame模块,好让我们可以利用pygame的那些模块。比如pygame.font,pygame.draw等(上面列举到的模块)。

然后程序里定义各个对象的颜色,包括小鸟、管子、天空、背景,完了再设置游戏的屏幕大小。幕布左上角坐标是(0,0)设置了游戏的显示标题,还有字体。默认游戏是未开始的状态。gameState=1,代表游戏初始未开始。pipes=[],管子是有序的,所以用list定义。

现在来用类定义小鸟。python是强制缩进的,所以可以很清楚的看到代码块,一个代码块实现一定的逻辑。

# 定义小鸟

class Bird():

def __init__(self):

self.x = 250 # 小鸟x坐标

self.y = 250 # 小鸟y坐标

self.yV = 0 # 小鸟的位置初始化

# 定义小鸟的下降振幅

def flap(self):

self.yV = -5 # 每次下降的位移

# 定义小鸟的上升振幅和y周的上下边界

def update(self):

self.yV += 0.3 # 小鸟上升速度

self.y += self.yV # y轴位置等于原位置加yV振幅

# 定义小鸟的飞行

def draw(self):

pygame.draw.rect(screen, BIRD, (self.x, self.y, 40, 40))#参数为(幕布,颜色,坐标,大小)

# 重置小鸟

def reset(self):

self.x = 250

self.y = 250

self.yV = 0

bird = Bird()# 实例一个小鸟

类class Bird():定义了小鸟。__init(self)__方法初始化了小鸟的位置等信息。注意这个self,在python语言里,类的方法,会有一个默认的参数,一般通用的都是用self表示,这个self是代表类的自身。flap方法定义了小鸟每次下降的位移。update方法定义了小鸟的上升。draw方法通过调用pygame.draw.rect实现了小鸟的飞行。reset方法重置小鸟的位置。bird=Bird()是小鸟类的实例化。

下面来定义管子

# 定义管子

class Pipe():

def __init__(self):

self.centerY = random.randrange(180, 520) # 管子的y轴中间值范围

(大数上面管子长,小数下面管子长)

self.x = 800 # 管子的初始x轴位置

self.size = 150 # 上下两个管子之间的空间宽度的一半

# 更新管子

def update(self):

# 几个全局变量

global pipes

global bird

global gameState

self.x -= 4 # 管子的移动速度,因为小鸟其实没有动x轴的位移,小鸟其实是不前进的,只是上下跳动

# 管子的初始位置

if self.x == 300:

pipes.append(Pipe()) # 显示一个新管子

if self.x <= -100:

del pipes[0] # 删除一个不再显示的管子

# 小鸟撞到管子,游戏结束,第一个条件是撞到下面的管子,第二个条件是撞到上面的管子(小鸟位置固定,管子在x轴运动)

#小鸟的y轴位移小于管子的y轴范围减去中间空的部分

#或者小鸟的y轴位移+40大于管子的y轴范围加上中间空的部分,40是小鸟的长度

#则小鸟撞到管子,游戏结束

if self.x >= 170 and self.x <= 290 and bird.y <= (self.centerY - self.size) \

or self.x >= 170 and self.x <= 290="" and="" bird.y="">= (self.centerY + self.size):

gameState = 3 # 结束

# 小鸟飞过管子,游戏继续,两个75等于size的150

if self.x == 168 and bird.y > (self.centerY - 75) and bird.y < (self.centerY + 75):

gameState = 2

# 小鸟撞到地面,游戏结束

if bird.y >= 610:

gameState = 3

# 定义管子的显示

def draw(self):

# 定义上面管子的显示(幕布,颜色,坐标,宽=80,长)

pygame.draw.rect(screen, PIPE, (self.x, 0, 80, (self.centerY - self.size)))

# 定义下面管子的显示

pygame.draw.rect(screen, PIPE, (self.x, (self.centerY + self.size), 80, (548 - self.centerY)))

# 实例化管子,显示新管子

pipes.append(Pipe())

管子的这个类,我们说说和小鸟不一样的地方。update方法实现了管子的更新显示。注意global,global使参数全局化。管子的移动是self.x=4,说明管子是从右向左运动,速率是4。(所以这个游戏里,其实是管子在左右动,而小鸟其实只是上下动,没有进行x轴的运动)。

pipes.append(Pipe())是列表调用类,列表的append方法,是给列表里插入一个新的元素。这里代表显示(插入)一个新管子。del pipes[0],列表中0代表第一个元素的位置,也就是删掉第一个管子(管子不再显示)。

小鸟碰到管子

if self.x >= 170 and self.x <= 290 \ #管子的位置在120-290之间

and bird.y <= (self.centerY - self.size) \#并且小鸟的身体碰到了上面的管子

or self.x >= 170 and self.x <= 290="" and="" bird.y="">= (self.centerY + self.size):#小鸟的身体碰到了下面的管子

gameState = 3 # 结束

小鸟飞过管子

# 小鸟飞过管子,游戏继续,两个75等于self.size的150

if self.x == 168 and bird.y > (self.centerY - 75) and bird.y < (self.centerY + 75):

gameState = 2

管子的x轴位置168,表示穿过了。而且小鸟刚好在两个管子的空间self.size里。

实现管子的显示

# 定义管子的显示

def draw(self):

# 定义上面管子的显示(幕布,颜色,坐标,宽=80,长)

pygame.draw.rect(screen, PIPE, (self.x, 0, 80, (self.centerY - self.size)))

# 定义下面管子的显示

pygame.draw.rect(screen, PIPE, (self.x, (self.centerY + self.size), 80, (548 - self.centerY)))

# 实例化管子,显示新管子

pipes.append(Pipe())

现在看一下游戏的具体实现。

游戏要有控制键,设置为空格键控制。游戏结束要退出,用QUIT方法。游戏有三个状态:

1:未开始;2:进行中;3:结束

首先游戏未开始时,点击空格键可以开始游戏,游戏结束以后,可以重新开始游戏,这需要重置小鸟和管子。游戏运行中的小鸟和管子,就是刷新显示小鸟和管子。

还需要定义一下游戏开始的按钮显示

#定义游戏开始键

#参数为显示的地方,颜色,面板的位置和大小

pygame.draw.rect(screen,GROUND,(300,300,200,100))#开始键的面板,

#参数为显示的文字,是否显示,颜色

text = arial18.render("Press space to play",True,SKY)#文字

#文字的位置设置

textX = text.get_rect().width

textY = text.get_rect().height

screen.blit(text,((400 - (textX / 2)),(350 - (textY / 2))))#字的填充位置

同样还要设置游戏结束的按钮,只是文案稍微加上gameover。

然后要考虑到整个页面的刷新,用pygame.display.flip方法。画面刷新时间控制由pygame.timeClock.tick控制。

以下是游戏运行的主要函数:

# -------- Main Program Loop -----------

#当游戏没结束

while not done:

# --- Main event loop

# pygame的event方法

for event in pygame.event.get():

if event.type == pygame.QUIT: # 退出游戏

done = True

# 游戏键位设置

if event.type == pygame.KEYDOWN:

if event.key == pygame.K_SPACE: # 设置为空格键

if gameState == 1: # 游戏未开始状态为1

gameState = 2 # 游戏中状态为2

elif gameState == 3: # 游戏结束状态为3

bird.reset() # 小鸟重置

# 管子list重置

pipes = []

pipes.append(Pipe())

# 游戏中

gameState = 2

else: # 没有管子的时候,小鸟飞行

bird.flap()

screen.fill(SKY) # 屏幕填色

if gameState == 1: #游戏未开始时

#定义游戏开始键

pygame.draw.rect(screen,GROUND,(300,300,200,100))#开始键的面板,参数为xy轴位置,xy方向的大小

text = arial18.render("Press space to play",True,SKY)#文字

#文字的位置设置

textX = text.get_rect().width

textY = text.get_rect().height

screen.blit(text,((400 - (textX / 2)),(350 - (textY / 2))))#字的填充位置

# 当游戏运行中

if gameState == 2:

# 小鸟的飞行更新

bird.update()

bird.draw()

# 管子的更新显示

for pipe in pipes:

pipe.update()

pipe.draw()

# 当游戏结束

if gameState == 3:

for pipe in pipes:

pipe.draw()

bird.draw()

pygame.draw.rect(screen,GROUND,(300,300,250,100))#开始键的面板

text = arial18.render("Game Over,Press space to play",True,SKY)#文字

#文字的位置设置

textX = text.get_rect().width

textY = text.get_rect().height

screen.blit(text,((420 - (textX / 2)),(350 - (textY / 2))))#字的填充位置

# 刷新页面

pygame.display.flip()

# 画面更新时间,单位:秒

clock.tick(50)

pygame.quit()

游戏的实现效果是这样的:用方块来代替小鸟。

以上就是这个小游戏的实现过程了,大家可以自己研究加上小鸟穿过管子后的计分功能,也可以把小鸟美化一下,或者给游戏设置由易到难的玩法,可以各种尝试。大家一起试试吧!

一、 本课题的研究意义 如今,游戏的程度,是第一台电子游戏机的研制者诺兰?布什纳尔先生始料不及的。在全世界最大的城市,直至最小的村庄,从纽约最辉煌的游乐场,到高加索最小的乡镇儿童娱乐点,在千家万户,正在进着千千万万这样的“战斗”,伴随着无数成功与失败,兴奋与懊丧。游戏机带来了一个全球性的疯狂症,其他任何娱乐与之相比都望尘莫及。然而,究竟是什么原因使游戏机如此风呢? 在回顾了游戏机发展简史之后,我们不难悟出,技术进步在游戏机发展过程中起到了极大的促进作用。但是,技术进步绝不是游戏机风的唯一因素。随着终端设备开发能力的加强,作为娱乐终端的游戏也得到了很大程度的发展。这也加速了游戏在全球风程度,所以对于游戏的研究和设计具有很重要的意义,这也是本课题研究的意义所在。 用java语言来设计一个游戏,不同于现在的大型网络游戏和手机游戏,也不同于其他的小型的单机控制程序,它对游戏编写者对java语言特点认知、语法运用、工作模式、面向对象的理解的把握都提出了更高的要求,特别是在游戏当中对外部按键的处理,各子程序的调用流程,先后顺序等码的复杂程度也都是一般程序不能比的。可以这样说,能完整的编出游戏,并可以稳定运,会让我们对游戏有一个更深刻的认识;对游戏编写的难度有一个更切身的理解;对自己的编程能力及逻辑思维能力有一个很大的提高;再一次看到了java语言的面向对象性、动态性、高性能性,相信对java语言的学习也不无帮助。 二、课题的国内外开发动态 随着人们生活质量的不断提高以及个人电脑和网络的普及,人们的业余生活质量要求也在不段提高,选择一款好玩、精美、画面、品质优良的休闲游戏已经成为一种流的休闲方式。可以说在人们的日常生活中,除了工作,学习,玩一款自己喜欢的游戏正在成为一种时尚。所以,开发一款大家都比较喜欢的,高品质的休闲游戏,将会收到人们的普遍欢迎。让人们在工作学习之余,享受游戏的快乐,也是一款游戏真正成功的意义。Java是一种简单的,面向对象的,分布式的,健壮的,安全的,可移植的,性能很优异的语言。Java是休闲互动游戏开发的先导语言,使用java作为开发工具,是一种很理性的选择。 三、课题的基本内容 这是一款十分变态虐心的休闲游戏游戏主打像素风格,粗看画面十分简陋,,游戏中玩家需要点击屏幕操作一只小鸟在类似《超级马里奥》的绿色管道改变的数字中穿游戏的方式是飞翔的小鸟带数字和2048游戏的结合体,要是不幸小鸟带的数字碰到不对应的数字障碍,或者不点击屏幕就直接Game Over。游戏里对小鸟的触碰判定非常严格,只要稍微节奏慢少许或者快了一点就会结束。由于游湖完全没有道具辅助,很多时候开局连第一个障碍也过不了就不得不重来。虽然只是一款小游戏,玩法也不特别,不过却抓住了玩家输不起的心理,用超高难度吸引玩家来挑战。 四、拟需要解决的主要问题 飞翔的小鸟+2048小游戏开发的技术难点主要两个方面:一是界面的布局;二是游戏数据的安排。游戏很注重玩家的感受,所以界面的布局很重要,其次数据的显示在一个游戏的玩耍中也很重要,合理规划设计,开发出让玩家享受的游戏。正确理解实际运中玩家的感受,解决游戏中模块的科学划分与结构组织,更好更快的开发设计游戏。 五、课题设计的实现方案 (1)本游戏开发语言的选 飞翔的小鸟游戏以纯java语言来开发编写。Java是由Sun Microsystems公司推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。Java最初被称为Oak,是1991年为消费类电子产品的嵌入式芯片而设计的。1995年更名为Java,并重新设计用于开发Internet应用程序。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持Javaapplet。另一方面,Java技术也不断更新。Java自面世后就非常流,发展迅速,对C++语言形成有力冲击。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 (2)本游戏开发工具的选择 飞翔的小鸟游戏使用的开发工具是一个开放源代码的、基于Java的可扩展开发平台eclipse来开发实现。Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,通过安装不同的插件Eclipse可以支持不同的计算机语言,比如C++和Python等开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。 六、研究方法 该毕业设计采用的研究方法主要有文献法和调查法。该毕业设计具体功能的获取过程主要使用文献法和走访调查法,通过网络调查和查阅网络资料来具体确定该软件的功能需求细节;在软件开发过程中,解决技术问题使用的方法是文献法,通过查阅课本、图书馆资料和网络在线文献等,解决在软件开发过程中的技术问题,比如数据库、建模工具的使用、软件测试等。 七、选题的特色及创新点 选题的特色:本毕业设计的开题经过走访调查和文献查阅等多种方式,基本可以与现实的需求相一致,并能体现用所学的知识和计算机技术解决实际问题。 选题的创新点:该选题采用的均是计算机成熟的技术,在计算机技术方面并没有体现创新点,但是通过完成该毕业设计,可以使得自己对计算机软件开发由更深的认识,积极培养自己的创新意识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值