设为首页 收藏本站
查看: 787|回复: 0

[经验分享] 写简单游戏,学编程语言-python篇:大鱼吃小鱼

[复制链接]

尚未签到

发表于 2015-4-20 07:33:33 | 显示全部楼层 |阅读模式
  
  很常见的游戏之一,实现原理并不复杂,并且参考了几个相关的代码。这边主要还是以学习编程语言和学习编程思路为重点记录一下吧。最近时间有点吃紧,只能匆忙记录一下。用pygame做的大鱼吃小鱼的游戏截图如下:(有些鱼的图片背景没有做透明处理,这块确实需要点美工时间,只能先凑合了)。


  
  下面的图片是网上随便找的素材,这里用于切换主角的图片有三张,其他则是其他小鱼和boss鱼。我们控制的主人鱼的大小范围来决定加载不同的图片。以上准备的素材,其中一些背景色没有时间做处理,所以游戏中会有难看的背景色,只能凑合着用。。。
  一、玩法及逻辑相关:
  控制你的鱼,有个初始大小,当碰到比你小的鱼的时候,你会吃掉它,并且会变大;遇到比你大的鱼,受到一点伤害,当总生命值为0时,失败游戏结束;当你控制的鱼大小增大最大时,游戏获胜。当鱼受到伤害时,有一段时间是无敌时间,且会闪烁。下面是主要的逻辑处理代码
  





1        flashIsOn=round(time.time(),1)*10%2==1
2         if not gameOverMode and not (invulnerableMode and flashIsOn):
3             playerobj['rect']=pygame.Rect((playerobj['x']-camerax,playerobj['y']
4                                            -cameray,playerobj['size'],playerobj['size']))
5             SCREEN.blit(playerobj['surface'],playerobj['rect'])
6         for event in pygame.event.get():
7             if event.type == QUIT:
8                 pygame.quit()
9                 sys.exit()
10             elif event.type==KEYDOWN:
11                 if event.key in (K_UP,K_w):
12                     moveDown =False
13                     moveUp = True
14                 elif event.key in (K_DOWN,K_s):
15                     moveDown =True
16                     moveUp = False
17                 elif event.key in (K_LEFT,K_a):
18                     moveRight = False
19                     moveLeft= True
20                     if playerobj['facing']==RIGHT:
21                         playerobj['surface']=playersurfaceset(playerobj['size'], True)
22                     playerobj['facing']=LEFT
23                 elif event.key in (K_RIGHT,K_d):
24                     moveRight = True
25                     moveLeft= False
26                     if playerobj['facing']==LEFT:
27                         playerobj['surface']=playersurfaceset(playerobj['size'], False)
28                     playerobj['facing']=RIGHT
29                 elif winMode and event.key == K_r:
30                     return
31             elif event.type==KEYUP:
32                     if event.key in (K_LEFT,K_a):
33                         moveLeft=False
34                     elif event.key in (K_RIGHT,K_d):
35                         moveRight=False
36                     elif event.key in (K_UP,K_w):
37                         moveRight=False
38                     elif event.key in (K_DOWN,K_s):
39                         moveRight=False
40             if not gameOverMode:
41                 if moveLeft:
42                     playerobj['x']-=MOVESPEED
43                 if moveRight:
44                     playerobj['x']+=MOVESPEED
45                 if moveUp:
46                     playerobj['y']-=MOVESPEED
47                 if moveDown:
48                     playerobj['y']+=MOVESPEED
49                 for i in range(len(fishobjs)-1,-1,-1):
50                     obj=fishobjs
51                     if 'rect' in obj and playerobj['rect'].colliderect(obj['rect']):
52                         if obj['width']*obj['height']WINSIZE:
60                                 winMode=True
61                         elif not invulnerableMode:
62                             invulnerableMode=True
63                             invulnerableStartTime=time.time()
64                             playerobj['health']-=1
65                             if playerobj['health']==0:
66                                 gameOverMode =True
67                                 gameOverStartTime=time.time()
View Code   主人公的控制类似一般的处理,这边用flashIsonl来生成时间差(偶数值时间为真)playersurfaceset()函数决定主人公的图片类型。
  二、敌方鱼的生成处理
  上篇做的敌方的处理会在当前视口随即出现,这个突兀感太强,鱼的出现也不能随机显示在当前视口,应该由摄像机视角之外生成才符合常理。并且当鱼离摄像区域太远的距离,需要删除掉鱼对象。



1 for i in range(len(fishobjs)-1,-1,-1):
2             if isOutsideArea(camerax,cameray,fishobjs):
3                 del fishobjs
4         while len(fishobjs)CAMERASLACK:
6             camerax=playerCenterx-CAMERASLACK-HALF_WINWIDTH
7         if (cameray+HALF_WINHEIGHT)-playerCentery>CAMERASLACK:
8             cameray=playerCentery+CAMERASLACK-HALF_WINHEIGHT
9         elif playerCentery-(camerax+HALF_WINHEIGHT)>CAMERASLACK:
10             cameray=playerCentery-CAMERASLACK-HALF_WINHEIGHT
  大部分应该介绍的应该就这些了,只能说游戏这块水比较深,只能浅尝辄止一番,python做游戏只能简单玩玩,这块不是他的优势。有人感兴趣的话可以研究它,推荐一本不错的书《Making games with python $ pygame》,哎 只能说有巨人的肩膀上站真好。
  园友交流群:21735072  有兴趣请加入~欢迎来灌水~~~~ 注明:博客园     
  附全部源代码如下,比较粗陋,建议以书上源码学习为主:





import pygame,sys,time,random
from pygame.locals import *
WINWIDTH=640
WINHEIGHT=480
CAMERASLACK=70
lfish_img=[]
FISHSIZE=8
PLAYERSIZE=3
SCREEN=None
rfish_img=[]
lplayer_img=[]
rplayer_img=[]
backgroundimg=None
rboss_img=None
lboss_img=None
FPS=30
WHITE=[255,255,255]
MAXHEALTH=3
MINSPEED=3
MAXSPEED=9
MOVESPEED=7
HALF_WINWIDTH=int(WINWIDTH/2)
HALF_WINHEIGHT=int(WINHEIGHT/2)
WINSIZE=300
def main():
global FPSCLOCK,SCREEN,lfish_img,rfish_img,lplayer_img,rplayer_img,BASICFONT\
,rboss_img,lboss_img,backgroundimg
pygame.init()
FPSCLOCK=pygame.time.Clock()
SCREEN=pygame.display.set_mode((WINWIDTH,WINHEIGHT))
pygame.display.set_caption("fish eat fish")
BASICFONT=pygame.font.Font("freesansbold.ttf",32)
for i in range(FISHSIZE):
fishimg=pygame.image.load("Fish%s.bmp" % i)
fishimg.set_colorkey(WHITE)
lfish_img.append(fishimg)
rfishimg=pygame.transform.flip(fishimg,True,False)
rfish_img.append(rfishimg)
for i in range(PLAYERSIZE):
playerimg=pygame.image.load("player%s.png" % i)
playerimg.set_colorkey(WHITE)   
lplayer_img.append(playerimg)
rplayerimg=pygame.transform.flip(playerimg,True,False)
rplayerimg.set_colorkey(WHITE)
rplayer_img.append(rplayerimg)
bossimg=pygame.image.load("boss.png")
#     bossimg.set_colorkey([0,0,0])
#     SCREEN.blit(bossimg,(0,0))
lboss_img=bossimg
rbossimg=pygame.transform.flip(bossimg,True,False)
rboss_img=rbossimg
backgroundimg=pygame.image.load("background.jpg")
while True:
runGame()
def runGame():
invulnerableMode=False
invulnerableStartTime=0
gameOverMode=False
gameOverStartTime=0
winMode = False
gameOverSurf=BASICFONT.render('Game Over',True,WHITE)
gameOverRect=gameOverSurf.get_rect()
gameOverRect.center=(HALF_WINWIDTH,HALF_WINHEIGHT)
winSurf=BASICFONT.render('you succeed',True,WHITE)
winRect=winSurf.get_rect()
winRect.center=(HALF_WINWIDTH,HALF_WINHEIGHT)
winSurf2=BASICFONT.render('you succeed',True,WHITE)
winRect2=winSurf2.get_rect()
winRect2.center=(HALF_WINWIDTH,HALF_WINHEIGHT+30)
camerax=0
cameray=0
LEFT=0
RIGHT=1
fishobjs=[]
playerobj={'surface':pygame.transform.scale(lplayer_img[0],(25,25)),
'size':25,
'facing':LEFT,
'x':HALF_WINWIDTH,
'y':HALF_WINHEIGHT,
'health':MAXHEALTH}
moveLeft = False
moveRight = False
moveUp = False
moveDown = False
while True:
if invulnerableMode and time.time() - invulnerableStartTime>2:
invulnerableMode =False
for sobj in fishobjs:
sobj['x']+=sobj['movx']
sobj['y']+=sobj['movy']
for i in range(len(fishobjs)-1,-1,-1):
if isOutsideArea(camerax,cameray,fishobjs):
del fishobjs
while len(fishobjs)CAMERASLACK:
camerax=playerCenterx+CAMERASLACK-HALF_WINWIDTH
elif playerCenterx-(camerax+HALF_WINWIDTH)>CAMERASLACK:
camerax=playerCenterx-CAMERASLACK-HALF_WINWIDTH
if (cameray+HALF_WINHEIGHT)-playerCentery>CAMERASLACK:
cameray=playerCentery+CAMERASLACK-HALF_WINHEIGHT
elif playerCentery-(camerax+HALF_WINHEIGHT)>CAMERASLACK:
cameray=playerCentery-CAMERASLACK-HALF_WINHEIGHT
backrect=pygame.Rect((camerax-WINWIDTH,cameray-WINHEIGHT,WINWIDTH*3,WINHEIGHT*3))
newbackgroundimg=pygame.transform.scale(backgroundimg,(WINWIDTH*3,WINHEIGHT*3))
SCREEN.blit(newbackgroundimg,backrect)
for obj in fishobjs:
obj['rect']=pygame.Rect((obj['x']-camerax,obj['y']-cameray,obj['width']
,obj['height']))
SCREEN.blit(obj['surface'],obj['rect'])
flashIsOn=round(time.time(),1)*10%2==1
if not gameOverMode and not (invulnerableMode and flashIsOn):
playerobj['rect']=pygame.Rect((playerobj['x']-camerax,playerobj['y']
-cameray,playerobj['size'],playerobj['size']))
SCREEN.blit(playerobj['surface'],playerobj['rect'])
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type==KEYDOWN:
if event.key in (K_UP,K_w):
moveDown =False
moveUp = True
elif event.key in (K_DOWN,K_s):
moveDown =True
moveUp = False
elif event.key in (K_LEFT,K_a):
moveRight = False
moveLeft= True
if playerobj['facing']==RIGHT:
playerobj['surface']=playersurfaceset(playerobj['size'], True)
playerobj['facing']=LEFT
elif event.key in (K_RIGHT,K_d):
moveRight = True
moveLeft= False
if playerobj['facing']==LEFT:
playerobj['surface']=playersurfaceset(playerobj['size'], False)
playerobj['facing']=RIGHT
elif winMode and event.key == K_r:
return
elif event.type==KEYUP:
if event.key in (K_LEFT,K_a):
moveLeft=False
elif event.key in (K_RIGHT,K_d):
moveRight=False
elif event.key in (K_UP,K_w):
moveRight=False
elif event.key in (K_DOWN,K_s):
moveRight=False
if not gameOverMode:
if moveLeft:
playerobj['x']-=MOVESPEED
if moveRight:
playerobj['x']+=MOVESPEED
if moveUp:
playerobj['y']-=MOVESPEED
if moveDown:
playerobj['y']+=MOVESPEED
for i in range(len(fishobjs)-1,-1,-1):
obj=fishobjs
if 'rect' in obj and playerobj['rect'].colliderect(obj['rect']):
if obj['width']*obj['height']WINSIZE:
winMode=True
elif not invulnerableMode:
invulnerableMode=True
invulnerableStartTime=time.time()
playerobj['health']-=1
if playerobj['health']==0:
gameOverMode =True
gameOverStartTime=time.time()
if winMode:
SCREEN.blit(winSurf,winRect)
SCREEN.blit(winSurf2,winRect2)         
pygame.display.update()
FPSCLOCK.tick(FPS)
def isOutsideArea(camerax,cameray,fishobj):            
boundsLeftEdge =camerax-WINWIDTH
boundsTopEdge=cameray-WINHEIGHT
boundsRect=pygame.Rect(boundsLeftEdge,boundsTopEdge,WINWIDTH*3,WINHEIGHT*3)
objRect=pygame.Rect(fishobj['x'],fishobj['y'],fishobj['width'],fishobj['height'])
return not boundsRect.colliderect(objRect)
def makeNewfish(camerax,cameray):
sq={}
generalSize=random.randint(5,25)
multiplier = random.randint(1,3)
sq['width'] = (generalSize +random.randint(0,10))*multiplier
sq['height']= (generalSize +random.randint(0,10))*multiplier
sq['x'],sq['y']=getRandomoffCameraPos(camerax,cameray,sq['width'],sq['height'])
sq['movx'] = getRandomVelcocity()
sq['movy'] = getRandomVelcocity()
if sq['movx']

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-58603-1-1.html 上篇帖子: Python多线程学习 下篇帖子: 编程语言入门经典100例【Python版】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表