驭码CodeRider 2.0 产品体验:在VSCode安装并创建一个雷电小游戏
驭码CodeRider 2.0 产品体验:在VSCode安装并创建一个雷电小游戏
CodeRider介绍
驭码CodeRider 是极狐GitLab 推出的基于生成式人工智能技术的新一代软件生产工具,为开发者提供自然语言生成代码、代码补全、代码调优纠错、单元测试生成、代码解释以及智能技术问答等功能。CodeRider 与 GitLab 深度融合,为企业提供软件开发全生命周期(SDLC)的支持,涵盖项目快速上手、企业文档库/代码仓智能问答、议题管理、合并请求智能辅助、代码智能评审、安全扫描智能解析、流水线管理等功能。CodeRider手册:CodeRider 产品介绍 | 极狐GitLab
在VSCode里安装注册CodeRider
安装CodeRider插件
首先在VSCode的插件里查找CodeRider
找到后,点击“Install”进行安装。
安装的时候弹出trust按钮,确认即可。
到极狐注册账户
到极狐注册账户,在VSCode的CodeRider里登录极狐账户。
极狐注册地址:
Sign up · JiHu GitLab
注意,极狐是免费使用90天
JihuLab.com 免费试用 90 天
注册 SaaS 即为您开通极狐GitLab AI 产品驭码CodeRider试用权限,
时长 90 天,点击了解驭码CodeRider。
极狐项目模版选择
注册jihulab极狐后,在最后的项目模版里,有spring hugo astro等多种选择,应该用哪个呢?
最终我选择了hugo 。因为它简单容易上手!
以下是AI告诉的选择建议:
模版选择建议
需求类型 | 推荐模板 | 理由 |
---|---|---|
构建后端服务或微服务 | Spring | 强大的企业级功能,适合复杂业务逻辑 |
简单快速搭建博客或文档 | Hugo | 构建速度快,生态完善,操作简单 |
需要现代前端交互和性能优化 | Astro | 支持多框架,页面性能好,前端灵活 |
模版总结
- Spring:适合后端开发,尤其是 Java 技术栈的企业级应用。
- Hugo:适合快速生成静态内容网站,操作简单,性能优秀。
- Astro:适合现代前端开发,支持多种框架,性能优化好。
根据项目需求和技术栈选择合适的模板。如果项目需要前后端分离,可以结合 Spring(后端)和 Hugo/Astro(前端)使用。如果有更多具体需求,可以进一步讨论!
极狐里设置ssh key(暂时非必须)
进入项目,提示要设置ssh key才能上传
SSH Keys
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.
极狐里设置Access tokens
- User Settings
- Access tokens
Personal access tokens
创建新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
Feed token
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.
Incoming email token
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后,在插件里把它点出来,就会提醒登录。登录可以选择两种:
1、点击打开网站认证
CodeRider is requesting access to your account on jihulab.com.
2、使用个人token认证
token就是前面在极狐里设置的个人Access tokens
CodeRider 登录成功
登录成功后显示
尝试修改成中文(失败)
到配置里面,找到Coderider › Commit Message: Language ,先改成中文:
很遗憾,设为chinese后,还是英文.....
也许是因为我的vscode是英文的缘故吧。
CodeRider 使用技巧
在描述需求时,可通过输入 “@” 获取内容,或者 “#” 索引文件夹、文件。
- @问题:检查当前项目中的代码或配置错误,以便于 Loom 修复。
- @终端:执行终端操作。
- @Git 提交:选择 Git 提交记录来完成操作。
- #文件夹或文件:索引文件夹或文件内容作为上下文。
自然语言生成代码
您可以在 IDE 中使用自然语言描述您的编程需求,CodeRider 将根据需求指令生成代码建议。 在编辑器中生成代码时,CodeRider 将参考当前代码文件、整个项目仓相关代码内容(增强模式下)自动为您生成代码。您可以使用快捷键逐片段或整个模块接纳生成代码,也可以废弃当前代码建议。(快捷键及模式设置参考“代码智能实时补全”。) 在对话框中生成代码时,您可直接输入自然语言需求,CodeRider 将生成对应代码建议。特别地,当您“@代码仓知识库”并输入需求时,CodeRider 将针对指定的代码仓内容结合需求指令生成代码。您可以点击“在光标处插入”直接将生成代码插入到光标停留位置。
实践让CodeRider 帮助写个雷电小游戏
prompt直接写:帮我写一个类似雷电的游戏
效果尚可。
输出结果里面除了代码,还写了游戏架构,也就是游戏状态机,这挺不错!
游戏状态机的图:
graph TD
A[游戏开始] --> B[主菜单]
B -->|开始游戏| C[关卡进行中]
C -->|完成关卡| D[关卡结束]
D -->|继续| C
D -->|返回菜单| B
C -->|游戏结束| E[结算画面]
E --> B
代码可以直接copy到编辑文件的图标处,挺方便。但是写入文件会弹出对话框让自己起文件名,这样自由度更高,但是需要手工去copy代码到合适的位置,这一点与其它AI辅助软件(Trae、auto-coder)比起来感觉繁琐。
后面又增加了一些功能,导致程序存在闪退问题,让CodeRider解决
prompt:这是雷电游戏的源代码,但是存在闪退问题,请解决
CodeRider 给出了修改的代码。
需要自己动手把代码粘过去,我不知道应该放在哪里,替换哪部分,于是我问
prompt:请给我完整的新代码,以方便我修改文件
于是它给出了全部的代码,将代码保存好,确实解决了闪退问题。
当然由于CodeRider 大部分时候还是喜欢只输出需要修改的代码,所以后面大部分时候是自己手工一点点把CodeRider 的代码copy过去的。
后面又增加了霰弹枪武器和自动发射,最终效果如图:
最终雷电游戏的python代码如下:
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 // 2self.rect.bottom = SCREEN_HEIGHT - 10self.speed = 8self.health = 100def update(self):keys = pygame.key.get_pressed()if keys[pygame.K_LEFT] and self.rect.left > 0:self.rect.x -= self.speedif keys[pygame.K_RIGHT] and self.rect.right < SCREEN_WIDTH:self.rect.x += self.speedif keys[pygame.K_UP] and self.rect.top > 0:self.rect.y -= self.speedif 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 = xself.rect.bottom = yself.speed_y = -10 # 默认向上速度self.speed_x = 0 # 初始无横向移动self.damage = damagedef update(self):self.rect.y += self.speed_yself.rect.x += self.speed_xif (self.rect.bottom < 0 or self.rect.top > SCREEN_HEIGHT orself.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_typeif enemy_type == "normal":self.image = pygame.Surface((30, 30))self.image.fill(RED)self.health = 1self.speedy = random.randrange(2, 4)elif enemy_type == "fast":self.image = pygame.Surface((24, 24))self.image.fill(YELLOW)self.health = 1self.speedy = random.randrange(4, 7)elif enemy_type == "tank":self.image = pygame.Surface((40, 38))self.image.fill((100, 100, 255))self.health = 4self.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.speedyif 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 -= amountif self.health <= 0:self.kill()return Truereturn 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 // 2self.rect.y = -100self.speed = 1# self.health = tier * 100# self.max_health = tier * 100# self.attack_pattern = "move_down"# self.attack_timer = 0# self.tier = tierself.tier = max(1, tier) # 确保tier至少为1self.health = self.tier * 100self.max_health = self.tier * 100 # 确保max_health永远不会为0self.attack_pattern = "move_down"self.attack_timer = 0def update(self):self._movement_pattern()self._attack_pattern()def _movement_pattern(self):if self.attack_pattern == "move_down":self.rect.y += self.speedif 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 *= -1def _attack_pattern(self):self.attack_timer += 1if 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 -= amountif 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 Truereturn 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 = xself.rect.top = yself.speed = speedself.angle = angleself.damage = damageself.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 = damageself.lifetime = 30 # 激光持续时间def update(self):self.lifetime -= 1if 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 = kindself.speed = 3def update(self):self.rect.y += self.speedif self.rect.top > SCREEN_HEIGHT:self.kill()# 武器系统
class WeaponSystem:def __init__(self, player):self.player = playerself.current_weapon = "single"self.weapon_cooldown = {"single": 10, "double": 15, "laser": 60,"shotgun": 20 # 霰弹枪冷却时间}self.cooldown = 0self.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 = 5middle_bullet = bullets_count // 2for 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 = 1self.enemy_count = 8self.enemy_speed_range = (1, 4)self.spawn_rate = 60self.timer = 0self.enemies_defeated = 0self.enemies_required = 20self.total_levels = 10 # 总关卡数def update(self):self.timer += 1if 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 += 1def _is_level_complete(self):return self.enemies_defeated >= self.enemies_requireddef is_game_complete(self):return self.current_level >= self.total_levelsdef _next_level(self):if self.is_game_complete():returnself.current_level += 1self.enemies_defeated = 0self.enemies_required = 20 + self.current_level * 5self.enemy_count = 8 + self.current_level * 2self.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 = 1def _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 = 0self.multiplier = 1self.combo = 0self.combo_timer = 0self.high_score = 0def add_score(self, enemy_type):base_scores = {"normal": 100,"fast": 150,"tank": 200,"boss": 1000}self.combo += 1self.combo_timer = 180if self.combo >= 20:self.multiplier = 4elif self.combo >= 10:self.multiplier = 2else:self.multiplier = 1# self.score += base_scores[enemy_type] * self.multiplierself.score += base_scores.get(enemy_type, 0) * self.multiplier # 使用get方法提供默认值以防万一def update(self):if self.combo_timer > 0:self.combo_timer -= 1else:self.combo = 0self.multiplier = 1def 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 REDpygame.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:returnwidth = SCREEN_WIDTH - 40height = 15x = 20y = 20# 防止max_health为0的情况max_hp = max(1, boss.max_health) # 确保分母不会为0current_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 playerplayer = Player()all_sprites.add(player)# 重置系统global weapon_system, level_system, score_systemweapon_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, pausewhile running:clock.tick(60)# 事件处理for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif 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_fireelif 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 -= 1if player.health <= 0:game_state = "game_over"if pygame.sprite.spritecollide(player, enemy_bullets, True):player.health -= 5if 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编程软件处于差不多的水平。
缺点方面,生成代码的自动保存、写入功能没有找到......不知道是没有,还是我操作不熟练的缘故。