fork download
  1. # your code goes here
Success #stdin #stdout 0.13s 14064KB
stdin
import sys
import time
import random

# 游戏参数
SCREEN_WIDTH = 40  # 控制台宽度(字符数)
SCREEN_HEIGHT = 20  # 控制台高度(字符数)
PLAYER_CHAR = "▶"   # 玩家飞机(向右箭头)
ENEMY_CHAR = "X"     # 敌机
BULLET_CHAR = "|"    # 子弹
DELAY = 0.1          # 刷新间隔(秒)

class Player:
    def __init__(self):
        self.x = SCREEN_WIDTH // 2  # 初始位置居中
        self.y = SCREEN_HEIGHT - 1  # 底部位置

    def move_left(self):
        if self.x > 0:
            self.x -= 1

    def move_right(self):
        if self.x < SCREEN_WIDTH - 1:
            self.x += 1

    def shoot(self):
        return Bullet(self.x, self.y - 1)  # 子弹从飞机上方发射

class Enemy:
    def __init__(self):
        self.x = random.randint(0, SCREEN_WIDTH - 1)  # 随机横向位置
        self.y = 0  # 从顶部生成

    def update(self):
        self.y += 1  # 敌机下落

class Bullet:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def update(self):
        self.y -= 1  # 子弹上飞

def clear_screen():
    """清屏(适用于控制台)"""
    sys.stdout.write("\033[H\033[J")  # ANSI 清屏符

def render(player, enemies, bullets):
    """渲染画面"""
    clear_screen()
    # 绘制子弹
    for bullet in bullets:
        if 0 <= bullet.y < SCREEN_HEIGHT:
            print(f"\033[{bullet.y+1};{bullet.x+1}H{BULLET_CHAR}")  # 定位字符位置
    # 绘制敌机
    for enemy in enemies:
        if 0 <= enemy.y < SCREEN_HEIGHT:
            print(f"\033[{enemy.y+1};{enemy.x+1}H{ENEMY_CHAR}")
    # 绘制玩家
    print(f"\033[{player.y+1};{player.x+1}H{PLAYER_CHAR}")
    sys.stdout.flush()  # 刷新输出

def main():
    player = Player()
    enemies = []
    bullets = []
    score = 0
    last_enemy_time = time.time()

    while True:
        # 处理输入(需手动输入指令,按回车确认)
        cmd = input("操作(a左移/d右移/空格射击/q退出): ").strip().lower()
        if cmd == 'q':
            break
        if cmd == 'a':
            player.move_left()
        elif cmd == 'd':
            player.move_right()
        elif cmd == ' ':
            bullet = player.shoot()
            bullets.append(bullet)
        
        # 生成敌机(每2秒生成一个)
        if time.time() - last_enemy_time > 2:
            enemies.append(Enemy())
            last_enemy_time = time.time()
        
        # 更新子弹状态
        live_bullets = []
        for bullet in bullets:
            bullet.update()
            if bullet.y >= 0:
                live_bullets.append(bullet)
        bullets = live_bullets
        
        # 更新敌机状态并检测碰撞
        live_enemies = []
        for enemy in enemies:
            enemy.update()
            if enemy.y < SCREEN_HEIGHT:
                # 检测子弹击中敌机
                for bullet in bullets:
                    if abs(enemy.x - bullet.x) <= 1 and enemy.y == bullet.y:
                        score += 1
                        print(f"击中!得分:{score}")
                        # 移除被击中的子弹和敌机
                        bullets.remove(bullet)
                        break
                else:
                    live_enemies.append(enemy)
        enemies = live_enemies
        
        # 渲染画面
        render(player, enemies, bullets)
        time.sleep(DELAY)

if __name__ == "__main__":
    main()
 
stdout
Standard output is empty