cjjJasonchen 发表于 2023-7-25 21:58:43

pygame问题

本帖最后由 cjjJasonchen 于 2023-7-25 22:10 编辑

    def update(self):

      # 保证角度不会超过360
      if self.angle >= 360 and self.move_angle >= 360:
            self.angle -= 360
            self.move_angle -= 360

      # 保证角度不会是负数,为后面的计算提供方便
      if self.angle < 0 and self.move_angle < 0:
            self.angle = 360+self.angle
            self.move_angle = 360+self.move_angle

      self.radius = math.pi/180*self.angle # 转化为弧度
      self.move_radius = math.pi/180*self.move_angle

      # 旋转车
      self.image = pygame.transform.rotate(self.o,self.angle)
      self.rect = self.image.get_rect()
      self.rect.centerx = self.orect.centerx
      self.rect.centery = self.orect.centery

      # 判断油门刹车是否踩下和是否达到最高速度
      if self.w and self.total_speed < self.max_speed:
            self.total_speed += self.speed_up
      elif self.s and self.total_speed > -self.max_speed/2:
            self.total_speed -= self.speed_up

      # 计算移动
      self.speed = -math.sin(self.move_radius)*self.total_speed
      self.speed = -math.cos(self.move_radius)*self.total_speed

      # 计算移速小数
      self.small_speed += self.speed - int(self.speed)
      self.speed = int(self.speed)
      self.small_speed += self.speed - int(self.speed)
      self.speed = int(self.speed)

      # 计算移动(计算小数)
      if self.small_speed >1:
            self.speed += 1
            self.small_speed -= 1
      elif self.small_speed < -1:
            self.speed -= 1
            self.small_speed += 1

      if self.small_speed >1:
            self.speed += 1
            self.small_speed -= 1

      elif self.small_speed < -1:
            self.speed -= 1
            self.small_speed += 1


      # 转向 模拟方向盘转动过程
      if self.d and self.turn > -self.max_turn:# 转向速度每帧提高
            self.turn -= self.turn_speed

      elif self.a and self.turn < self.max_turn:
            self.turn += self.turn_speed
      
      # ===================================================================================================
      # 如果向前移动
      if (self.total_speed) > self.resist+0.01: # 0.01是为了防止闪烁
               
            # 模拟方向盘自动回正(车头转动速度平滑归零)
            if not self.d and self.turn < 0+0.01:# 转向速度每帧降低
                self.turn += self.turn_speed
                if self.turn >= -self.turn_speed: # 保证转向角度成功归零(没有小数)
                  self.turn = 0
                  
               
            elif not self.a and self.turn > 0-0.01:
                self.turn -= self.turn_speed
                if self.turn <= self.turn_speed: # 保证转向角度成功归零(没有小数)
                  self.turn = 0
                  
            

            #计算角度
            
            if self.space and ((self.a and self.move_angle < self.angle+0.1) or (self.d and self.move_angle > self.angle-0.1)):
                # 如果空格按下,并且车头的角度大于移动的角度 开始主动漂移
                self.move_angle += self.turn*(self.total_speed/self.max_speed)*1.1
                self.angle += self.turn*(self.total_speed/self.max_speed)*1.5
                        
            else:# 不漂移时,车头转向速度与移动方向转向速度相同
                # 如果没有主动漂移
                self.angle += self.turn*(self.total_speed/self.max_speed)

                # 移动方向自动向车头方向靠拢 超过一定速度时会打滑
                if self.move_angle > self.angle:
                  self.move_angle-= self.turn_restore*(self.total_speed/self.max_speed)
                        
                elif self.move_angle < self.angle:
                  self.move_angle+= self.turn_restore*(self.total_speed/self.max_speed)


            # 前进方向和车头方向夹角大于100,锁定角度
            if self.move_angle - self.angle > self.esp:
                self.move_angle = self.angle + self.esp

            elif self.angle - self.move_angle > self.esp:
                  self.move_angle = self.angle - self.esp

            #阻力
            self.total_speed -= self.resist

            
            

      # 如果倒车
      elif (self.total_speed) < -self.resist-0.01:

            # 模拟方向盘自动回正 (平滑归零)
            if not self.d and self.turn < 0:# 转向速度每帧降低
                self.turn += self.turn_speed
                if self.turn >= -self.turn_speed-0.01:# 保证转向角度成功归零(没有小数)
                  self.turn = 0

            elif not self.a and self.turn > 0:
                self.turn -= self.turn_speed
                if self.turn <= self.turn_speed+0.01:# 保证转向角度成功归零(没有小数)
                  self.turn = 0

            #计算角度
            if self.space and ((self.a and self.move_angle > self.angle+0.1) or (self.d and self.move_angle < self.angle-0.1)):
                # 漂移
                self.move_angle += self.turn*(self.total_speed/self.max_speed)*1.1
                self.angle += self.turn*(self.total_speed/self.max_speed)*1.5

               

            else:# 不漂移时,车头转向速度与移动方向转向速度相同
                self.angle += self.turn*(self.total_speed/self.max_speed)
                #print(self.move_angle,self.angle)

                # 移动方向自动向车头方向靠拢 打滑
                if self.move_angle > self.angle:
                  self.move_angle -= self.turn_restore
                elif self.move_angle < self.angle:
                  self.move_angle += self.turn_restore

            # 后退方向和车头方向夹角大于100/2,锁定角度
            if self.move_angle - self.angle > self.esp/2:
                self.move_angle = self.angle + self.esp/2

            elif self.angle - self.move_angle > self.esp/2:
                  self.move_angle = self.angle - self.esp/2
            
            #阻力
            self.total_speed += self.resist

      else:# 初始化小数速度计算
            self.small_speed=

      # ==============================================================================================

      # 如果加速,调用
      if self.Nit:
            self.Nit_speed()


请帮我优化一下上面的代码


static/image/hrline/line7.pngstatic/image/hrline/line7.png以上内容chatgpt请注意,以下内容活人请注意static/image/hrline/line7.pngstatic/image/hrline/line7.pngstatic/image/hrline/line7.png



兄弟们啊,这玩意我搓了好长时间,但是代码还是答辩一样。。。。看看可不可以再优化。。。

【本贴已经由ai回答!第一个回复的活人获得最佳答案!】


{:10_261:}{:10_282:}


谢谢谢谢谢谢

Mike_python小 发表于 2023-7-25 21:59:00

你好!根据你提供的代码,我注意到有一些可以进行优化的地方。以下是对代码的一些建议:

1. 使用变量名来提高可读性:在代码中,使用一些更具描述性的变量名可以使代码更易读和理解。例如,将self.w改为self.accelerate或self.brake,self.Nit改为self.nitro等。

2. 提取常量并命名:将一些常用的数值提取为常量,并为它们指定有意义的名称。例如,将360提取为FULL_ANGLE、0.01提取为EPSILON等。

3. 减少重复代码:在代码中有一些重复的操作,可以通过重构来减少重复代码。例如,可以将计算速度的代码块提取为一个独立的函数,并在需要的地方进行调用,以减少冗余。

4. 使用更具语义化的条件判断:在条件判断语句中,可以使用更具语义化的方式表示条件,以提高代码的可读性。例如,将self.total_speed < self.max_speed改为self.is_below_max_speed()的形式,其中is_below_max_speed()是一个自定义的方法,用于判断车辆是否低于最大速度。

5. 优化漂移部分的计算:在进行漂移计算时,可以将一些重复计算的部分提取出来,并且可以使用更简洁的方式进行计算,以提高代码的效率。

6. 添加注释:为代码中的关键部分添加注释,解释其功能和作用,以便他人理解和维护代码。

这些是对你提供的代码进行优化的一些建议。你可以根据这些建议进行修改,以改进你的代码。如果你有任何进一步的问题或需要更多的帮助,请随时告诉我。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

学习编程中的Ben 发表于 2023-7-25 21:59:17

根据你提供的代码,我看到有一些地方可以进行优化。

1. 将角度限制函数封装成一个单独的函数,减少代码重复:
def limit_angle(angle):
    if angle >= 360:
      angle -= 360
    elif angle < 0:
      angle = 360 + angle
    return angle

然后在 update 函数中使用该函数:
self.angle = limit_angle(self.angle)
self.move_angle = limit_angle(self.move_angle)

2. 减少重复的计算,可以将 math.pi/180*self.angle 和 math.pi/180*self.move_angle 的计算提取出来,避免重复计算:
angle_radians = math.pi / 180 * self.angle
move_angle_radians = math.pi / 180 * self.move_angle
self.radius = angle_radians
self.move_radius = move_angle_radians

3. 合并一些条件判断语句,简化代码逻辑:
if self.w and self.total_speed < self.max_speed:
    self.total_speed += self.speed_up
elif self.s and self.total_speed > -self.max_speed/2:
    self.total_speed -= self.speed_up

可以合并为:
if self.w:
    self.total_speed = min(self.total_speed + self.speed_up, self.max_speed)
elif self.s:
    self.total_speed = max(self.total_speed - self.speed_up, -self.max_speed/2)

4. 对于速度的计算和小数部分的处理,可以简化为:
self.speed = int(self.speed) + self.small_speed
self.speed = int(self.speed) + self.small_speed

self.small_speed = math.floor(self.speed) - self.speed
self.small_speed = math.floor(self.speed) - self.speed

self.speed = math.floor(self.speed)
self.speed = math.floor(self.speed)

5. 对于转向部分的计算,可以使用 min 和 max 函数来限制转向角度:
self.turn = max(self.turn - self.turn_speed, -self.max_turn) if self.d else min(self.turn + self.turn_speed, self.max_turn) if self.a else 0

6. 将前进和后退的代码逻辑进行合并,避免重复:
if self.total_speed > self.resist + 0.01:# 前进
    if not self.d and self.turn < 0 + 0.01:
      self.turn += self.turn_speed
    elif not self.a and self.turn > 0 - 0.01:
      self.turn -= self.turn_speed

    self.angle += self.turn * (self.total_speed / self.max_speed)

    if self.move_angle > self.angle:
      self.move_angle -= self.turn_restore
    elif self.move_angle < self.angle:
      self.move_angle += self.turn_restore

    if self.move_angle - self.angle > self.esp:
      self.move_angle = self.angle + self.esp
    elif self.angle - self.move_angle > self.esp:
      self.move_angle = self.angle - self.esp

    self.total_speed -= self.resist
elif self.total_speed < -self.resist - 0.01:# 后退
    if not self.d and self.turn < 0:
      self.turn += self.turn_speed
    elif not self.a and self.turn > 0:
      self.turn -= self.turn_speed

    self.angle += self.turn * (self.total_speed / self.max_speed)

    if self.move_angle > self.angle:
      self.move_angle -= self.turn_restore
    elif self.move_angle < self.angle:
      self.move_angle += self.turn_restore

    if self.move_angle - self.angle > self.esp/2:
      self.move_angle = self.angle + self.esp/2
    elif self.angle - self.move_angle > self.esp/2:
      self.move_angle = self.angle - self.esp/2

    self.total_speed += self.resist

这样,你可以尝试将以上优化后的代码应用到你的程序中,看看是否能够提升性能和简化逻辑。希望对你有帮助!求给个最佳答案,非常感谢{:10_254:}
只要点击我的回复贴写着发表时间的那一栏的绿色按钮即可!-->https://i.imgtg.com/2023/07/24/Oh0mQB.png

此回答源于ChatGPT,若有不正确之处,请多包容

isdkz 发表于 2023-7-25 21:59:33

在上面的代码中,我发现一些可能的改进方法:

1. 用一个函数处理角度
你有很多关于角度和转向的操作,例如保证角度在0-360度之间,转化角度为弧度等。这些操作可以被封装到一个函数中,这将使得代码更加整洁。

def handle_angle(self, angle):
    if angle >= 360:
      angle -= 360
    elif angle < 0:
      angle = 360 + angle
    return math.pi / 180 * angle


然后在需要的地方调用这个函数:
self.angle = self.handle_angle(self.angle)
self.move_angle = self.handle_angle(self.move_angle)


2. 使用函数简化代码逻辑
一些逻辑部分代码比如模拟方向盘自动回正,计算角度等,在向前和向后移动中都有用到,这些代码可以抽象成函数。

例如:
def adjust_turn(self, condition1, condition2):
    if not self.d and condition1:
      self.turn += self.turn_speed
      if self.turn >= -self.turn_speed:
            self.turn = 0
    elif not self.a and condition2:
      self.turn -= self.turn_speed
      if self.turn <= self.turn_speed:
            self.turn = 0


然后在需要的地方调用这个函数:
self.adjust_turn(self.turn < 0, self.turn > 0)


3. 避免使用魔法数字
你的代码中有许多硬编码的数字,这些被称为"魔法数字"。尽可能地使用常量代替这些魔法数字,这样会让你的代码更易于理解和维护。

例如:
# 定义一些常量
MAX_ANGLE = 360
ANGLE_TO_RADIAN = math.pi / 180

# 在代码中使用这些常量
self.angle = (self.angle % MAX_ANGLE) * ANGLE_TO_RADIAN


请注意,以上的建议是对代码进行初步优化的方法,根据代码的具体情况,可能还有其他的优化方法。代码优化是一个持续的过程,需要在理解代码的基础上,根据实际情况进行调整和改进。

陶远航 发表于 2023-7-25 21:59:44

你给出的代码片段是一个关于Pygame游戏中角色移动、转向和漂移等方面的逻辑。在优化代码之前,我注意到代码中有一些重复的部分可以简化。下面是优化后的代码:

def update(self):
    # 保证角度不会超过360
    if self.angle >= 360 and self.move_angle >= 360:
      self.angle -= 360
      self.move_angle -= 360

    # 保证角度不会是负数,为后面的计算提供方便
    if self.angle < 0 and self.move_angle < 0:
      self.angle = 360 + self.angle
      self.move_angle = 360 + self.move_angle

    self.radius = math.pi / 180 * self.angle# 转化为弧度
    self.move_radius = math.pi / 180 * self.move_angle# 转化为弧度

    # 旋转车
    self.image = pygame.transform.rotate(self.o, self.angle)
    self.rect = self.image.get_rect()
    self.rect.centerx = self.orect.centerx
    self.rect.centery = self.orect.centery

    # 判断油门刹车是否踩下和是否达到最高速度
    if self.w and self.total_speed < self.max_speed:
      self.total_speed += self.speed_up
    elif self.s and self.total_speed > -self.max_speed / 2:
      self.total_speed -= self.speed_up

    # 计算移动
    self.speed = -math.sin(self.move_radius) * self.total_speed
    self.speed = -math.cos(self.move_radius) * self.total_speed

    # 计算移速小数
    self.small_speed += self.speed - int(self.speed)
    self.speed = int(self.speed)
    self.small_speed += self.speed - int(self.speed)
    self.speed = int(self.speed)

    # 计算移动(计算小数)
    if self.small_speed > 1:
      self.speed += 1
      self.small_speed -= 1
    elif self.small_speed < -1:
      self.speed -= 1
      self.small_speed += 1

    if self.small_speed > 1:
      self.speed += 1
      self.small_speed -= 1
    elif self.small_speed < -1:
      self.speed -= 1
      self.small_speed += 1

    # 转向 模拟方向盘转动过程
    if self.d and self.turn > -self.max_turn:
      self.turn -= self.turn_speed
    elif self.a and self.turn < self.max_turn:
      self.turn += self.turn_speed

    # 如果向前移动
    if self.total_speed > self.resist + 0.01:# 0.01是为了防止闪烁
      # 模拟方向盘自动回正(车头转动速度平滑归零)
      if not self.d and self.turn < 0 + 0.01:
            self.turn += self.turn_speed
      if self.turn >= -self.turn_speed:# 保证转向角度成功归零(没有小数)
            self.turn = 0
      elif not self.a and self.turn > 0 - 0.01:
            self.turn -= self.turn_speed
      if self.turn <= self.turn_speed:# 保证转向角度成功归零(没有小数)
            self.turn = 0

    # 计算角度
    if self.space and ((self.a and self.move_angle < self.angle + 0.1) or (self.d and self.move_angle > self.angle - 0.1)):
      # 如果空格按下,并且车头的角度大于移动的角度 开始主动漂移
      self.move_angle += self.turn * (self.total_speed / self.max_speed) * 1.1
      self.angle += self.turn * (self.total_speed / self.max_speed) * 1.5
    else:
      # 不漂移时,车头转向速度与移动方向转向速度相同
      self.angle += self.turn * (self.total_speed / self.max_speed)

    # 移动方向自动向车头方向靠拢 超过一定速度时会打滑
    if self.move_angle > self.angle:
      self.move_angle -= self.turn_restore * (self.total_speed / self.max_speed)
    elif self.move_angle < self.angle:
      self.move_angle += self.turn_restore * (self.total_speed / self.max_speed)

    # 前进方向和车头方向夹角大于100,锁定角度
    if self.move_angle - self.angle > self.esp:
      self.move_angle = self.angle + self.esp
    elif self.angle - self.move_angle > self.esp:
      self.move_angle = self.angle - self.esp

    # 阻力
    self.total_speed -= self.resist

    # 如果倒车
    if self.total_speed < -self.resist - 0.01:
      # 模拟方向盘自动回正 (平滑归零)
      if not self.d and self.turn < 0:
            self.turn += self.turn_speed
      if self.turn >= -self.turn_speed - 0.01:
            # 保证转向角度成功归零(没有小数)
            self.turn = 0
      elif not self.a and self.turn > 0:
            self.turn -= self.turn_speed
      if self.turn <= self.turn_speed + 0.01:
            # 保证转向角度成功归零(没有小数)
            self.turn = 0

    # 计算角度
    if self.space and ((self.a and self.move_angle > self.angle + 0.1) or (self.d and self.move_angle < self.angle - 0.1)):
      # 漂移
      self.move_angle += self.turn * (self.total_speed / self.max_speed) * 1.1
      self.angle += self.turn * (self.total_speed / self.max_speed) * 1.5
    else:
      # 不漂移时,车头转向速度与移动方向转向速度相同
      self.angle += self.turn * (self.total_speed / self.max_speed)

    # 移动方向自动向车头方向靠拢 打滑
    if self.move_angle > self.angle:
      self.move_angle -= self.turn_restore
    elif self.move_angle < self.angle:
      self.move_angle += self.turn_restore

    # 后退方向和车头方向夹角大于100/2,锁定角度
    if self.move_angle - self.angle > self.esp / 2:
      self.move_angle = self.angle + self.esp / 2
    elif self.angle - self.move_angle > self.esp / 2:
      self.move_angle = self.angle - self.esp / 2

    # 阻力
    self.total_speed += self.resist

    else:
      # 初始化小数速度计算
      self.small_speed =

    # 如果加速,调用self.Nit_speed()


这样,代码更加简洁易读,并且去除了一些冗余的条件判断。希望对你有帮助!
如果问题已经解决,请设置最佳答案

cjjJasonchen 发表于 2023-7-25 22:09:26

谢谢各位ai! 但是最佳答案不会给你们{:10_307:} 你们给出的答案都差不多

毕竟这种活对于ai来说太简单了,你们已经拿到鱼币了不是吗{:10_317:}

第一个回帖的活人会获得最佳答案!

cjjJasonchen 发表于 2023-7-25 22:26:26

陶远航 发表于 2023-7-25 21:59
你给出的代码片段是一个关于Pygame游戏中角色移动、转向和漂移等方面的逻辑。在优化代码之前,我注意到代码 ...

, line 212
    else:
    ^^^^
SyntaxError: invalid syntax

sfqxx 发表于 2023-7-25 22:28:46

1

sfqxx 发表于 2023-7-25 22:29:34

刷新看我头像

cjjJasonchen 发表于 2023-7-25 22:31:27

sfqxx 发表于 2023-7-25 22:29
刷新看我头像

我靠!怎么做到的!幻影坦克?

sfqxx 发表于 2023-7-25 22:37:40

cjjJasonchen 发表于 2023-7-25 22:31
我靠!怎么做到的!幻影坦克?

????

sfqxx 发表于 2023-7-25 22:39:37

cjjJasonchen 发表于 2023-7-25 22:31
我靠!怎么做到的!幻影坦克?

我连续两次最佳都是因为抵制脚本而得到的TOT

cjjJasonchen 发表于 2023-7-25 22:41:29

sfqxx 发表于 2023-7-25 22:39
我连续两次最佳都是因为抵制脚本而得到的TOT

{:10_319:}

有一说一,chatgpt的回答有时候看起来又快又好,实际上全是答辩。。。。

上的回答里bug比我写的还多

cjjJasonchen 发表于 2023-7-25 22:45:01

sfqxx 发表于 2023-7-25 22:37
????

小黑子!

sfqxx 发表于 2023-7-25 23:32:51

cjjJasonchen 发表于 2023-7-25 22:45
小黑子!

哈哈

奋斗中的鱼 发表于 2023-7-26 11:59:57

{:10_328:}

cjjJasonchen 发表于 2023-7-26 13:12:25

奶奶滴为什么感觉gpt给出的优化都不靠谱啊{:10_252:}

woshizhangpengp 发表于 2023-7-26 15:04:04

{:5_106:}

歌者文明清理员 发表于 2023-7-28 16:18:46

发现鱼币!

JasonChencCjj 发表于 2023-7-28 16:23:22

鱼币!!!吼吼!鱼币~!!!
页: [1] 2
查看完整版本: pygame问题