鱼C论坛

 找回密码
 立即注册
查看: 1298|回复: 4

一个列表为空的问题

[复制链接]
发表于 2020-1-30 16:20:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
game_functions.py

def collide(group1,group2,distance,f1,f2):
    hits = []
    for sprite1 in group1.group:
        for sprite2 in group2.group:
            if sprite1.distance(sprite2)<distance:
                hits.append(sprite2.pos())
                if f1:
                    sprite1.hit()
                if f2:
                    sprite2.hit()
    return hits

main.py

from game_functions import *

hits1 = collide(self.bullets,self.enemies,20,True,True)
print(hits1)

简单说明一下,self.bullets和self.enemies,hit()已经在其他部分定义好了,代码太长截了出问题的一部分,应该是子弹(bullets)和敌人(enemies)距离小于20时hits列表增加一个坐标,已测试game_function没有问题,可以返回坐标,现在测试main.py里的hit1列表一直是空,距离小于20也是空,卡了好久了,请大佬们指点一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-1-30 16:21:34 | 显示全部楼层
把完整代码发上来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-30 16:39:15 | 显示全部楼层
main.py
  1. from turtle import *
  2. from sprite import *
  3. from setting import *
  4. from player import *
  5. from bullet import *
  6. from enemy import *
  7. from game_functions import *
  8. from supply import *
  9. import random
  10. class Game():
  11.     def __init__(self):
  12.         self.running=True
  13.         setup(WIDTH,HEIGHT)
  14.         title(TITLE)
  15.         tracer(0)
  16.    
  17.     def new(self):
  18.         self.all_sprites=Group()
  19.         self.players=Group()
  20.         self.bullets=Group()
  21.         self.enemies=Group()
  22.         self.middleEnemies=Group()
  23.         self.largeEnemies=Group()
  24.         self.supplies=Group()
  25.         self.player=Player()
  26.         self.players.add(self.player)
  27.         self.all_sprites.add(self.player)
  28.         self.supply = Supply()
  29.         self.supplies.add(self.supply)
  30.         self.all_sprites.add(self.supply)
  31.         for i in range(30):
  32.             bullet = Bullet()
  33.             self.bullets.add(bullet)
  34.             self.all_sprites.add(bullet)
  35.         for i in range(10):
  36.             enemy=Enemy()
  37.             self.enemies.add(enemy)
  38.             self.all_sprites.add(enemy)
  39.         for i in range(5):
  40.             middleEnemy=MiddleEnemy()
  41.             self.middleEnemies.add(middleEnemy)
  42.             self.all_sprites.add(middleEnemy)
  43.         for i in range(1):
  44.             largeEnemy=LargeEnemy()
  45.             self.largeEnemies.add(largeEnemy)
  46.             self.all_sprites.add(largeEnemy)
  47.         self.player.load(self.bullets)
  48.         self.key_binding()
  49.         self.run()
  50.    
  51.     def run(self):
  52.         self.playing=True
  53.         while self.playing:
  54.             self.update()
  55.             update()

  56.     def update(self):
  57.         self.all_sprites.update()
  58.         collide(self.players,self.enemies,20,True,True)
  59.         collide(self.bullets,self.enemies,20,True,True)
  60.         collide(self.players,self.middleEnemies,30,True,True)
  61.         collide(self.bullets,self.middleEnemies,30,True,True)
  62.         collide(self.players,self.largeEnemies,40,True,True)
  63.         collide(self.bullets,self.largeEnemies,40,True,True)
  64.         hits1 = collide(self.bullets,self.enemies,20,True,True)
  65.         print(hits1)
  66.         for hit in hits1:
  67.             if random.random()<1 and self.supply.active == False:
  68.                 self.supply.active = True
  69.                 self.supply.goto(hit)
  70.         
  71.         


  72.     def show_start_screen(self):
  73.         pass
  74.     def show_go_screen(self):
  75.         pass

  76.     def key_binding(self):
  77.         onkey(self.player.forward,'w')
  78.         onkey(self.player.backward,'s')
  79.         onkey(self.player.left,'a')
  80.         onkey(self.player.right,'d')
  81.         onkey(self.player.shoot,'space')
  82.         listen()
  83. if __name__=='__main__':
  84.     g = Game()
  85.     g.show_start_screen()
  86.     while g.running:
  87.         g.new()
  88.         g.show_go_screen()

复制代码

game_functions.py
  1. def collide(group1,group2,distance,f1,f2):
  2.     hits = []
  3.     for sprite1 in group1.group:
  4.         for sprite2 in group2.group:
  5.             if sprite1.distance(sprite2)<distance:
  6.                 hits.append(sprite2.pos())
  7.                 if f1:
  8.                     sprite1.hit()
  9.                 if f2:
  10.                     sprite2.hit()
  11.     return hits
复制代码

setting.py
  1. from sprite import *
  2. from setting import *
  3. from player import *
  4. class Bullet(Sprite):
  5.     def __init__(self):
  6.         Sprite.__init__(self)
  7.         self.shape('circle')
  8.         self.color('green')
  9.         self.active=False
  10.         self.goto(-1000,-1000)
  11.    
  12.     def move(self):
  13.         if self.active:
  14.             self.border_check()
  15.             self.sety(self.ycor()+BULLET_SPEED)
  16.             

  17.     def border_check(self):
  18.         if self.ycor()>(HEIGHT//2):
  19.             self.active = False
  20.             self.goto(-1000,-1000)

  21.     def hit(self):
  22.         self.active=False
  23.         self.goto(-1000,-1000)
  24.         
复制代码

bullet.py
  1. from sprite import *
  2. from setting import *
  3. from player import *
  4. class Bullet(Sprite):
  5.     def __init__(self):
  6.         Sprite.__init__(self)
  7.         self.shape('circle')
  8.         self.color('green')
  9.         self.active=False
  10.         self.goto(-1000,-1000)
  11.    
  12.     def move(self):
  13.         if self.active:
  14.             self.border_check()
  15.             self.sety(self.ycor()+BULLET_SPEED)
  16.             

  17.     def border_check(self):
  18.         if self.ycor()>(HEIGHT//2):
  19.             self.active = False
  20.             self.goto(-1000,-1000)

  21.     def hit(self):
  22.         self.active=False
  23.         self.goto(-1000,-1000)
  24.         
复制代码

player.py
  1. from sprite import *
  2. from setting import *
  3. from bullet import *
  4. class Player(Sprite):
  5.     def __init__(self):
  6.         Sprite.__init__(self)
  7.         self.shape('square')
  8.         self.color('red')

  9.     def forward(self):
  10.         self.y += PLAYER_SPEED
  11.     def backward(self):
  12.         self.y -= PLAYER_SPEED
  13.     def left(self):
  14.         self.x -= PLAYER_SPEED
  15.     def right(self):
  16.         self.x += PLAYER_SPEED

  17.     def load(self,bullets):
  18.         self.bullets = bullets

  19.     def shoot(self):
  20.         bullet = self.bullets.group.pop(0)
  21.         bullet.goto(self.pos())
  22.         bullet.active=True
  23.         self.bullets.add(bullet)

  24.     def hit(self):
  25.         self.ht()
复制代码

sprite.py
  1. from sprite import *
  2. from setting import *
  3. import random

  4. class Enemy(Sprite):
  5.     def __init__(self):
  6.         Sprite.__init__(self)
  7.         self.shape('triangle')
  8.         self.color('black')
  9.         self.reset()
  10.    
  11.     def move(self):
  12.         self.sety(self.ycor()-ENEMY_SPEED)
  13.         self.border_check()

  14.     def reset(self):
  15.         x = random.randint(-WIDTH//2,WIDTH//2)
  16.         y = random.randint(HEIGHT//2+100,HEIGHT//2+200)
  17.         self.goto(x,y)

  18.     def border_check(self):
  19.         if self.ycor()<-HEIGHT//2:
  20.             self.reset()

  21.     def hit(self):
  22.         self.reset()

  23. class MiddleEnemy(Enemy):
  24.     def __init__(self):
  25.         Enemy.__init__(self)
  26.         self.color('purple')
  27.         self.life = 2
  28.     def hit(self):
  29.         self.life -=1
  30.         if self.life == 0:
  31.             self.reset()
  32.             self.life = 2
  33. class LargeEnemy(Enemy):
  34.     def __init__(self):
  35.         Enemy.__init__(self)
  36.         self.color('orange')
  37.         self.life = 3
  38.     def hit(self):
  39.         self.life -= 1
  40.         if self.life == 0:
  41.             self.reset()
  42.             self.life = 3
复制代码

enemy.py
  1. from sprite import *
  2. from setting import *
  3. import random

  4. class Enemy(Sprite):
  5.     def __init__(self):
  6.         Sprite.__init__(self)
  7.         self.shape('triangle')
  8.         self.color('black')
  9.         self.reset()
  10.    
  11.     def move(self):
  12.         self.sety(self.ycor()-ENEMY_SPEED)
  13.         self.border_check()

  14.     def reset(self):
  15.         x = random.randint(-WIDTH//2,WIDTH//2)
  16.         y = random.randint(HEIGHT//2+100,HEIGHT//2+200)
  17.         self.goto(x,y)

  18.     def border_check(self):
  19.         if self.ycor()<-HEIGHT//2:
  20.             self.reset()

  21.     def hit(self):
  22.         self.reset()

  23. class MiddleEnemy(Enemy):
  24.     def __init__(self):
  25.         Enemy.__init__(self)
  26.         self.color('purple')
  27.         self.life = 2
  28.     def hit(self):
  29.         self.life -=1
  30.         if self.life == 0:
  31.             self.reset()
  32.             self.life = 2
  33. class LargeEnemy(Enemy):
  34.     def __init__(self):
  35.         Enemy.__init__(self)
  36.         self.color('orange')
  37.         self.life = 3
  38.     def hit(self):
  39.         self.life -= 1
  40.         if self.life == 0:
  41.             self.reset()
  42.             self.life = 3
复制代码


supply.py
  1. from sprite import *
  2. from setting import *

  3. class Supply(Sprite):
  4.     def __init__(self):
  5.         Sprite.__init__(self)
  6.         self.shape('turtle')
  7.         self.color('black')
  8.         self.active = False
  9.         self.goto(-1000,1000)

  10.     def move(self):
  11.         self.sety(self.ycor()-SUPPLY_SPEED)
  12.         self.border_check()

  13.     def border_check(self):
  14.         if self.ycor()<-HEIGHT//2:
  15.             self.active = False
  16.             self.goto(-1000,-1000)
复制代码

这是完整代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-30 16:46:41 | 显示全部楼层
mian.py
  1. from turtle import *
  2. from sprite import *
  3. from setting import *
  4. from player import *
  5. from bullet import *
  6. from enemy import *
  7. from game_functions import *
  8. from supply import *
  9. import random
  10. class Game():
  11.     def __init__(self):
  12.         self.running=True
  13.         setup(WIDTH,HEIGHT)
  14.         title(TITLE)
  15.         tracer(0)
  16.    
  17.     def new(self):
  18.         self.all_sprites=Group()
  19.         self.players=Group()
  20.         self.bullets=Group()
  21.         self.enemies=Group()
  22.         self.middleEnemies=Group()
  23.         self.largeEnemies=Group()
  24.         self.supplies=Group()
  25.         self.player=Player()
  26.         self.players.add(self.player)
  27.         self.all_sprites.add(self.player)
  28.         self.supply = Supply()
  29.         self.supplies.add(self.supply)
  30.         self.all_sprites.add(self.supply)
  31.         for i in range(30):
  32.             bullet = Bullet()
  33.             self.bullets.add(bullet)
  34.             self.all_sprites.add(bullet)
  35.         for i in range(10):
  36.             enemy=Enemy()
  37.             self.enemies.add(enemy)
  38.             self.all_sprites.add(enemy)
  39.         for i in range(5):
  40.             middleEnemy=MiddleEnemy()
  41.             self.middleEnemies.add(middleEnemy)
  42.             self.all_sprites.add(middleEnemy)
  43.         for i in range(1):
  44.             largeEnemy=LargeEnemy()
  45.             self.largeEnemies.add(largeEnemy)
  46.             self.all_sprites.add(largeEnemy)
  47.         self.player.load(self.bullets)
  48.         self.key_binding()
  49.         self.run()
  50.    
  51.     def run(self):
  52.         self.playing=True
  53.         while self.playing:
  54.             self.update()
  55.             update()

  56.     def update(self):
  57.         self.all_sprites.update()
  58.         collide(self.players,self.enemies,20,True,True)
  59.         collide(self.bullets,self.enemies,20,True,True)
  60.         collide(self.players,self.middleEnemies,30,True,True)
  61.         collide(self.bullets,self.middleEnemies,30,True,True)
  62.         collide(self.players,self.largeEnemies,40,True,True)
  63.         collide(self.bullets,self.largeEnemies,40,True,True)
  64.         hits1 = collide(self.bullets,self.enemies,20,True,True)
  65.         print(hits1)
  66.         for hit in hits1:
  67.             if random.random()<1 and self.supply.active == False:
  68.                 self.supply.active = True
  69.                 self.supply.goto(hit)
  70.         
  71.         


  72.     def show_start_screen(self):
  73.         pass
  74.     def show_go_screen(self):
  75.         pass

  76.     def key_binding(self):
  77.         onkey(self.player.forward,'w')
  78.         onkey(self.player.backward,'s')
  79.         onkey(self.player.left,'a')
  80.         onkey(self.player.right,'d')
  81.         onkey(self.player.shoot,'space')
  82.         listen()
  83. if __name__=='__main__':
  84.     g = Game()
  85.     g.show_start_screen()
  86.     while g.running:
  87.         g.new()
  88.         g.show_go_screen()

复制代码

game_functions.py
  1. def collide(group1,group2,distance,f1,f2):
  2.     hits = []
  3.     for sprite1 in group1.group:
  4.         for sprite2 in group2.group:
  5.             if sprite1.distance(sprite2)<distance:
  6.                 hits.append(sprite2.pos())
  7.                 if f1:
  8.                     sprite1.hit()
  9.                 if f2:
  10.                     sprite2.hit()
  11.     return hits
  12.    


复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-22 01:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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