【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例
2015-11-30 14:03
726 查看
本系列博客介绍以python+pygame库进行小游戏的开发。有写的不对之处还望各位海涵。
我们一同在前几期的博客中已经学到了很多pygame的基本知识了,现在该做个小游戏实战一下了。
前几期博客链接:
第一篇:初识pygame http://www.cnblogs.com/msxh/p/4966899.html
第二篇:pygame中的IO、数据 http://www.cnblogs.com/msxh/p/4973003.html
第三篇:pygame事件与设备轮询 http://www.cnblogs.com/msxh/p/4979380.html
第四篇:pygame中加载位图及些常用的数学函数 http://www.cnblogs.com/msxh/p/4990435.html
本次我们要做一个很简单的小游戏:从天上会随机的掉下鱼,你需要使用鼠标操纵猫去接住鱼,丢失一条鱼损失一条命,一共有10条命,同时还要避免接到炸弹。接住鱼会有积分。
游戏效果图如下:
游戏下载地址:http://pan.baidu.com/s/1qWA4xZ2
源代码下载地址:http://pan.baidu.com/s/1i3is15j
还是先上一下完整的源代码吧:
关于位图的加载,设备轮询等等的内容我们就不在这里赘述了,不熟悉的可以查看前几期的博客。
为了让游戏更有趣味性,我们设置一下鱼的速度是可以变的。当得到的分数在不同区间的时候,会有不同的速度。(速度会越来快。)详见代码83-107行。
为了判断玩家是否错过鱼或者接到鱼,我们还需要写一个简单的碰撞检测函数:
同理炸弹的检测和这个是类似的。
为了控制猫的坐标不超出屏幕范围,我们加入了如下的代码:
猫在接到炸弹。或者生命值小于5的时候,会变成哭脸,因此我们还需要加载一张哭脸的位图,然后在程序中添加一些相应的逻辑代码:
最后我们可以使用py2exe将其打包成exe并发布。py2exe打包流程请看这里:http://www.cnblogs.com/msxh/p/4886628.html
通过这个十分简陋的游戏,我们大概回顾了一下之前学到的知识。(游戏相当的简陋了,连声音都没有。。。)
下个博客我们将深入学习pygame中的Sprite(精灵)模块,并且了解如何加载动画和Sprite中的碰撞检测函数。
我们一同在前几期的博客中已经学到了很多pygame的基本知识了,现在该做个小游戏实战一下了。
前几期博客链接:
第一篇:初识pygame http://www.cnblogs.com/msxh/p/4966899.html
第二篇:pygame中的IO、数据 http://www.cnblogs.com/msxh/p/4973003.html
第三篇:pygame事件与设备轮询 http://www.cnblogs.com/msxh/p/4979380.html
第四篇:pygame中加载位图及些常用的数学函数 http://www.cnblogs.com/msxh/p/4990435.html
本次我们要做一个很简单的小游戏:从天上会随机的掉下鱼,你需要使用鼠标操纵猫去接住鱼,丢失一条鱼损失一条命,一共有10条命,同时还要避免接到炸弹。接住鱼会有积分。
游戏效果图如下:
游戏下载地址:http://pan.baidu.com/s/1qWA4xZ2
源代码下载地址:http://pan.baidu.com/s/1i3is15j
还是先上一下完整的源代码吧:
# -*-coding:utf-8-*- s = ' #AoDaMiao Like Eating Fish import sys, random, time, pygame from pygame.locals import * def print_text(font, x, y, text, color=(255,255,255)): imgText = font.render(text, True, color) screen.blit(imgText, (x,y)) #main program begins pygame.init() screen = pygame.display.set_mode((600,500)) pygame.display.set_caption("嗷大喵爱吃鱼!") font1 = pygame.font.Font(None, 24) font2 = pygame.font.Font(None, 18) font3 = pygame.font.Font(None, 34) pygame.mouse.set_visible(False) white = 255,255,255 red = 220, 50, 50 yellow = 230,230,50 black = 0,0,0 cat=pygame.image.load("aodamiao_2.png") width,height=cat.get_size() pic=pygame.transform.scale(cat,(width,height)) fish=pygame.image.load("fish.png") width,height=fish.get_size() fish=pygame.transform.smoothscale(fish,(width//3,height//3)) init=pygame.image.load("init.png") lives = 10 score = 0 clock_start = 0 game_over = 1 mouse_x = mouse_y = 0 Round =1 mine=0 mine_png=pygame.image.load("mine.png") cat2=pygame.image.load("aodamiao_3.png") flag=0 pos_x = 300 pos_y = 410-40 bomb_x = random.randint(0,500) mine_x=random.randint(0,500) bomb_y = -50 vel_y = 0.4 vel_yy=0.6 mine_y=-100 #repeating loop while True: for event in pygame.event.get(): if event.type == pygame.QUIT: #sys.exit() pygame.quit() exit() elif event.type == MOUSEMOTION: mouse_x,mouse_y = event.pos move_x,move_y = event.rel elif event.type == MOUSEBUTTONUP: if game_over: game_over = False lives = 10 score = 0 Round =1 vel_y=0.4 mine=0 flag=0 pic=cat bomb_y = -50 keys = pygame.key.get_pressed() if keys[K_ESCAPE]: sys.exit() screen.fill((0,0,100)) if game_over: screen.blit(init,(60, 60)) print_text(font3, 200, 400,"Clicked To Play!") print_text(font2, 310, 480,"Copyright@2015 developed by xiaoxiami") else: #Round setting if score >300 and score <600: Round=2 elif score >600 and score <900: Round =3 elif score >900 and score <1200: Round=4 elif score >1200 and score <1500: Round =5 elif score >=1500: Round =6 #draw the Round print_text(font1, 280, 0, "Round: " + str(Round)) #speed setting if Round ==1: vel_y=0.4 elif Round ==2: vel_y=0.6 elif Round ==3: vel_y=0.8 elif Round ==4: vel_y=1.0 elif Round ==5: vel_y=1.2 #mine number setting #mine=random.randint(1,9) #move the fish bomb_y += vel_y mine_y+=vel_yy #has the player missed the fish? if bomb_y > 500: bomb_x = random.randint(0, 500) bomb_y = -50 lives -= 1 if lives == 0: game_over = True #see if player has caught the fish elif bomb_y > pos_y: if bomb_x > pos_x-10 and bomb_x < pos_x + 70: score += 10 bomb_x = random.randint(0, 500) bomb_y = -50 if Round >2: #has the player missed the mine? if mine_y > 500: mine_x = random.randint(0, 500) mine_y = -50 #see if player has caught the mine elif mine_y > pos_y: if mine_x > pos_x and mine_x < pos_x + 40: mine_x = random.randint(0, 500) mine_y = -50 lives-=1 pic=cat2 if lives == 0: game_over = True #draw the fish screen.blit(fish,(bomb_x,int(bomb_y))) #draw the mine if Round >2: screen.blit(mine_png,(mine_x,int(mine_y))) #set cat position pos_x = mouse_x if pos_x < 0: pos_x = 0 elif pos_x > 510: pos_x = 500 #draw cat if lives<5: pic=cat2 screen.blit(pic,(pos_x,pos_y)) #print # of lives print_text(font1, 0, 0, "LIVES: " + str(lives)) #print score print_text(font1, 500, 0, "SCORE: " + str(score)) pygame.display.update()
关于位图的加载,设备轮询等等的内容我们就不在这里赘述了,不熟悉的可以查看前几期的博客。
为了让游戏更有趣味性,我们设置一下鱼的速度是可以变的。当得到的分数在不同区间的时候,会有不同的速度。(速度会越来快。)详见代码83-107行。
为了判断玩家是否错过鱼或者接到鱼,我们还需要写一个简单的碰撞检测函数:
#如果错过鱼的话,就重置鱼的位置,给它一个随机的x值,然后生命值 减一 if bomb_y > 500: bomb_x = random.randint(0, 500) bomb_y = -50 lives -= 1 if lives == 0: game_over = True #简单碰撞检测函数,查看是否接住鱼 elif bomb_y > pos_y: if bomb_x > pos_x-10 and bomb_x < pos_x + 70: score += 10 bomb_x = random.randint(0, 500) bomb_y = -50
同理炸弹的检测和这个是类似的。
if bomb_y > 500: bomb_x = random.randint(0, 500) bomb_y = -50 lives -= 1 if lives == 0: game_over = True
为了控制猫的坐标不超出屏幕范围,我们加入了如下的代码:
pos_x = mouse_x if pos_x < 0: pos_x = 0 elif pos_x > 510: pos_x = 500
猫在接到炸弹。或者生命值小于5的时候,会变成哭脸,因此我们还需要加载一张哭脸的位图,然后在程序中添加一些相应的逻辑代码:
#加载猫的哭脸位图 cat2=pygame.image.load("aodamiao_3.png") #当接到炸弹的时候,猫变成哭脸 elif mine_y > pos_y: if mine_x > pos_x and mine_x < pos_x + 40: mine_x = random.randint(0, 500) mine_y = -50 lives-=1 pic=cat2 if lives == 0: game_over = True #当猫的生命值小于5时,猫变成哭脸 if lives<5: pic=cat2
最后我们可以使用py2exe将其打包成exe并发布。py2exe打包流程请看这里:http://www.cnblogs.com/msxh/p/4886628.html
通过这个十分简陋的游戏,我们大概回顾了一下之前学到的知识。(游戏相当的简陋了,连声音都没有。。。)
下个博客我们将深入学习pygame中的Sprite(精灵)模块,并且了解如何加载动画和Sprite中的碰撞检测函数。
相关文章推荐
- Python中函数式使用
- Python机器学习库scikit-learn实践
- 运算符优先级-Python 运算符优先级
- 使用Python学习RabbitMQ消息队列
- python爬虫学习记录之报错及解决方案
- python学习系列之python装饰器基础(3)---装饰器实现用户登录验证
- python常见模块命令(os/sys/platform)
- Python字符串比较忽略大小写的方法
- Python技巧——根据函数名获得函数对象
- python处理文本又一坑--又是编码
- Python中使用UUID
- python3 基于原语锁的简单同步
- 在eclipse搭建python开发环境
- 10001---Python环境搭建(Windows)
- windows下python程序开机自启动
- python检查IP地址正确性
- Python练习sorted排序,不支持优先级的计算器
- python之装饰器
- 机器学习实战python版第四章基于概率论的分类方法 朴素贝叶斯
- 算法导论的python实现之插入排序