天天看點

pygame編寫的坦克遊戲(三)

資源準備工作:

1、地圖檔案

.....r.lCC...
.lR.l...rClrC
.lR.l.A.rClrC
.A..A.G.AC.AC
...rU.A.uL.CC
AAl..CAC..rAA
....rCCCl....
GAA.uCCCurAAG
UUU.d.C.d.UUU
.A..A...A....
.Al..u.u..rAC
..u..4d3..CCC
..d..rWl..dCC
           

13x13的格子,每個位元組點32x32像素,分别為8x8x4(4個小圖塊組成),在我的設定裡位元組含義大概是這樣:

"l,r,u,d"小寫上下左右表示1/2個磚頭,“LRUD”大寫上下左右表示1/2個鋼闆,“1234”表示四個角上1/8個磚頭,

“C”草,“A"整個磚頭,”H"河,“B"冰,”G"整個鋼闆,“W"老窩

2、圖像資源,在《pygame編寫的坦克遊戲(三)》裡已經貼了圖,按常量檔案配置可以取到

3、聲音資源:這個隻能手工錄制了,後面會給出整個源碼的連結,就包含在裡面了

上地圖代碼:

import os, sys
from const import *
from block import *

class Map:
    #地圖
    _CONFIG = {
        "C":{"grid":(M_C0, M_C0, M_C0, M_C0), "class":Block}, 
        "H":{"grid":(M_R1, M_R2, M_R2, M_R1), "class":River}, 
        "B":{"grid":(M_I0, M_I0, M_I0, M_I0), "class":Ice}, 
        "G":{"grid":(M_S0, M_S0, M_S0, M_S0), "class":Steel}, 
        "U":{"grid":(M_S0, M_S0, M_00, M_00), "class":Steel}, 
        "L":{"grid":(M_S0, M_00, M_S0, M_00), "class":Steel}, 
        "R":{"grid":(M_00, M_S0, M_00, M_S0), "class":Steel}, 
        "D":{"grid":(M_00, M_00, M_S0, M_S0), "class":Steel}, 
        "A":{"grid":(M_BA, M_BA, M_BA, M_BA), "class":Brick}, 
        "u":{"grid":(M_BA, M_BA, M_00, M_00), "class":Brick}, 
        "l":{"grid":(M_BA, M_00, M_BA, M_00), "class":Brick}, 
        "r":{"grid":(M_00, M_BA, M_00, M_BA), "class":Brick}, 
        "d":{"grid":(M_00, M_00, M_BA, M_BA), "class":Brick}, 
        "1":{"grid":(M_BA, M_00, M_00, M_00), "class":Brick}, 
        "2":{"grid":(M_00, M_BA, M_00, M_00), "class":Brick}, 
        "3":{"grid":(M_00, M_00, M_BA, M_00), "class":Brick}, 
        "4":{"grid":(M_00, M_00, M_00, M_BA), "class":Brick}, 
        "W":{"grid":(M_H0, M_00, M_00, M_00), "class":Base}, 
        }    
    @classmethod
    def load(self, engine, level):
        self.grid = []
        map_path = os.getcwd() + os.sep + "map" + os.sep
        fname = map_path + "level%.2d.txt"%(level)
        
        map_cfg = []
        try:
            f = open(fname)
            for line in f.readlines():
                map_cfg.append(line)
        finally:
            f.close()
        
        #構造地圖上的對象
        for i in range(len(map_cfg)):
            for j in range(len(map_cfg[i]) - 1):
                ctype = map_cfg[i][j]
                self.create_mapblock(engine, ctype, j, i)
    
    @classmethod
    def create_mapblock(self, engine, ctype, x, y):
        if ctype in Map._CONFIG.keys():
            cfg = Map._CONFIG[ctype]
            imp = cfg["class"]
            grid = cfg["grid"]
            delay = 35 if ctype == "B" else 0            
            for t in range(len(grid)):
                if grid[t] !=  M_00:
                    pos = [32 + (x * 2 + t % 2) * 16, 32 + (y * 2 + t // 2) * 16]                    
                    #0 6 12三個位置的不初始化
                    if (y == 0) and (x in [0, 6, 12]):
                        continue
                    #保護老窩的磚自動生成(磚可以加鍬變鋼闆,持續10秒,閃爍5秒後還原成磚)                    
                    pt = (pos[0], pos[1])
                    if pt in SPADE_CFG.keys():
                        layer = LIST_SPADE
                    elif ctype == "C":
                        layer = LIST_GRASS
                    else:
                        layer = LIST_BALKS
                    impclass = imp
                    impclass(engine, WHO_BALK, grid[t], pos, delay, layer)