驭码CodeRider 2.0 产品体验:在VSCode安装并创建一个雷电小游戏
驭码CodeRider 是极狐GitLab 推出的基于生成式人工智能技术的新一代软件生产工具,为开发者提供自然语言生成代码、代码补全、代码调优纠错、单元测试生成、代码解释以及智能技术问答等功能。CodeRider 与 GitLab 深度融合,为企业提供软件开发全生命周期(SDLC)的支持,涵盖项目快速上手、企业文档库/代码仓智能问答、议题管理、合并请求智能辅助、代码智能评审、安全扫描智能解析、流水线管理等功能。CodeRider手册:CodeRider 产品介绍 | 极狐GitLab
首先在VSCode的插件里查找CodeRider
找到后,点击“Install”进行安装。
安装的时候弹出trust按钮,确认即可。
到极狐注册账户,在VSCode的CodeRider里登录极狐账户。
极狐注册地址:
Sign up · JiHu GitLab
注意,极狐是免费使用90天
注册 SaaS 即为您开通极狐GitLab AI 产品驭码CodeRider试用权限,
时长 90 天,点击了解驭码CodeRider。
注册jihulab极狐后,在最后的项目模版里,有spring hugo astro等多种选择,应该用哪个呢?
最终我选择了hugo 。因为它简单容易上手!
以下是AI告诉的选择建议:
需求类型 | 推荐模板 | 理由 |
---|---|---|
构建后端服务或微服务 | Spring | 强大的企业级功能,适合复杂业务逻辑 |
简单快速搭建博客或文档 | Hugo | 构建速度快,生态完善,操作简单 |
需要现代前端交互和性能优化 | Astro | 支持多框架,页面性能好,前端灵活 |
根据项目需求和技术栈选择合适的模板。如果项目需要前后端分离,可以结合 Spring(后端)和 Hugo/Astro(前端)使用。如果有更多具体需求,可以进一步讨论!
进入项目,提示要设置ssh key才能上传
SSH keys allow you to establish a secure connection between your computer and GitLab. SSH fingerprints verify that the client is connecting to the correct host. Check the current instance configuration.
创建新key Add a personal access token
给所有权限:api, read_api, read_user, create_runner, manage_runner, k8s_proxy, self_rotate, read_repository, write_repository, read_registry, write_registry, read_virtual_registry, write_virtual_registry, ai_features
Your new personal access token
xxx
Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs. It cannot be used to access any other data.
Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses. It cannot be used to access any other data.
安装好CodeRider后,在插件里把它点出来,就会提醒登录。登录可以选择两种:
CodeRider is requesting access to your account on jihulab.com.
token就是前面在极狐里设置的个人Access tokens
登录成功后显示
到配置里面,找到Coderider › Commit Message: Language ,先改成中文:
很遗憾,设为chinese后,还是英文.....
也许是因为我的vscode是英文的缘故吧。
在描述需求时,可通过输入 “@” 获取内容,或者 “#” 索引文件夹、文件。
您可以在 IDE 中使用自然语言描述您的编程需求,CodeRider 将根据需求指令生成代码建议。 在编辑器中生成代码时,CodeRider 将参考当前代码文件、整个项目仓相关代码内容(增强模式下)自动为您生成代码。您可以使用快捷键逐片段或整个模块接纳生成代码,也可以废弃当前代码建议。(快捷键及模式设置参考“代码智能实时补全”。) 在对话框中生成代码时,您可直接输入自然语言需求,CodeRider 将生成对应代码建议。特别地,当您“@代码仓知识库”并输入需求时,CodeRider 将针对指定的代码仓内容结合需求指令生成代码。您可以点击“在光标处插入”直接将生成代码插入到光标停留位置。
效果尚可。
输出结果里面除了代码,还写了游戏架构,也就是游戏状态机,这挺不错!
游戏状态机的图:
graph TD
A[游戏开始] --> B[主菜单]
B -->|开始游戏| C[关卡进行中]
C -->|完成关卡| D[关卡结束]
D -->|继续| C
D -->|返回菜单| B
C -->|游戏结束| E[结算画面]
E --> B
代码可以直接copy到编辑文件的图标处,挺方便。但是写入文件会弹出对话框让自己起文件名,这样自由度更高,但是需要手工去copy代码到合适的位置,这一点与其它AI辅助软件(Trae、auto-coder)比起来感觉繁琐。
后面又增加了一些功能,导致程序存在闪退问题,让CodeRider解决
CodeRider 给出了修改的代码。
需要自己动手把代码粘过去,我不知道应该放在哪里,替换哪部分,于是我问
于是它给出了全部的代码,将代码保存好,确实解决了闪退问题。
当然由于CodeRider 大部分时候还是喜欢只输出需要修改的代码,所以后面大部分时候是自己手工一点点把CodeRider 的代码copy过去的。
后面又增加了霰弹枪武器和自动发射,最终效果如图:
import pygame
import random
import sys
import math
# 初始化pygame
pygame.init()
# 屏幕设置
SCREEN_WIDTH = 480
SCREEN_HEIGHT = 640
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("雷电游戏 Leidian Game")
# 颜色定义
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
YELLOW = (255, 255, 0)
PURPLE = (200, 0, 200)
CYAN = (0, 255, 255)
ORANGE = (255, 165, 0)
# 玩家飞机类
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((50, 40))
self.image.fill(BLUE)
self.rect = self.image.get_rect()
self.rect.centerx = SCREEN_WIDTH // 2
self.rect.bottom = SCREEN_HEIGHT - 10
self.speed = 8
self.health = 100
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and self.rect.left > 0:
self.rect.x -= self.speed
if keys[pygame.K_RIGHT] and self.rect.right < SCREEN_WIDTH:
self.rect.x += self.speed
if keys[pygame.K_UP] and self.rect.top > 0:
self.rect.y -= self.speed
if keys[pygame.K_DOWN] and self.rect.bottom < SCREEN_HEIGHT:
self.rect.y += self.speed
# 子弹类
# class Bullet(pygame.sprite.Sprite):
# def __init__(self, x, y, width=5, height=10, damage=1):
# super().__init__()
# self.image = pygame.Surface((width, height))
# self.image.fill(WHITE)
# self.rect = self.image.get_rect()
# self.rect.centerx = x
# self.rect.bottom = y
# self.speed = 10
# self.damage = damage
# def update(self):
# self.rect.y -= self.speed
# if self.rect.bottom < 0:
# self.kill()
# 修改子弹类以支持横向移动
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y, width=5, height=10, damage=1):
super().__init__()
self.image = pygame.Surface((width, height))
self.image.fill(WHITE) # 默认颜色,具体颜色由武器系统设置
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.bottom = y
self.speed_y = -10 # 默认向上速度
self.speed_x = 0 # 初始无横向移动
self.damage = damage
def update(self):
self.rect.y += self.speed_y
self.rect.x += self.speed_x
if (self.rect.bottom < 0 or self.rect.top > SCREEN_HEIGHT or
self.rect.right < 0 or self.rect.left > SCREEN_WIDTH):
self.kill()
# 敌机类
class Enemy(pygame.sprite.Sprite):
def __init__(self, enemy_type="normal"):
super().__init__()
self.enemy_type = enemy_type
if enemy_type == "normal":
self.image = pygame.Surface((30, 30))
self.image.fill(RED)
self.health = 1
self.speedy = random.randrange(2, 4)
elif enemy_type == "fast":
self.image = pygame.Surface((24, 24))
self.image.fill(YELLOW)
self.health = 1
self.speedy = random.randrange(4, 7)
elif enemy_type == "tank":
self.image = pygame.Surface((40, 38))
self.image.fill((100, 100, 255))
self.health = 4
self.speedy = random.randrange(1, 3)
self.rect = self.image.get_rect()
self.rect.x = random.randrange(SCREEN_WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
def update(self):
self.rect.y += self.speedy
if self.rect.top > SCREEN_HEIGHT:
self.rect.x = random.randrange(SCREEN_WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
if self.enemy_type == "normal":
self.speedy = random.randrange(2, 4)
elif self.enemy_type == "fast":
self.speedy = random.randrange(4, 7)
elif self.enemy_type == "tank":
self.speedy = random.randrange(1, 3)
def take_damage(self, amount):
self.health -= amount
if self.health <= 0:
self.kill()
return True
return False
# Boss敌机类
class BossEnemy(pygame.sprite.Sprite):
def __init__(self, tier):
super().__init__()
self.enemy_type = "boss"
self.image = pygame.Surface((80, 80))
self.image.fill(PURPLE)
self.rect = self.image.get_rect()
self.rect.centerx = SCREEN_WIDTH // 2
self.rect.y = -100
self.speed = 1
# self.health = tier * 100
# self.max_health = tier * 100
# self.attack_pattern = "move_down"
# self.attack_timer = 0
# self.tier = tier
self.tier = max(1, tier) # 确保tier至少为1
self.health = self.tier * 100
self.max_health = self.tier * 100 # 确保max_health永远不会为0
self.attack_pattern = "move_down"
self.attack_timer = 0
def update(self):
self._movement_pattern()
self._attack_pattern()
def _movement_pattern(self):
if self.attack_pattern == "move_down":
self.rect.y += self.speed
if self.rect.top >= 100:
self.attack_pattern = "left_right"
elif self.attack_pattern == "left_right":
self.rect.x += self.speed * (1 if self.rect.centerx < SCREEN_WIDTH // 2 else -1)
if self.rect.left <= 0 or self.rect.right >= SCREEN_WIDTH:
self.speed *= -1
def _attack_pattern(self):
self.attack_timer += 1
if self.attack_timer % (60 - self.tier * 5) == 0:
self._shoot_bullets()
def _shoot_bullets(self):
for angle in range(-30, 31, 15):
bullet = EnemyBullet(self.rect.centerx, self.rect.bottom,
speed=3, angle=math.radians(angle), damage=10)
all_sprites.add(bullet)
enemy_bullets.add(bullet)
def take_damage(self, amount):
self.health -= amount
if self.health <= 0:
self.kill()
power_up = PowerUp(self.rect.centerx, self.rect.centery)
all_sprites.add(power_up)
power_ups.add(power_up)
return True
return False
# 敌机子弹类
class EnemyBullet(pygame.sprite.Sprite):
def __init__(self, x, y, speed=3, angle=0, damage=10):
super().__init__()
self.image = pygame.Surface((8, 16))
self.image.fill((255, 128, 0))
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.top = y
self.speed = speed
self.angle = angle
self.damage = damage
self.vx = speed * math.sin(angle)
self.vy = speed * math.cos(angle)
def update(self):
self.rect.x += int(self.vx)
self.rect.y += int(self.vy)
if (self.rect.top > SCREEN_HEIGHT or
self.rect.bottom < 0 or
self.rect.right < 0 or
self.rect.left > SCREEN_WIDTH):
self.kill()
# 激光类
class LaserBeam(pygame.sprite.Sprite):
def __init__(self, x, y, width, height, damage=30):
super().__init__()
# 激光高度直接设为屏幕高度
self.image = pygame.Surface((width, SCREEN_HEIGHT-4), pygame.SRCALPHA)
# 创建渐变效果
for i in range(width):
alpha = 255 - int(i * 100 / width)
pygame.draw.line(self.image, (0, 255, 255, alpha), (i, 0), (i, SCREEN_HEIGHT), 1)
self.rect = self.image.get_rect()
self.rect.x = x - width // 2 # 居中激光
self.rect.y = 0 # 从屏幕顶部开始
self.damage = damage
self.lifetime = 30 # 激光持续时间
def update(self):
self.lifetime -= 1
if self.lifetime <= 0:
self.kill()
def draw(self, surface):
# 自定义绘制方法确保透明效果正确
surface.blit(self.image, self.rect)
# 道具类
class PowerUp(pygame.sprite.Sprite):
def __init__(self, x, y, kind="weapon"):
super().__init__()
self.image = pygame.Surface((24, 24))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.kind = kind
self.speed = 3
def update(self):
self.rect.y += self.speed
if self.rect.top > SCREEN_HEIGHT:
self.kill()
# 武器系统
class WeaponSystem:
def __init__(self, player):
self.player = player
self.current_weapon = "single"
self.weapon_cooldown = {"single": 10,
"double": 15,
"laser": 60,
"shotgun": 20 # 霰弹枪冷却时间
}
self.cooldown = 0
self.active_lasers = pygame.sprite.Group()
self.auto_fire = False # 新增自动射击模式标志
# 武器颜色映射
self.weapon_colors = {
"single": WHITE,
"double": YELLOW,
"laser": (0, 255, 255), # 青色
"shotgun": ORANGE # 霰弹枪子弹颜色
}
def update(self):
if self.cooldown > 0:
self.cooldown -= 1
# 自动射击模式下持续发射子弹
if self.auto_fire and self.cooldown <= 0:
self._fire_weapon()
# 新增方法处理武器发射逻辑
def _fire_weapon(self):
if self.current_weapon == "single":
self._shoot_single()
elif self.current_weapon == "double":
self._shoot_double()
elif self.current_weapon == "laser":
self._shoot_laser()
elif self.current_weapon == "shotgun":
self._shoot_shotgun()
self.cooldown = self.weapon_cooldown[self.current_weapon]
def shoot(self):
# 只在非自动模式下或手动触发时发射
if not self.auto_fire and self.cooldown <= 0:
self._fire_weapon()
def _shoot_single(self):
bullet = Bullet(self.player.rect.centerx, self.player.rect.top, 5, 20, damage=10)
all_sprites.add(bullet)
bullets.add(bullet)
def _shoot_double(self):
bullet_left = Bullet(self.player.rect.left + 10, self.player.rect.top, 5, 15, damage=8)
bullet_right = Bullet(self.player.rect.right - 10, self.player.rect.top, 5, 15, damage=8)
all_sprites.add(bullet_left, bullet_right)
bullets.add(bullet_left, bullet_right)
def _shoot_laser(self):
# 创建贯穿全屏的激光
# laser = LaserBeam(self.player.rect.centerx, 0, 8, damage=50) # 更宽更强大的激光
laser = LaserBeam(self.player.rect.centerx - 2, 0, 4, SCREEN_HEIGHT)
all_sprites.add(laser)
lasers.add(laser)
# 新增霰弹枪射击方法
def _shoot_shotgun(self):
# 发射5发散弹,中间3发有20度扩散角度
spread_angle = 20 # 扩散角度
bullets_count = 5
middle_bullet = bullets_count // 2
for i in range(bullets_count):
# 计算每发散弹的角度偏移
angle_offset = (i - middle_bullet) * (spread_angle / middle_bullet)
radian = math.radians(angle_offset)
# 创建子弹并设置初始位置
bullet = Bullet(
x=self.player.rect.centerx,
y=self.player.rect.top,
width=8, # 霰弹枪子弹稍大
height=15,
damage=6 # 单发伤害略低
)
bullet.image.fill(self.weapon_colors["shotgun"]) # 使用橙色
# 设置子弹速度方向
bullet.speed_x = 3 * math.sin(radian) # 水平速度分量
bullet.speed_y = -10 # 固定向上速度
all_sprites.add(bullet)
bullets.add(bullet)
# 关卡系统
class LevelSystem:
def __init__(self):
self.current_level = 1
self.enemy_count = 8
self.enemy_speed_range = (1, 4)
self.spawn_rate = 60
self.timer = 0
self.enemies_defeated = 0
self.enemies_required = 20
self.total_levels = 10 # 总关卡数
def update(self):
self.timer += 1
if self.timer == 1 or (self.timer % self.spawn_rate == 0 and len(enemies) < self.enemy_count):
self._spawn_enemy()
if self._is_level_complete():
self._next_level()
def _spawn_enemy(self):
enemy_types = ["normal", "fast", "tank"]
weights = [0.6, 0.3, 0.1]
enemy_type = random.choices(enemy_types, weights=weights)[0]
enemy = Enemy(enemy_type)
enemy.rect.x = random.randrange(SCREEN_WIDTH - enemy.rect.width)
enemy.rect.y = random.randrange(-100, -40)
all_sprites.add(enemy)
enemies.add(enemy)
def enemy_defeated(self, enemy_type):
self.enemies_defeated += 1
def _is_level_complete(self):
return self.enemies_defeated >= self.enemies_required
def is_game_complete(self):
return self.current_level >= self.total_levels
def _next_level(self):
if self.is_game_complete():
return
self.current_level += 1
self.enemies_defeated = 0
self.enemies_required = 20 + self.current_level * 5
self.enemy_count = 8 + self.current_level * 2
self.enemy_speed_range = (1, min(4 + self.current_level // 2, 8))
self.spawn_rate = max(30, 60 - self.current_level * 5)
# if self.current_level % 5 == 0:
if self.current_level % 2 == 0:
self._spawn_boss()
self.enemies_required = 1
def _spawn_boss(self):
boss = BossEnemy(self.current_level // 5)
all_sprites.add(boss)
bosses.add(boss)
enemies.add(boss)
# 计分系统
class ScoreSystem:
def __init__(self):
self.score = 0
self.multiplier = 1
self.combo = 0
self.combo_timer = 0
self.high_score = 0
def add_score(self, enemy_type):
base_scores = {
"normal": 100,
"fast": 150,
"tank": 200,
"boss": 1000
}
self.combo += 1
self.combo_timer = 180
if self.combo >= 20:
self.multiplier = 4
elif self.combo >= 10:
self.multiplier = 2
else:
self.multiplier = 1
# self.score += base_scores[enemy_type] * self.multiplier
self.score += base_scores.get(enemy_type, 0) * self.multiplier # 使用get方法提供默认值以防万一
def update(self):
if self.combo_timer > 0:
self.combo_timer -= 1
else:
self.combo = 0
self.multiplier = 1
def draw(self, screen):
font = pygame.font.SysFont(None, 36)
score_text = font.render(f"分数Sco: {self.score}", True, WHITE)
screen.blit(score_text, (SCREEN_WIDTH - 150, 10))
if self.multiplier > 1:
combo_text = font.render(f"x{self.multiplier} {self.combo}连击连击", True, YELLOW)
screen.blit(combo_text, (SCREEN_WIDTH - 150, 50))
def draw_health_bar(surface, player, x=10, y=50, width=120, height=18):
pygame.draw.rect(surface, WHITE, (x, y, width, height), 2)
health_width = int(width * max(player.health, 0) / 100)
color = GREEN if player.health > 50 else YELLOW if player.health > 20 else RED
pygame.draw.rect(surface, color, (x+2, y+2, health_width-4, height-4))
font = pygame.font.SysFont(None, 20)
text = font.render(f'HP {player.health}', True, WHITE)
surface.blit(text, (x + width//2 - 25, y+1))
def draw_boss_health_bar(surface, boss):
if not bosses:
return
width = SCREEN_WIDTH - 40
height = 15
x = 20
y = 20
# 防止max_health为0的情况
max_hp = max(1, boss.max_health) # 确保分母不会为0
current_hp = max(0, boss.health) # 确保血量不会为负
# 计算血条宽度
health_width = int(width * current_hp / max_hp)
# 绘制血条背景和外框
pygame.draw.rect(surface, (50, 50, 50), (x, y, width, height)) # 背景
pygame.draw.rect(surface, WHITE, (x, y, width, height), 2) # 外框
# 绘制当前血量
color = (255, 0, 0) # 红色血条
pygame.draw.rect(surface, color, (x+2, y+2, health_width-4, height-4))
# 绘制Boss血量和等级信息
font = pygame.font.SysFont(None, 20)
text = font.render(f'Boss HP {current_hp}/{max_hp} (LV:{boss.tier})', True, WHITE)
surface.blit(text, (x + width//2 - text.get_width()//2, y-20))
def draw_game_over(screen, win=False):
screen.fill((0, 0, 0))
font_large = pygame.font.SysFont(None, 72)
font_small = pygame.font.SysFont(None, 36)
title_text = font_large.render("游戏胜利Victory" if win else "游戏结束Game Over", True, GREEN if win else RED)
score_text = font_small.render(f"最终分数Score: {score_system.score}", True, WHITE)
restart_text = font_small.render("按空格键重新开始Press Space to Restart", True, WHITE)
screen.blit(title_text, (SCREEN_WIDTH//2 - title_text.get_width()//2, SCREEN_HEIGHT//2 - 100))
screen.blit(score_text, (SCREEN_WIDTH//2 - score_text.get_width()//2, SCREEN_HEIGHT//2))
screen.blit(restart_text, (SCREEN_WIDTH//2 - restart_text.get_width()//2, SCREEN_HEIGHT//2 + 50))
# 添加重置游戏函数
def reset_game():
# 清空所有精灵组
all_sprites.empty()
enemies.empty()
bullets.empty()
lasers.empty()
enemy_bullets.empty()
power_ups.empty()
bosses.empty()
# 重置玩家
global player
player = Player()
all_sprites.add(player)
# 重置系统
global weapon_system, level_system, score_system
weapon_system = WeaponSystem(player)
level_system = LevelSystem()
score_system = ScoreSystem()
# 生成初始敌人
for i in range(5):
level_system._spawn_enemy()
# 重置游戏状态
return "playing"
# 创建精灵组
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
bullets = pygame.sprite.Group()
lasers = pygame.sprite.Group()
enemy_bullets = pygame.sprite.Group()
power_ups = pygame.sprite.Group()
bosses = pygame.sprite.Group()
# 创建玩家和系统
player = Player()
all_sprites.add(player)
weapon_system = WeaponSystem(player)
level_system = LevelSystem()
score_system = ScoreSystem()
# 初始敌机
for i in range(5):
level_system._spawn_enemy()
# 游戏主循环
clock = pygame.time.Clock()
running = True
game_state = "playing" # playing, game_over, victory, pause
while running:
clock.tick(60)
# 事件处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE and game_state == "playing":
weapon_system.shoot()
elif event.key == pygame.K_0: # 按4切换自动射击模式
weapon_system.auto_fire = not weapon_system.auto_fire
elif event.key == pygame.K_1 and game_state == "playing":
weapon_system.current_weapon = "single"
elif event.key == pygame.K_2 and game_state == "playing":
weapon_system.current_weapon = "double"
elif event.key == pygame.K_3 and game_state == "playing":
weapon_system.current_weapon = "laser"
if event.key == pygame.K_4: # 按4切换霰弹枪
weapon_system.current_weapon = "shotgun"
elif event.key == pygame.K_p and game_state == "playing":
game_state = "pause"
elif event.key == pygame.K_p and game_state == "pause":
game_state = "playing"
elif event.key == pygame.K_SPACE and game_state == "victory":
game_state = reset_game()
elif event.key == pygame.K_SPACE and game_state == "game_over":
game_state = playing
# 按住空格键持续射击
if game_state == "playing" and pygame.key.get_pressed()[pygame.K_SPACE]:
weapon_system.shoot()
if game_state == "playing":
# 更新系统
all_sprites.update()
weapon_system.update()
level_system.update()
score_system.update()
# 检查游戏胜利条件
if level_system.is_game_complete() and not bosses :
# if level_system.is_game_complete() and not bosses and len(enemies) == 0:
game_state = "victory"
# 碰撞检测
hits = pygame.sprite.groupcollide(bullets, enemies, True, False)
for bullet, enemy_list in hits.items():
for enemy in enemy_list:
if enemy.take_damage(bullet.damage):
score_system.add_score(enemy.enemy_type)
level_system.enemy_defeated(enemy.enemy_type)
hits = pygame.sprite.groupcollide(lasers, enemies, False, False)
for laser, enemy_list in hits.items():
for enemy in enemy_list:
if enemy.take_damage(laser.damage):
score_system.add_score(enemy.enemy_type)
level_system.enemy_defeated(enemy.enemy_type)
if pygame.sprite.spritecollide(player, enemies, True):
player.health -= 1
if player.health <= 0:
game_state = "game_over"
if pygame.sprite.spritecollide(player, enemy_bullets, True):
player.health -= 5
if player.health <= 0:
game_state = "game_over"
hits = pygame.sprite.spritecollide(player, power_ups, True)
for powerup in hits:
if weapon_system.current_weapon == "single":
weapon_system.current_weapon = "double"
elif weapon_system.current_weapon == "double":
weapon_system.current_weapon = "laser"
# 渲染
screen.fill((0, 0, 0))
all_sprites.draw(screen)
score_system.draw(screen)
draw_health_bar(screen, player)
if bosses:
draw_boss_health_bar(screen, bosses.sprites()[0])
font = pygame.font.SysFont(None, 28)
weapon_text = font.render(f"武器Weapon: {'普通' if weapon_system.current_weapon == 'single' else '双发' if weapon_system.current_weapon == 'double' else '激光'}",
True, CYAN)
screen.blit(weapon_text, (10, SCREEN_HEIGHT - 40))
level_text = font.render(f"关卡Ka:{level_system.current_level}/{level_system.total_levels}", True, CYAN)
screen.blit(level_text, (10, SCREEN_HEIGHT - 70))
# 显示调试信息
debug_font = pygame.font.SysFont(None, 20)
debug_info = f"FPS: {int(clock.get_fps())}"
debug_text = debug_font.render(debug_info, True, (200, 200, 200))
screen.blit(debug_text, (10, 10))
elif game_state == "pause":
screen.fill((0, 0, 0))
font = pygame.font.SysFont(None, 72)
pause_text = font.render("游戏暂停Pause", True, WHITE)
continue_text = pygame.font.SysFont(None, 36).render("按P键继续游戏", True, WHITE)
screen.blit(pause_text, (SCREEN_WIDTH//2 - pause_text.get_width()//2, SCREEN_HEIGHT//2 - 50))
screen.blit(continue_text, (SCREEN_WIDTH//2 - continue_text.get_width()//2, SCREEN_HEIGHT//2 + 30))
elif game_state == "game_over":
draw_game_over(screen, win=False)
elif game_state == "victory":
draw_game_over(screen, win=True)
pygame.display.flip()
pygame.quit()
sys.exit()
欢迎大家来玩哈!把这段代码存到本地,比如leidian.py,然后pip install pygame,最后就可以python leidian.py启动啦!
把上面这段代码存到本地,比如leidian.py,然后pip install pygame,最后就可以python leidian.py启动啦!
1-4选择武器
按空格发射子弹
0自动发射子弹
alt-f4退出
alt+p 暂停
失败或过关后,按空格键重新开始!
CodeRider 是非常不错的AI辅助编程工作,本次实践中,能够完成一个小项目的创建,个人感觉跟Roo Code、Cline等一线AI编程软件处于差不多的水平。
缺点方面,生成代码的自动保存、写入功能没有找到......不知道是没有,还是我操作不熟练的缘故。