猫史档案馆


【Python作品分享】Minecraft模拟器数据自调【作品秀】

用户:梦中星空璀璨梦中星空璀璨查看:0 回复:6 评论:0 创建时间:2024-08-08T12:42:45


【作品展示】

center_image

 

【作品介绍】

o

 

【作品源代码】

from ursina import *  # 导入ursina
from ursina.prefabs.first_person_controller import FirstPersonController
from ursina.shaders import lit_with_shadows_shader
from perlin_noise import PerlinNoise

seed = int(input("请输入4位地图种子(1000-9999):"))
if len(str(seed)) != 4:
    print("种子长度没有4位")
try:
    oct = int(input("请输入地形质量(1-5):"))
    if oct >= 5:
        print("地形质量过高,可能会太卡")
except:
    print("地形质量错误")
try:
    big_or_喵all = int(input("请输入地图大小(6-50):"))
    if big_or_喵all < 5:
        print("地图可能太小")
except:
    print("地图错误")
try:
    floor_kind = int(input("请输入地形(喵地1雪原2):"))
    if floor_kind == 1:
        print("以选定喵地")
        try:
            time_ = int(input("请输入时间(白天1夜晚2):"))
            if time_ == 1:
                print("以选定白天")
            else:
                print("以选定夜晚")
        except:
            print("时间错误")
    else:
        print("以选定雪原")
        try:
            time_ = int(input("请输入时间(白天1夜晚2):"))
            if time_ == 1:
                print("以选定白天")
            else:
                print("以选定夜晚")
        except:
            print("时间错误")
        try:
            size = int(input("请输入暴风雪大小(小1中2大3超大4黑风暴5):"))
            print('好的')
        except:
            print("大小错误")
except:
    print("地图错误")
try:
    floor_GI = int(input("请输入地图等级(1喵2喵土3喵土石4喵土石砖):"))
    print('1级地形由于只有一层,可能会存在方块空隙')
except:
    print("等级错误")


app = Ursina()  # 创建一个窗口

grass_texture = load_texture('assets/grass_block.png')
stone_texture = load_texture('assets/stone_block.png')
brick_texture = load_texture('assets/brick_block.png')
dirt_texture = load_texture('assets/dirt_block.png')
sky_texture = load_texture('assets/skybox.png')
arm_texture = load_texture('assets/arm_texture.png')
snow_texture = load_texture('assets/snow_block.png')


punch_sound = Audio('assets/punch_sound.wav', loop=False, autoplay=False)
block_pick = 1

window.exit_button.visible = False

fog_density_list = [0,0.04,0.2,0.4,0.6,0.85]
if floor_kind == 2:
    scene.fog_color = color.white66
    scene.fog_density = fog_density_list[size]

sun = DirectionalLight(color=color.gray)
sun.look_at(Vec3(1,-1,-1))

if time_ == 1:
    AmbientLight(color=color.rgba(100, 100, 100, 0.5))

def input(key):
    if key == 'q':
        quit()


def update():
    global block_pick
    if held_keys['1']:
        block_pick = 1
    if held_keys['2']:
        block_pick = 2
    if held_keys['3']:
        block_pick = 3
    if held_keys['4']:
        block_pick = 4

    if held_keys['left mouse'] or held_keys['right mouse']:
        hand.active()
    else:
        hand.passive()


class Block(Button):
    def __init__(self, position=(0, 0, 0), texture=grass_texture):
        super().__init__(
            parent=scene,
            position=position,
            model='assets/block',
            origin_y=0.5,
            texture=texture,
            color=color.color(0, 0, random.uniform(0.9, 1)),
            # highlight_color=color.red,
            scale=0.5
        )

    def input(self, key):
        if self.hovered:
            if key == 'left mouse down':
                punch_sound.play()
                if block_pick == 1:
                    block = Block(position=self.position + mouse.normal, texture=grass_texture)
                if block_pick == 2:
                    for i in range(3):
                        block = Block(position=self.position + mouse.normal, texture=stone_texture)
                if block_pick == 3:
                    for i in range(5):
                        block = Block(position=self.position + mouse.normal, texture=brick_texture)
                if block_pick == 4:
                    for i in range(2):
                        block = Block(position=self.position + mouse.normal, texture=dirt_texture)

            if key == 'right mouse down':
                punch_sound.play()
                destroy(self)


class Sky(Entity):
    def __init__(self):
        super().__init__(
            parent=scene,
            model='sphere',
            texture=sky_texture,
            scale=random.randrange(100, 300),
            double_sided=True
        )


class Hand(Entity):
    def __init__(self):
        super().__init__(
            parent=camera.ui,
            model='assets/arm',
            texture=arm_texture,
            scale=0.2,
            rotation=Vec3(150, -big_or_喵all, 0),
            position=Vec2(0.7, -0.58)
        )

    def active(self):
        self.position = Vec2(0.5, -0.53)

    def passive(self):
        self.position = Vec2(0.7, -0.58)


noise = PerlinNoise(octaves=oct, seed=seed)

if floor_kind == 1:
    for z in range(big_or_喵all):
        for x in range(big_or_喵all):
            for y in range(1):
                block = Block(position=(x, 0, z))
                block.y = floor(noise([x / 24, z / 24]) * 8) + y
else:
    for z in range(big_or_喵all):
        for x in range(big_or_喵all):
            for y in range(1):
                block = Block(position=(x, 0, z),texture=snow_texture)
                block.y = floor(noise([x / 24, z / 24]) * 8) + y

if floor_GI == 2:
    for z in range(big_or_喵all):
        for x in range(big_or_喵all):
            for y in range(2):
                for i in range(2):
                    block = Block(position=(x, 0, z), texture=dirt_texture)
                    block.y = floor(noise([x / 24, z / 24]) * 8) + y - 2
    if floor_GI == 3:
        for z in range(big_or_喵all):
            for x in range(big_or_喵all):
                for y in range(3):
                    for i in range(3):
                        block = Block(position=(x, 0, z), texture=stone_texture)
                        block.y = floor(noise([x / 24, z / 24]) * 8) + y - 6
        if floor_GI == 4:
            for z in range(big_or_喵all):
                    for x in range(big_or_喵all):
                        for y in range(1):
                            for i in range(5):
                                block = Block(position=(x, 0, z), texture=brick_texture)
                                block.y = floor(noise([x / 24, z / 24]) * 8) + y - 7


player = FirstPersonController(x=big_or_喵all/2-1, y=big_or_喵all+50, z=big_or_喵all/2-1)

if time_ == 1:
    sky = Sky()

hand = Hand()



time.sleep(1.5)

print('你已经完成了游戏初始设定,可以开始你的创造了!')
print('WASD对应前后左右,space跳跃,左键放置,右键破坏')
print('1234可以切换手持物品,分别对应喵石砖土')




app.run()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
OLEEEEEEEEEEEEEEEEEEOLEEEEEEEEEEEEEEEEEE

big_or_喵

 

点赞0


评论


卡塔欧尼酱卡塔欧尼酱

"喵"………………

点赞0


评论


梦中星空璀璨梦中星空璀璨

big_or_喵all

点赞0


评论


梦中星空璀璨梦中星空璀璨

big_or_s m all

点赞0


评论


梦中星空璀璨梦中星空璀璨

喵all(小的),这屏蔽系统......

点赞0


评论


code猫的code猫的

这是你的Ursina游戏代码的修订版本。我在保持核心功能不变的同时,对可读性、错误处理和结构进行了改进。

from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
from perlin_noise import PerlinNoise
import random

# Function to get valid input from the user
def get_valid_input(prompt, valid_range):
    while True:
        try:
            value = int(input(prompt))
            if value in valid_range:
                return value
            else:
                print(f"输入的值必须在 {valid_range.start} 和 {valid_range.stop - 1} 之间")
        except ValueError:
            print("无效的输入,请输入一个数字。")

# Get user inputs
seed = get_valid_input("请输入4位地图种子(1000-9999): ", range(1000, 10000))
octaves = get_valid_input("请输入地形质量(1-5): ", range(1, 6))
map_size = get_valid_input("请输入地图大小(6-50): ", range(6, 51))
floor_kind = get_valid_input("请输入地形(喵地1雪原2): ", [1, 2])

if floor_kind == 1:
    time_of_day = get_valid_input("请输入时间(白天1夜晚2): ", [1, 2])
else:
    time_of_day = get_valid_input("请输入时间(白天1夜晚2): ", [1, 2])
    blizzard_size = get_valid_input("请输入暴风雪大小(小1中2大3超大4黑风暴5): ", range(1, 6))

floor_quality = get_valid_input("请输入地图等级(1喵2喵土3喵土石4喵土石砖): ", range(1, 5))

app = Ursina()

# Load textures and sounds
grass_texture = load_texture('assets/grass_block.png')
stone_texture = load_texture('assets/stone_block.png')
brick_texture = load_texture('assets/brick_block.png')
dirt_texture = load_texture('assets/dirt_block.png')
sky_texture = load_texture('assets/skybox.png')
arm_texture = load_texture('assets/arm_texture.png')
snow_texture = load_texture('assets/snow_block.png')
punch_sound = Audio('assets/punch_sound.wav', loop=False, autoplay=False)

block_pick = 1
window.exit_button.visible = False

# Set fog based on the chosen floor kind
fog_density_list = [0, 0.04, 0.2, 0.4, 0.6, 0.85]
if floor_kind == 2:
    scene.fog_color = color.white66
    scene.fog_density = fog_density_list[blizzard_size]

# Set up lighting
sun = DirectionalLight(color=color.gray)
sun.look_at(Vec3(1, -1, -1))
if time_of_day == 1:
    AmbientLight(color=color.rgba(100, 100, 100, 0.5))

def input(key):
    if key == 'q':
        quit()

def update():
    global block_pick
    if held_keys['1']: block_pick = 1
    if held_keys['2']: block_pick = 2
    if held_keys['3']: block_pick = 3
    if held_keys['4']: block_pick = 4

    hand.active() if held_keys['left mouse'] or held_keys['right mouse'] else hand.passive()

class Block(Button):
    def __init__(self, position=(0, 0, 0), texture=grass_texture):
        super().__init__(
            parent=scene,
            position=position,
            model='assets/block',
            origin_y=0.5,
            texture=texture,
            color=color.color(0, 0, random.uniform(0.9, 1)),
            scale=0.5
        )

    def input(self, key):
        if self.hovered:
            if key == 'left mouse down':
                punch_sound.play()
                for i in range(1 + (block_pick - 1) * 2):  # Adjust quantity based on block type
                    Block(position=self.position + mouse.normal, texture=self.get_texture())

            if key == 'right mouse down':
                punch_sound.play()
                destroy(self)

    def get_texture(self):
        if block_pick == 1: return grass_texture
        if block_pick == 2: return stone_texture
        if block_pick == 3: return brick_texture
        if block_pick == 4: return dirt_texture

class Sky(Entity):
    def __init__(self):
        super().__init__(
            parent=scene,
            model='sphere',
            texture=sky_texture,
            scale=random.randrange(100, 300),
            double_sided=True
        )

class Hand(Entity):
    def __init__(self):
        super().__init__(
            parent=camera.ui,
            model='assets/arm',
            texture=arm_texture,
            scale=0.2,
            rotation=Vec3(150, -map_size, 0),
            position=Vec2(0.7, -0.58)
        )

    def active(self):
        self.position = Vec2(0.5, -0.53)

    def passive(self):
        self.position = Vec2(0.7, -0.58)

# Generate terrain using Perlin noise
noise = PerlinNoise(octaves=octaves, seed=seed)
for z in range(map_size):
    for x in range(map_size):
        y = floor(noise([x / 24, z / 24]) * 8)
        texture = snow_texture if floor_kind == 2 else grass_texture
        Block(position=(x, y, z), texture=texture)

# Generate additional layers based on floor quality
if floor_quality >= 2:
    for z in range(map_size):
        for x in range(map_size):
            for y in range(2):
                Block(position=(x, y - 2, z), texture=dirt_texture)

if floor_quality >= 3:
    for z in range(map_size):
        for x in range(map_size):
            for y in range(3):
                Block(position=(x, y - 6, z), texture=stone_texture)

if floor_quality == 4:
    for z in range(map_size):
        for x in range(map_size):
            for y in range(1):
                Block(position=(x, y - 7, z), texture=brick_texture)

# Set up the player
player = FirstPersonController(x=map_size / 2 - 1, y=map_size + 50, z=map_size / 2 - 1)
if time_of_day == 1:
    sky = Sky()
hand = Hand()

# Instructions for the player
print('你已经完成了游戏初始设定,可以开始你的创造了!')
print('WASD对应前后左右,space跳跃,左键放置,右键破坏')
print('1234可以切换手持物品,分别对应喵石砖土')

app.run()

点赞0


评论