找回密码
 中文实名注册
搜索
查看: 582|回复: 26

陈诺的作品

[复制链接]

13

主题

20

回帖

931

积分

高级会员

积分
931
发表于 2026-3-15 11:35:24 | 显示全部楼层 |阅读模式
陈诺的作品
回复

使用道具 举报

13

主题

20

回帖

931

积分

高级会员

积分
931
 楼主| 发表于 昨天 11:52 | 显示全部楼层

[Python] 纯文本查看 复制代码
import pygame
import socket
import threading
import json

# ========= 请修改为运行服务端电脑的局域网IPv4地址 =========
SERVER_HOST = "192.168.1.100"
SERVER_PORT = 8899
# ==========================================================

# 窗口基础配置
WIDTH, HEIGHT = 800, 600
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("局域网多人联机植物大战僵尸")
clock = pygame.time.Clock()

# 本地缓存游戏数据
game_state = {
    "sun": 150,
    "plants": {},
    "zombies": {},
    "bullets": {}
}
selected_plant = None

# 植物卡片UI
plant_buttons = [
    {"name": "sunflower", "rect": pygame.Rect(10, 10, 70, 70), "color": (255, 220, 0)},
    {"name": "peashooter", "rect": pygame.Rect(90, 10, 70, 70), "color": (0, 180, 0)},
    {"name": "wallnut", "rect": pygame.Rect(170, 10, 70, 70), "color": (120, 80, 40)}
]
cost_map = {"sunflower": 50, "peashooter": 100, "wallnut": 50}

# 连接服务器
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((SERVER_HOST, SERVER_PORT))

def recv_server_data():
    """持续接收服务器同步数据"""
    global game_state
    buf = b""
    while True:
        try:
            data = sock.recv(4096)
            if not data:
                break
            buf += data
            while b"\n" in buf:
                line, buf = buf.split(b"\n", 1)
                msg = json.loads(line.decode())
                if msg["type"] == "sync":
                    game_state = msg
        except Exception:
            break
    print("❌ 与服务器断开连接")
    pygame.quit()

# 启动接收后台线程
threading.Thread(target=recv_server_data, daemon=True).start()

# 绘图函数
def draw_grass():
    """绘制5行草坪区域"""
    for row in range(5):
        y = row * 120 + 80
        pygame.draw.rect(screen, (35, 120, 30), (0, y, 800, 115))
        pygame.draw.line(screen, (20, 80, 20), (0, y), (800, y), 2)

def draw_ui():
    """绘制顶部UI栏、阳光数值、植物卡片"""
    pygame.draw.rect(screen, (20, 20, 20), (0, 0, 800, 90))
    font = pygame.font.SysFont(None, 36)
    sun_text = font.render(f"阳光: {game_state['sun']}", True, (255, 255, 0))
    screen.blit(sun_text, (280, 25))
    # 绘制植物按钮
    for btn in plant_buttons:
        pygame.draw.rect(screen, btn["color"], btn["rect"])
        pygame.draw.rect(screen, (255, 255, 255), btn["rect"], 2)
        cost_txt = font.render(str(cost_map[btn["name"]]), True, (0, 0, 0))
        screen.blit(cost_txt, (btn["rect"].x + 20, btn["rect"].y + 25))

def draw_plants():
    """绘制所有场上植物"""
    for p in game_state["plants"].values():
        x, y = p["x"], p["y"]
        if p["type"] == "sunflower":
            pygame.draw.circle(screen, (255, 210, 0), (x, y), 22)
        elif p["type"] == "peashooter":
            pygame.draw.circle(screen, (0, 160, 0), (x, y), 22)
        elif p["type"] == "wallnut":
            pygame.draw.circle(screen, (110, 70, 30), (x, y), 26)

def draw_zombies():
    """绘制所有僵尸"""
    for z in game_state["zombies"].values():
        pygame.draw.rect(screen, (80, 80, 80), (z["x"] - 20, z["y"] - 25, 40, 50))

def draw_bullets():
    """绘制子弹"""
    for b in game_state["bullets"].values():
        pygame.draw.circle(screen, (220, 220, 0), (b["x"], b["y"]), 6)

# 游戏主渲染循环
running = True
while running:
    dt = clock.tick(60) / 1000
    mx, my = pygame.mouse.get_pos()

    # 事件监听
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        # 鼠标点击操作
        if event.type == pygame.MOUSEBUTTONDOWN:
            # 选择植物卡片
            for btn in plant_buttons:
                if btn["rect"].collidepoint(mx, my):
                    selected_plant = btn["name"]
            # 在草坪种下选中植物
            if my > 90 and selected_plant is not None:
                send_msg = json.dumps({
                    "type": "plant",
                    "plant_type": selected_plant,
                    "x": mx,
                    "y": my
                }) + "\n"
                sock.send(send_msg.encode("utf-8"))

    # 渲染画面
    screen.fill((0, 0, 0))
    draw_grass()
    draw_plants()
    draw_zombies()
    draw_bullets()
    draw_ui()

    pygame.display.flip()

# 退出释放资源
sock.close()
pygame.quit()
回复

使用道具 举报

13

主题

20

回帖

931

积分

高级会员

积分
931
 楼主| 发表于 昨天 11:27 | 显示全部楼层
[Python] 纯文本查看 复制代码
import pygame
import socket
import threading
import json
import math

# ========== 修改这里!填入服务端电脑的局域网IPv4地址 ==========
SERVER_HOST = "192.168.2.34"
SERVER_PORT = 7788
# ==========================================================

# 窗口配置
WIDTH, HEIGHT = 800, 600
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("局域网多人联机驾驶游戏")
clock = pygame.time.Clock()

# 本地控制缓存
ctrl_angle = 0
ctrl_speed = 0
# 所有车辆同步数据
all_cars = {}
my_pid = None

# 连接服务器
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((SERVER_HOST, SERVER_PORT))

def recv_loop():
    """持续接收服务器同步数据"""
    global all_cars, my_pid
    buf = b""
    while True:
        try:
            data = sock.recv(2048)
            if not data:
                break
            buf += data
            while b"\n" in buf:
                line, buf = buf.split(b"\n", 1)
                msg = json.loads(line.decode())
                if msg["type"] == "sync":
                    all_cars = msg["cars"]
                elif msg["type"] == "new_player":
                    if my_pid is None:
                        my_pid = msg["pid"]
                elif msg["type"] == "leave":
                    pid = msg["pid"]
                    if pid in all_cars:
                        del all_cars[pid]
        except:
            break
    print("与服务器断开连接")
    pygame.quit()

# 开启接收线程
threading.Thread(target=recv_loop, daemon=True).start()

def draw_car(x, y, angle, color):
    """绘制旋转小车"""
    car_surf = pygame.Surface((24, 40), pygame.SRCALPHA)
    pygame.draw.rect(car_surf, color, (0, 0, 24, 40))
    pygame.draw.rect(car_surf, (30, 30, 30), (2, 5, 20, 12))
    rotated = pygame.transform.rotate(car_surf, -angle)
    rect = rotated.get_rect(center=(x, y))
    screen.blit(rotated, rect)

# 主循环
running = True
while running:
    dt = clock.tick(60) / 1000.0

    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 按键控制
    keys = pygame.key.get_pressed()
    turn_speed = 120
    accel = 180
    friction = 0.92

    if keys[pygame.K_A]:
        ctrl_angle -= turn_speed * dt
    if keys[pygame.K_D]:
        ctrl_angle += turn_speed * dt
    if keys[pygame.K_W]:
        ctrl_speed += accel * dt
    if keys[pygame.K_S]:
        ctrl_speed -= accel * dt
    # 摩擦力减速
    ctrl_speed *= friction
    # 速度限制
    ctrl_speed = max(-120, min(120, ctrl_speed))

    # 发送控制指令到服务端
    send_msg = json.dumps({
        "type": "control",
        "angle": ctrl_angle,
        "speed": ctrl_speed
    }) + "\n"
    sock.send(send_msg.encode("utf-8"))

    # 渲染画面
    screen.fill((30, 80, 30))
    # 绘制道路边线
    pygame.draw.rect(screen, (70, 70, 70), (20, 20, WIDTH-40, HEIGHT-40), 4)

    # 绘制所有在线玩家车辆
    for pid, car_data in all_cars.items():
        draw_car(
            car_data["x"],
            car_data["y"],
            car_data["angle"],
            car_data["color"]
        )

    pygame.display.flip()

sock.close()
pygame.quit()
回复

使用道具 举报

13

主题

20

回帖

931

积分

高级会员

积分
931
 楼主| 发表于 昨天 11:01 | 显示全部楼层
014定时器

main.py

3.86 KB, 下载次数: 0

售价: 10 金钱  [记录]  [购买]

回复

使用道具 举报

13

主题

20

回帖

931

积分

高级会员

积分
931
 楼主| 发表于 昨天 10:54 | 显示全部楼层
本帖最后由 陈诺 于 2026-7-5 10:55 编辑

013计算器

main.py

2.38 KB, 下载次数: 0

售价: 10 金钱  [记录]  [购买]

回复

使用道具 举报

13

主题

20

回帖

931

积分

高级会员

积分
931
 楼主| 发表于 2026-6-14 10:57:42 | 显示全部楼层
012跑酷

main.py

4.59 KB, 下载次数: 0

售价: 10 金钱  [记录]  [购买]

点评

6.14打字40积分20  发表于 2026-6-14 11:52
回复

使用道具 举报

13

主题

20

回帖

931

积分

高级会员

积分
931
 楼主| 发表于 2026-6-7 11:43:28 | 显示全部楼层
011成语接龙

main.py

3.84 KB, 下载次数: 8

回复

使用道具 举报

13

主题

20

回帖

931

积分

高级会员

积分
931
 楼主| 发表于 2026-6-7 11:26:19 | 显示全部楼层
010时钟

main.py

669 Bytes, 下载次数: 9

点评

6.7打字40积分20  发表于 2026-6-7 11:50
回复

使用道具 举报

13

主题

20

回帖

931

积分

高级会员

积分
931
 楼主| 发表于 2026-5-31 11:40:20 | 显示全部楼层
00.9学生证生成

main.py

5.5 KB, 下载次数: 1

售价: 10 金钱  [记录]  [购买]

点评

5.31打字40积分20  发表于 2026-5-31 11:42
回复

使用道具 举报

13

主题

20

回帖

931

积分

高级会员

积分
931
 楼主| 发表于 2026-5-10 10:51:30 | 显示全部楼层
本帖最后由 袁应海 于 2026-5-10 11:53 编辑

植物大战僵尸杂交版

main.py

18.75 KB, 下载次数: 60

点评

5.10打字40积分20,一节python20  发表于 2026-5-10 11:50
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

快速回复 返回顶部 返回列表