From 9a73fa0ff98a4898a926efb1c3c7913078c2e739 Mon Sep 17 00:00:00 2001 From: Jeffrey Hsu Date: Fri, 31 Jan 2025 19:23:31 +0800 Subject: [PATCH] first commit --- .gitignore | 6 +++ README.md | 11 ++++ main.py | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 161 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 main.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89e8f2a --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.venv/ +venv/ +.idea/ +.vscode/ + +*.pyc diff --git a/README.md b/README.md new file mode 100644 index 0000000..ff9e4bb --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +## LXC's Game + +### How to run + +```bash +git pull https://cantyonion.site/git/cantyonion/LXCsGame.git +cd LXCsGame +python -m venv .venv +pip install pygame +python main.py +``` \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..70fdbb7 --- /dev/null +++ b/main.py @@ -0,0 +1,144 @@ +import pygame +import random + +# 初始化 +pygame.init() +WIDTH, HEIGHT = 800, 600 +screen = pygame.display.set_mode((WIDTH, HEIGHT)) +clock = pygame.time.Clock() + +# 颜色定义 +COLORS = { + "air": (0, 191, 255), + "grass": (34, 139, 34), + "dirt": (139, 69, 19), + "stone": (128, 128, 128), + "sand": (238, 232, 170), + "water": (0, 0, 255), + "player": (255, 0, 0) +} + +# 游戏参数 +BLOCK_SIZE = 20 +GRAVITY = 0.5 +PLAYER_SPEED = 5 +JUMP_FORCE = -12 + + +# 生成地形 +def generate_terrain(): + world = [] + ground_level = HEIGHT // BLOCK_SIZE // 2 + + for x in range(WIDTH // BLOCK_SIZE): + column = [] + height = ground_level + random.randint(-3, 3) + for y in range(HEIGHT // BLOCK_SIZE): + if y > height + 2: + column.append("stone") + elif y == height: + column.append("grass") + elif y > height - 3: + column.append("dirt") + else: + column.append("air") + world.append(column) + + return world + + +world = generate_terrain() + + +# 玩家类 +class Player: + def __init__(self): + self.x = WIDTH // 2 + self.y = HEIGHT // 2 + self.velocity = 0 + self.on_ground = False + self.selected_block = "grass" + + def move(self, dx, dy): + new_x = self.x + dx + new_y = self.y + dy + if 0 <= new_x < WIDTH and 0 <= new_y < HEIGHT: + self.x = new_x + self.y = new_y + + def jump(self): + if self.on_ground: + self.velocity = JUMP_FORCE + self.on_ground = False + + +player = Player() + +# 游戏循环 +running = True +while running: + # 事件处理 + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + elif event.type == pygame.MOUSEBUTTONDOWN: + mx, my = pygame.mouse.get_pos() + bx = mx // BLOCK_SIZE + by = my // BLOCK_SIZE + if event.button == 1: # 左键放置方块 + if world[bx][by] == "air": + world[bx][by] = player.selected_block + elif event.button == 3: # 右键拆除方块 + world[bx][by] = "air" + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_1: + player.selected_block = "grass" + elif event.key == pygame.K_2: + player.selected_block = "stone" + elif event.key == pygame.K_3: + player.selected_block = "sand" + elif event.key == pygame.K_4: + player.selected_block = "water" + + # 玩家移动 + keys = pygame.key.get_pressed() + if keys[pygame.K_a]: + player.move(-PLAYER_SPEED, 0) + if keys[pygame.K_d]: + player.move(PLAYER_SPEED, 0) + if keys[pygame.K_w]: + player.jump() + + # 物理模拟 + player.velocity += GRAVITY + player.move(0, player.velocity) + + # 碰撞检测 + px = int(player.x // BLOCK_SIZE) + py = int(player.y // BLOCK_SIZE) + if py < len(world[px]) - 1 and world[px][py + 1] != "air": + player.on_ground = True + player.velocity = 0 + else: + player.on_ground = False + + # 绘制世界 + screen.fill(COLORS["air"]) + for x in range(len(world)): + for y in range(len(world[x])): + if world[x][y] != "air": + rect = pygame.Rect(x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE) + pygame.draw.rect(screen, COLORS[world[x][y]], rect) + + # 绘制玩家 + pygame.draw.circle(screen, COLORS["player"], (player.x, player.y), 10) + + # 显示提示文字 + font = pygame.font.SysFont(None, 24) + text = font.render(f"Selected: {player.selected_block} (1-4切换方块)", True, (255, 255, 255)) + screen.blit(text, (10, 10)) + + pygame.display.flip() + clock.tick(60) + +pygame.quit() \ No newline at end of file