pygame源码分享分享网站?python游戏源码

今天给各位分享pygame源码分享分享网站的知识,其中也会对python游戏源码进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

作者|李秋键

出品|AI科技大本营(rgznai100)

《坦克大战》是1985年日本南梦宫Namco游戏公司在任天堂FC平台上,推出的一款多方位平面射击游戏。游戏以坦克战斗及保卫基地为主题,属于策略型联机类。同时也是FC平台上少有的内建关卡编辑器的几个游戏之一,玩家可自己创建独特的关卡,并通过获取一些道具使坦克和基地得到强化。而今天我们就将利用python还原以下坦克大战的制作。

实验前的准备

首先我们使用的Python版本是3.6.5所用到的模块如下:

Pygame模块用来创建游戏整体框架、精灵等基本架构;

OS模块用来加载本地文件(包括音乐,背景、图片等素材)。

精灵类程序

其中精灵类设置作为基本程序框架用来主函数的调用,其中包括子弹类程序、食物类、家类、砖墙树木等障碍物类、坦克类。具体程序布局如下:

其中子弹类程序,首先需要建立bullet.py程序,建立类包括子弹位置、方向、图片加载、子弹速度等基本信息。具体代码如下:

”’子弹”’classBullet(pygame.sprite.Sprite):def__init__(self,bullet_image_paths,screensize,direction,position,border_len,is_stronger=False,speed=8,**kwargs):pygame.sprite.Sprite.__init__(self)self.bullet_image_paths=bullet_image_pathsself.width,self.height=screensizeself.direction=directionself.position=positionself.image=pygame.image.load(self.bullet_image_paths.get(direction))self.rect=self.image.get_rectself.rect.center=position是否为加强版子弹(加强版可碎铁墙)self.is_stronger=is_stronger玩家1/玩家2self.name=name地图边缘宽度self.border_len=border_len初始坦克方向self.init_direction=direction子弹图片self.bullet_image_paths=bullet_image_paths坦克爆炸图self.boom_image=pygame.image.load(boom_image_path)self.boom_last_time=5self.booming_flag=Falseself.boom_count=0重置self.reset”’移动”’defmove(self,direction,scene_elems,player_tanks_group,enemy_tanks_group,home):方向不一致先改变方向ifself.direction!=direction:self.setDirection(direction)self.switch_count=self.switch_timeself.move_cache_count=self.move_cache_time–碰到场景元素forkey,valueinscene_elems.items:ifkeyin[‘brick_group’,’iron_group’,’river_group’]:ifpygame.sprite.spritecollide(self,value,False,None):self.rect=rect_orielifkeyin[‘ice_group’]:ifpygame.sprite.spritecollide(self,value,False,None):self.rect=self.rect.move(speed)–碰到敌方坦克ifpygame.sprite.spritecollide(self,enemy_tanks_group,False,None):self.rect=rect_ori–碰到边界ifself.rect.left<self.border_len:self.rect.left=self.border_lenelifself.rect.right>self.screensize[0]-self.border_len:self.rect.right=self.screensize[0]-self.border_lenelifself.rect.top<self.border_len:self.rect.top=self.border_lenelifself.rect.bottom>self.screensize[1]-self.border_len:self.rect.bottom=self.screensize[1]-self.border_len玩家数量选择player_render_white=font.render(‘1PLAYER’,True,color_white)player_render_red=font.render(‘1PLAYER’,True,color_red)player_rect=player_render_white.get_rectplayer_rect.left,player_rect.top=cfg.WIDTH/2.8,cfg.HEIGHT/2.5players_render_white=font.render(‘2PLAYERS’,True,color_white)players_render_red=font.render(‘2PLAYERS’,True,color_red)players_rect=players_render_white.get_rectplayers_rect.left,players_rect.top=cfg.WIDTH/2.8,cfg.HEIGHT/2主循环clock=pygame.time.Clockis_dual_mode=FalsewhileTrue:foreventinpygame.event.get:ifevent.type==pygame.QUIT:pygame.quitsys.exitelifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_RETURN:returnis_dual_modeelifevent.key==pygame.K_UPorevent.key==pygame.K_DOWNorevent.key==pygame.K_worevent.key==pygame.K_s:is_dual_mode=notis_dual_modescreen.blit(background_img,(0,0))screen.blit(logo_img,logo_rect)game_tip_flash_count+=1ifgame_tip_flash_count>game_tip_flash_time:game_tip_show_flag=notgame_tip_show_flaggame_tip_flash_count=0ifgame_tip_show_flag:screen.blit(game_tip,game_tip_rect)ifnotis_dual_mode:tank_rect.right,tank_rect.top=player_rect.left-10,player_rect.topscreen.blit(tank_cursor,tank_rect)screen.blit(player_render_red,player_rect)screen.blit(players_render_white,players_rect)else:tank_rect.right,tank_rect.top=players_rect.left-10,players_rect.topscreen.blit(tank_cursor,tank_rect)screen.blit(player_render_white,player_rect)screen.blit(players_render_red,players_rect)pygame.display.updateclock.tick(60)

游戏结束界面包括游戏胜利与失败情况判断和是否退出游戏或重新开始的设置:

”’游戏结束界面”’defgameEndIterface(screen,cfg,is_win=True):background_img=pygame.image.load(cfg.OTHER_IMAGE_PATHS.get(‘background’))color_white=(255,255,255)color_red=(255,0,0)font=pygame.font.Font(cfg.FONTPATH,cfg.WIDTH//12)游戏胜利与否的提示ifis_win:font_render=font.render(‘Congratulations,Youwin!’,True,color_white)else:font_render=font.render(‘Sorry,Youfail!’,True,color_white)font_rect=font_render.get_rectfont_rect.centerx,font_rect.centery=cfg.WIDTH/2,cfg.HEIGHT/3主循环clock=pygame.time.ClockwhileTrue:foreventinpygame.event.get:ifevent.type==pygame.QUIT:pygame.quitsys.exitelifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_RETURN:returnis_quit_gameelifevent.key==pygame.K_UPorevent.key==pygame.K_DOWNorevent.key==pygame.K_worevent.key==pygame.K_s:is_quit_game=notis_quit_gamescreen.blit(background_img,(0,0))gameover_flash_count+=1ifgameover_flash_count>gameover_flash_time:gameover_show_flag=notgameover_show_flaggameover_flash_count=0ifgameover_show_flag:screen.blit(gameover_img,gameover_img_rect)screen.blit(font_render,font_rect)ifnotis_quit_game:tank_rect.right,tank_rect.top=restart_rect.left-10,restart_rect.topscreen.blit(tank_cursor,tank_rect)screen.blit(restart_render_red,restart_rect)screen.blit(quit_render_white,quit_rect)else:tank_rect.right,tank_rect.top=quit_rect.left-10,quit_rect.topscreen.blit(tank_cursor,tank_rect)screen.blit(restart_render_white,restart_rect)screen.blit(quit_render_red,quit_rect)pygame.display.updateclock.tick(60)

游戏界面切换主要是利用进度条加载:

”’关卡切换界面”’defswitchLevelIterface(screen,cfg,level_next=1):background_img=pygame.image.load(cfg.OTHER_IMAGE_PATHS.get(‘background’))color_white=(255,255,255)color_gray=(192,192,192)font=pygame.font.Font(cfg.FONTPATH,cfg.WIDTH//20)logo_img=pygame.image.load(cfg.OTHER_IMAGE_PATHS.get(‘logo’))logo_img=pygame.transform.scale(logo_img,(446,70))logo_rect=logo_img.get_rectlogo_rect.centerx,logo_rect.centery=cfg.WIDTH/2,cfg.HEIGHT//4游戏加载进度条gamebar=pygame.image.load(cfg.OTHER_IMAGE_PATHS.get(‘gamebar’)).convert_alphagamebar_rect=gamebar.get_rectgamebar_rect.centerx,gamebar_rect.centery=cfg.WIDTH/2,cfg.HEIGHT/1.4tank_cursor=pygame.image.load(cfg.PLAYER_TANK_IMAGE_PATHS.get(‘player1’)[0]).convert_alpha.subsurface((0,144),(48,48))tank_rect=tank_cursor.get_recttank_rect.left=gamebar_rect.lefttank_rect.centery=gamebar_rect.centery主循环clock=pygame.time.ClockwhileTrue:foreventinpygame.event.get:ifevent.type==pygame.QUIT:pygame.quitsys.exitifload_time_left<=0:returnscreen.blit(background_img,(0,0))screen.blit(logo_img,logo_rect)screen.blit(font_render,font_rect)screen.blit(gamebar,gamebar_rect)screen.blit(tank_cursor,tank_rect)pygame.draw.rect(screen,color_gray,(gamebar_rect.left+8,gamebar_rect.top+8,tank_rect.left-gamebar_rect.left-8,tank_rect.bottom-gamebar_rect.top-16))tank_rect.left+=1load_time_left-=1pygame.display.updateclock.tick(60)

完整代码:

https://pan.baidu.com/s/1BUh9M73AAGkZeDN0IEKdKA

提取码:09bl

作者:李秋键

CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等。

好了,关于pygame源码分享分享网站和python游戏源码的问题到这里结束啦,希望可以解决您的问题哈!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平