用pygame制作的我的世界2D版_2D_Minecraft源代码

用pygame制作的我的世界2D版_2D_Minecraft源代码


 
包括9个步骤分步制作而成的2D版本我的世界。
两块木片和2块岩石合成一把火 , 两块岩石合成石头。 两块石头和一团火合成砖块 , 两块石头合成沙 。 一团火,2沙合成玻璃 。 2木,3炭,2玻璃合成钻石。按空格键捡东西,按数字键放东西,按数字键同时单击鼠标左键满足要求时合成物质。游戏目标可以是合成钻石,请先看教程。”
以下是部分代码预览:

"""用pygame制作的我的世界2D版,作者李兴球,游戏操作:按空格键捡东西,按数字键放东西,按数字键同时单击鼠标左键合成物质,合成规则见下面代码。"""

import time
import random
import pygame,sys
from pygame.locals import *

class Role(pygame.sprite.Sprite):
    def __init__(self,images):
        pygame.sprite.Sprite.__init__(self)
        self.images = [pygame.image.load(image) for image in images]                
        self.index = 0
        self.image = self.images[self.index]   # 初始造型为上       
        self.playerPos = [0,0]
    def set_costume(self,index):
        self.image = self.images[index]        # 初始造型为上    
        
class Effect(pygame.sprite.Sprite):
    def __init__(self,images,position,group):
        """参数说明:
           images:转换成surface的列表
           position:坐标双元组,效果生成的坐标
           group:自己所在的组(效果组)
        """
        pygame.sprite.Sprite.__init__(self)
        self.images = images
        self.index = 0                         # 起始造型索引      
        self.amounts = len(self.images)        # 总共造型数量
        self.interval = 0.1                    # 造型切换间隔时间(秒)
        self.begin_time = time.time()          # 造型切换起始时间
        self.image = self.images[0]            # 起始造型
        self.rect = self.image.get_rect()      # 矩形对象(用来表示坐标和图形宽高)
        self.rect.center = position            # 矩形对象的中心点坐标
        self.group = group                     # 可引用自己所在的组
        self.group.add(self)                   # 添加进自己所在的组中
        
    def update(self):
        """切换造型"""
        self.rect.move_ip(0,-12)                # 向上移动
        if self.rect.bottom >=0 :
            self.image = self.images[self.index]
            if time.time() - self.begin_time >=0 : # 超时则索引加1,
               self.index = self.index + 1
               self.index = self.index % self.amounts 
               self.begin_time = time.time()       # 起始时间要重设
        else:
            self.group.remove(self)
    
pass

textures = {
           DIRT : pygame.image.load('dirt.png'),
           GRASS: pygame.image.load('grass.png'),
           WATER: pygame.image.load('water.png'),
           COAL : pygame.image.load('coal.png'),
           CLOUD: pygame.image.load('cloud.png'),
           WOOD : pygame.image.load('wood.png'),
           FIRE : pygame.image.load('fire.png'),
           SAND : pygame.image.load('sand.png'),
           GLASS: pygame.image.load('glass.png'),
           ROCK : pygame.image.load('rock.png'),
           STONE: pygame.image.load('stone.png'),
           BRICK: pygame.image.load('brick.png'),
           DIAMOND:pygame.image.load('diamond.png')
          }


res_names = {
               DIRT : "地面",
               GRASS: "草皮",
               WATER: "水面",
               COAL : "碳黑",
               WOOD : "木片",
               FIRE : "火把",
               SAND : "沙粒",
               GLASS: "玻璃",
               ROCK : "岩石",
               STONE: "石头",
               BRICK: "砖块",
               DIAMOND:"钻石"
            }

TILESIZE = 20
MAPWIDTH = 50
MAPHEIGHT = 20
 
play_images = ['player_up.png','player_down.png','player_left.png','player_right.png'] # 上下左右图

PLAYER = Role(play_images)   # 它有属性playerPos和images,用于坐标定位和图像渲染

resource = [DIRT,GRASS,WATER,COAL,WOOD,FIRE,SAND,GLASS,ROCK,STONE,BRICK,DIAMOND]  # 显示在下栏的资源种类

tilemap = [ [DIRT for w in range(MAPWIDTH)] for h in range(MAPHEIGHT) ]           # 初始化方块地图,都是DIRT



"合成表里合成规则"

rules = "# 两块木片和2块岩石合成一把火  # 两块岩石合成石头    # 两块石头和一团火合成砖块  # 两块石头合成沙   # 一团火,2沙合成玻璃   # 2木,3炭,2玻璃合成钻石"
operate_method_string = "按空格键捡东西,按数字键放东西,按数字键同时单击鼠标左键满足要求时合成物质。游戏目标可以是合成钻石,请先看教程。"

craft = {
           FIRE : { WOOD :2,ROCK : 2 }, # 两块木片和2块岩石合成一把火         
           STONE: { ROCK :2},           # 两块岩石合成石头
           BRICK : { STONE:2,FIRE : 1}, # 两块石头和一团火合成砖块
           SAND : { STONE : 2 },        # 两块石头合成沙
           GLASS: { FIRE :1,SAND : 2 }, # 一团火,2沙合成玻璃
           DIAMOND:{ WOOD:2,COAL : 3,GLASS:2 }  # 2木,3炭,2玻璃合成钻石
         }
    
pygame.init()
DISPLAYSURF = pygame.display.set_mode((MAPWIDTH*TILESIZE,MAPHEIGHT*TILESIZE + 120 )) # 渲染面
pygame.display.set_caption("2D Minecraft,我的世界2D版,作者:李兴球_风火轮编程_www.scratch8.net")

INVFONT = pygame.font.Font('FreeSansBold.ttf',18)                                   # 新建字体对象
MSYHFONT = pygame.font.Font('msyh.ttf',12)                                          # 新建微软雅黑字体
operate_method_surface = MSYHFONT.render(operate_method_string,True,WHITE,BLACK)    # 渲染成surface
rules_surface = MSYHFONT.render(rules,True,WHITE,BLACK)                             # 渲染成surface

"效果造型表,换效果只要直接更换effect文件夹下面的图形即可,文件名为0001,0002,0003...."
effect_costumes = [ "effect/" + '0'* (4-len(str(i))) + str(i) + ".png" for i in range(1,6)] # 补零加序号形成图形文件表
effect_costumes = [pygame.image.load(image) for image in effect_costumes]   # 转换成surface
[image.set_alpha(150) for image in effect_costumes]   

pass

 

如需要下载完整源代码及素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

李兴球

李兴球的博客是Python创意编程原创博客