python教程分享基于Python实现经典植物大战僵尸游戏

游戏截图

基于Python实现经典植物大战僵尸游戏

基于Python实现经典植物大战僵尸游戏

基于Python实现经典植物大战僵尸游戏

动态演示

基于Python实现经典植物大战僵尸游戏

源码分享

state/tool.py

import os  import json  from abc import abstractmethod  import pygame as pg  from . import constants as c    class state():      def __init__(self):          self.start_time = 0.0          self.current_time = 0.0          self.done = false          self.next = none          self.persist = {}            @abstractmethod      def startup(self, current_time, persist):          '''abstract method'''        def cleanup(self):          self.done = false          return self.persist            @abstractmethod      def update(self, surface, keys, current_time):          '''abstract method'''    class control():      def __init__(self):          self.screen = pg.display.get_surface()          self.done = false          self.clock = pg.time.clock()          self.fps = 60          self.keys = pg.key.get_pressed()          self.mouse_pos = none          self.mouse_click = [false, false]  # value:[left mouse click, right mouse click]          self.current_time = 0.0          self.state_dict = {}          self.state_name = none          self.state = none          self.game_info = {c.current_time:0.0,                            c.level_num:c.start_level_num}         def setup_states(self, state_dict, start_state):          self.state_dict = state_dict          self.state_name = start_state          self.state = self.state_dict[self.state_name]          self.state.startup(self.current_time, self.game_info)        def update(self):          self.current_time = pg.time.get_ticks()          if self.state.done:              self.flip_state()          self.state.update(self.screen, self.current_time, self.mouse_pos, self.mouse_click)          self.mouse_pos = none          self.mouse_click[0] = false          self.mouse_click[1] = false        def flip_state(self):          previous, self.state_name = self.state_name, self.state.next          persist = self.state.cleanup()          self.state = self.state_dict[self.state_name]          self.state.startup(self.current_time, persist)        def event_loop(self):          for event in pg.event.get():              if event.type == pg.quit:                  self.done = true              elif event.type == pg.keydown:                  self.keys = pg.key.get_pressed()              elif event.type == pg.keyup:                  self.keys = pg.key.get_pressed()              elif event.type == pg.mousebuttondown:                  self.mouse_pos = pg.mouse.get_pos()                  self.mouse_click[0], _, self.mouse_click[1] = pg.mouse.get_pressed()                  print('pos:', self.mouse_pos, ' mouse:', self.mouse_click)        def main(self):          while not self.done:              self.event_loop()              self.update()              pg.display.update()              self.clock.tick(self.fps)          print('game over')    def get_image(sheet, x, y, width, height, colorkey=c.black, scale=1):          image = pg.surface([width, height])          rect = image.get_rect()            image.blit(sheet, (0, 0), (x, y, width, height))          image.set_colorkey(colorkey)          image = pg.transform.scale(image,                                     (int(rect.width*scale),                                      int(rect.height*scale)))          return image    def load_image_frames(directory, image_name, colorkey, accept):      frame_list = []      tmp = {}      # image_name is "peashooter", pic name is 'peashooter_1', get the index 1      index_start = len(image_name) + 1       frame_num = 0;      for pic in os.listdir(directory):          name, ext = os.path.splitext(pic)          if ext.lower() in accept:              index = int(name[index_start:])              img = pg.image.load(os.path.join(directory, pic))              if img.get_alpha():                  img = img.convert_alpha()              else:                  img = img.convert()                  img.set_colorkey(colorkey)              tmp[index]= img              frame_num += 1        for i in range(frame_num):          frame_list.append(tmp[i])      return frame_list    def load_all_gfx(directory, colorkey=c.white, accept=('.png', '.jpg', '.bmp', '.gif')):      graphics = {}      for name1 in os.listdir(directory):          # subfolders under the folder resourcesgraphics          dir1 = os.path.join(directory, name1)          if os.path.isdir(dir1):              for name2 in os.listdir(dir1):                  dir2 = os.path.join(dir1, name2)                  if os.path.isdir(dir2):                  # e.g. subfolders under the folder resourcesgraphicszombies                      for name3 in os.listdir(dir2):                          dir3 = os.path.join(dir2, name3)                          # e.g. subfolders or pics under the folder resourcesgraphicszombiesconeheadzombie                          if os.path.isdir(dir3):                              # e.g. it's the folder resourcesgraphicszombiesconeheadzombieconeheadzombieattack                              image_name, _ = os.path.splitext(name3)                              graphics[image_name] = load_image_frames(dir3, image_name, colorkey, accept)                          else:                              # e.g. pics under the folder resourcesgraphicsplantspeashooter                              image_name, _ = os.path.splitext(name2)                              graphics[image_name] = load_image_frames(dir2, image_name, colorkey, accept)                              break                  else:                  # e.g. pics under the folder resourcesgraphicsscreen                      name, ext = os.path.splitext(name2)                      if ext.lower() in accept:                          img = pg.image.load(dir2)                          if img.get_alpha():                              img = img.convert_alpha()                          else:                              img = img.convert()                              img.set_colorkey(colorkey)                          graphics[name] = img      return graphics    def loadzombieimagerect():      file_path = os.path.join('source', 'data', 'entity', 'zombie.json')      f = open(file_path)      data = json.load(f)      f.close()      return data[c.zombie_image_rect]    def loadplantimagerect():      file_path = os.path.join('source', 'data', 'entity', 'plant.json')      f = open(file_path)      data = json.load(f)      f.close()      return data[c.plant_image_rect]    pg.init()  pg.display.set_caption(c.original_caption)  screen = pg.display.set_mode(c.screen_size)    gfx = load_all_gfx(os.path.join("resources","graphics"))  zombie_rect = loadzombieimagerect()  plant_rect = loadplantimagerect()    

state/constants.py

    start_level_num = 1    original_caption = 'plant vs zombies game'    screen_width = 800  screen_height = 600  screen_size = (screen_width, screen_height)    grid_x_len = 9  grid_y_len = 5  grid_x_size = 80  grid_y_size = 100      white        = (255, 255, 255)  navyblue     = ( 60,  60, 100)  sky_blue     = ( 39, 145, 251)  black        = (  0,   0,   0)  lightyellow  = (234, 233, 171)  red          = (255,   0,   0)  purple       = (255,   0, 255)  gold         = (255, 215,   0)  green        = (  0, 255,   0)    size_multiplier = 1.3    #game info dictionary keys  current_time = 'current time'  level_num = 'level num'    #states for entire game  main_menu = 'main menu'  load_screen = 'load screen'  game_lose = 'game los'  game_victory = 'game victory'  level = 'level'    main_menu_image = 'mainmenu'  option_adventure = 'adventure'  game_loose_image = 'gameloose'  game_victory_image = 'gamevictory'    #map components  background_name = 'background'  background_type = 'background_type'  init_sun_name = 'init_sun_value'  zombie_list = 'zombie_list'    map_empty = 0  map_exist = 1    background_offset_x = 220  map_offset_x = 35  map_offset_y = 100    #menubar  choosebar_type = 'choosebar_type'  choosebar_static = 0  choosebar_move = 1  chossebar_bowling = 2  menubar_background = 'chooserbackground'  movebar_background = 'movebackground'  panel_background = 'panelbackground'  start_button = 'startbutton'  card_pool = 'card_pool'    movebar_card_fresh_time = 6000  card_move_time = 60    #plant info  plant_image_rect = 'plant_image_rect'  car = 'car'  sun = 'sun'  sunflower = 'sunflower'  peashooter = 'peashooter'  snowpeashooter = 'snowpea'  wallnut = 'wallnut'  cherrybomb = 'cherrybomb'  threepeashooter = 'threepeater'  repeaterpea = 'repeaterpea'  chomper = 'chomper'  cherry_boom_image = 'boom'  puffshroom = 'puffshroom'  potatomine = 'potatomine'  squash = 'squash'  spikeweed = 'spikeweed'  jalapeno = 'jalapeno'  scaredyshroom = 'scaredyshroom'  sunshroom = 'sunshroom'  iceshroom = 'iceshroom'  hypnoshroom = 'hypnoshroom'  wallnutbowling = 'wallnutbowling'  redwallnutbowling = 'redwallnutbowling'    plant_health = 5  wallnut_health = 30  wallnut_cracked1_health = 20  wallnut_cracked2_health = 10  wallnut_bowling_damage = 10    produce_sun_interval = 7000  flower_sun_interval = 22000  sun_live_time = 7000  sun_value = 25    ice_slow_time = 2000    freeze_time = 7500  icetrap = 'icetrap'    #plant card info  card_sunflower = 'card_sunflower'  card_peashooter = 'card_peashooter'  card_snowpeashooter = 'card_snowpea'  card_wallnut = 'card_wallnut'  card_cherrybomb = 'card_cherrybomb'  card_threepeashooter = 'card_threepeashooter'  card_repeaterpea = 'card_repeaterpea'  card_chomper = 'card_chomper'  card_puffshroom = 'card_puffshroom'  card_potatomine = 'card_potatomine'  card_squash = 'card_squash'  card_spikeweed = 'card_spikeweed'  card_jalapeno = 'card_jalapeno'  card_scaredyshroom = 'card_scaredyshroom'  card_sunshroom = 'card_sunshroom'  card_iceshroom = 'card_iceshroom'  card_hypnoshroom = 'card_hypnoshroom'  card_redwallnut = 'card_redwallnut'    #bullet info  bullet_pea = 'peanormal'  bullet_pea_ice = 'peaice'  bullet_mushroom = 'bulletmushroom'  bullet_damage_normal = 1    #zombie info  zombie_image_rect = 'zombie_image_rect'  zombie_head = 'zombiehead'  normal_zombie = 'zombie'  conehead_zombie = 'coneheadzombie'  buckethead_zombie = 'bucketheadzombie'  flag_zombie = 'flagzombie'  newspaper_zombie = 'newspaperzombie'  boomdie = 'boomdie'    losthead_health = 5  normal_health = 10  flag_health = 15  conehead_health = 20  buckethead_health = 30  newspaper_health = 15    attack_interval = 1000  zombie_walk_interval = 70    zombie_start_x = screen_width + 50    #state  idle = 'idle'  fly = 'fly'  explode = 'explode'  attack = 'attack'  attacked = 'attacked'  digest = 'digest'  walk = 'walk'  die = 'die'  cry = 'cry'  freeze = 'freeze'  sleep = 'sleep'    #level state  choose = 'choose'  play = 'play'    #background  background_day = 0  background_night = 1  

state/main.py

from . import tool  from . import constants as c  from .state import mainmenu, screen, level    def main():      game = tool.control()      state_dict = {c.main_menu: mainmenu.menu(),                    c.game_victory: screen.gamevictoryscreen(),                    c.game_lose: screen.gamelosescreen(),                    c.level: level.level()}      game.setup_states(state_dict, c.main_menu)      game.main()  

主执行文件main.py

import pygame as pg  from source.main import main    if __name__=='__main__':      main()      pg.quit()

到此这篇关于基于python实现经典植物大战僵尸游戏的文章就介绍到这了,更多相关python植物大战僵尸内容请搜索<猴子技术宅>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<猴子技术宅>!

需要了解更多python教程分享基于Python实现经典植物大战僵尸游戏,都可以关注python教程分享栏目—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/pythons/1091961.html

(0)
上一篇 3天前
下一篇 3天前

精彩推荐

发表评论

您的电子邮箱地址不会被公开。