本文目标
本次我们要做一个很简单的小游戏:从天上会随机的掉下鱼,你需要使用鼠标操纵猫去接住鱼,丢失一条鱼损失一条命,一共有10条命,同时还要避免接到炸弹。接住鱼会有积分。
游戏效果图如下:
游戏下载地址:http://pan.baidu.com/s/1qWA4xZ2
源代码下载地址:http://pan.baidu.com/s/1i3is15j
源码分享
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
# -*-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行。
为了判断玩家是否错过鱼或者接到鱼,我们还需要写一个简单的碰撞检测函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#如果错过鱼的话,就重置鱼的位置,给它一个随机的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 |
同理炸弹的检测和这个是类似的
1 2 3 4 5 6 |
if bomb_y > 500: bomb_x = random.randint(0, 500) bomb_y = -50 lives -= 1 if lives == 0: game_over = True |
为了控制猫的坐标不超出屏幕范围,我们加入了如下的代码:
1 2 3 4 5 |
pos_x = mouse_x if pos_x < 0: pos_x = 0 elif pos_x > 510: pos_x = 500 |
猫在接到炸弹。或者生命值小于5的时候,会变成哭脸,因此我们还需要加载一张哭脸的位图,然后在程序中添加一些相应的逻辑代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#加载猫的哭脸位图 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 |
最后我们可以使用PyInstaller将其打包成exe并发布。
PyInstaller打包流程请看这里:http://code.py40.com/38.html
通过这个十分简陋的游戏,我们大概回顾了一下之前学到的知识。(游戏相当的简陋了,连声音都没有。。。)
下个博客我们将深入学习pygame中的Sprite(精灵)模块,并且了解如何加载动画和Sprite中的碰撞检测函数。
未经允许不得转载:Python在线学习 » Python游戏开发教程五:大喵爱吃鱼小游戏开发实例