Как я могу добавить одно очко к баллу, когда система подсчета очков находится в цикле?

#python #kivy

#питон #киви

Вопрос:

 from kivy.config import Config  Config.set('graphics', 'width', '1050') Config.set('graphics', 'height', '600')  from kivy.app import App from kivy.properties import Clock from kivy.uix.widget import Widget from kivy.uix.image import Image from kivy.core.window import Window import random  class MainWidget(Widget):  from controls import _keyboard_closed, _on_keyboard_down, _on_keyboard_up   drone = None  SCORE = 0   clouds = []  balloons = []   current_speed_y = 0  current_speed_x = 0   drone_coordinates = [(0, 0), (0, 0)]  balloon_coordinates = [(0, 0), (0, 0)]   def __init__(self, **kwargs):  super().__init__(**kwargs)   self.init_drone()   Clock.schedule_interval(self.init_clouds, 1 / 8)  Clock.schedule_interval(self.update, 1 / 600)  Clock.schedule_interval(self.init_balloons, 7)   self._keyboard = Window.request_keyboard(self._keyboard_closed, self)  self._keyboard.bind(on_key_down=self._on_keyboard_down)  self._keyboard.bind(on_key_up=self._on_keyboard_up)   def init_clouds(self, dt):  cloud_types = ["images/cloudbig.png", "images/cloudbig1.png", "images/cloudbig2.png"]  cloud_type = random.choice(cloud_types)   a = self.width  b = self.width - 100   x = random.randint(b, a)  y = random.randint(-100, self.height)   cloud = Image(source=cloud_type,  pos=(x, y))  self.add_widget(cloud)  self.clouds.append(cloud)   def move_clouds(self, *args):  out_cloud_list = [] # If cloud not in screen remove:  for child in self.children and self.clouds:  if child.pos[0] lt; -50:  out_cloud_list.append(child)   else:  child.pos[0] -= 3   for self.cloud in out_cloud_list:  self.remove_widget(self.cloud)   def init_drone(self):  self.drone = Image(source="images/drone.png",  pos=(100, 300))   self.add_widget(self.drone)  self.drone_coordinates[0] = self.drone.pos   def init_balloons(self, dt):  balloon_types = ["images/yellow_balloon.png", "images/green_balloon.png", "images/purple_balloon.png",  "images/red_balloon.png"]  balloon_type = random.choice(balloon_types)   x = random.randint(100, self.width)  y = random.randint(50, 150)   balloon = Image(source=balloon_type,  pos=(x, y))  self.add_widget(balloon)  self.balloons.append(balloon)   def move_balloons(self):  out_balloon_list = [] # If cloud not in screen remove:  for child in self.children and self.balloons:  if child.pos[0] lt; -50 or child.pos[1] gt; self.height-50:  out_balloon_list.append(child)   else:  child.pos[0] -= 2  child.pos[1]  = 3   for self.balloon in out_balloon_list:  self.remove_widget(self.balloon)   def get_drone_coordinates(self):  x1, y1 = self.drone.pos  self.drone_coordinates[0] = (x1, y1)   x2, y2 = self.drone.pos[0]   self.drone.width, self.drone.pos[1]   self.drone.height  self.drone_coordinates[1] = (x2, y2)   def get_balloon_coordinates(self):  for balloon in self.balloons:  x1, y1 = balloon.pos[0], balloon.pos[1]  self.balloon_coordinates[0] = (x1, y1)   x2, y2 = balloon.pos[0]   balloon.width, balloon.pos[1]   balloon.height  self.balloon_coordinates[1] = (x2, y2)   def check_drone_collect_balloon(self):  self.get_drone_coordinates()  self.get_balloon_coordinates()   drone_xmax, drone_ymax = self.drone_coordinates[1][0], self.drone_coordinates[1][1]   balloon_xmin, balloon_ymin = self.balloon_coordinates[0][0], self.balloon_coordinates[0][1]  balloon_xmax, balloon_ymax = self.balloon_coordinates[1][0], self.balloon_coordinates[1][1]   drone_center_x = drone_xmax - self.drone.width/2  drone_center_y = drone_ymax - self.drone.height/2   if balloon_xmax gt;= drone_center_x gt;= balloon_xmin and balloon_ymax gt;= drone_center_y gt;= balloon_ymin:  for balloon in self.balloons:  self.remove_widget(balloon)   def update(self, dt):  self.move_clouds()  self.move_balloons()  self.check_drone_collect_balloon()   self.drone.pos[1]  = self.current_speed_y  self.drone.pos[0]  = self.current_speed_x  if self.drone.pos[1] lt;= 0:  self.drone.pos[1] = 0   elif self.drone.pos[1] gt;= self.height - 70:  self.drone.pos[1] = self.height - 70   if self.drone.pos[0] lt;= -10:  self.drone.pos[0] = -10   elif self.drone.pos[0] gt;= self.width - 80:  self.drone.pos[0] = self.width - 80  class BalloonGameApp(App):  def build(self):  Window.clearcolor = (.2, .6, .8, 1)  xd = MainWidget()  return xd   BalloonGameApp().run()  

Это весь код моей программы, я пытаюсь увеличить 1 до переменной ОЦЕНКИ каждый раз, когда «собирается»воздушный шар.

 def check_drone_collect_balloon(self):  self.get_drone_coordinates()  self.get_balloon_coordinates()   drone_xmax, drone_ymax = self.drone_coordinates[1][0], self.drone_coordinates[1][1]   balloon_xmin, balloon_ymin = self.balloon_coordinates[0][0], self.balloon_coordinates[0][1]  balloon_xmax, balloon_ymax = self.balloon_coordinates[1][0], self.balloon_coordinates[1][1]   drone_center_x = drone_xmax - self.drone.width/2  drone_center_y = drone_ymax - self.drone.height/2   if balloon_xmax gt;= drone_center_x gt;= balloon_xmin and balloon_ymax gt;= drone_center_y gt;= balloon_ymin:  for balloon in self.balloons:  self.remove_widget(balloon)  

эта функция определяет, когда воздушный шар «собирается», хотя, когда я пытаюсь добавить…

 for balloon in self.balloons:  self.remove_widget(balloon)  self.SCORE  = 1  print(self.SCORE)  

Я бы ожидал, что самость.Переменная ОЦЕНКИ будет увеличиваться на 1 с каждым «собранным» шариком, но происходит то, что значение переменной сильно увеличивается, до 60 или даже 100 или более с каждым удаленным отдельным шариком. Я предполагаю, что это происходит из-за того, что он находится внутри цикла for, но я не совсем понимаю, почему это происходит, поскольку в списке «self.balloons» будет только 1 элемент, т. Е. 1 воздушный шар-в результате только 1 воздушный шар появляется каждые 7 секунд-в нем, поэтому цикл должен запускаться только один раз.

Есть ли какие-либо предложения относительно того, как я мог бы заставить систему подсчета очков работать? Любая помощь будет признательна! Заранее спасибо

Редактировать:

 if balloon_xmax gt;= drone_center_x gt;= balloon_xmin and balloon_ymax gt;= drone_center_y gt;= balloon_ymin:  for balloon in self.balloons:  self.balloons.remove(balloon)  self.remove_widget(balloon)  self.SCORE  = 1  print(self.SCORE)  

Я добавил функцию удаления воздушных шаров из списка self.balloons. Но теперь о себе.Функция ОЦЕНКИ увеличивается в два раза, поэтому с каждым воздушным шаром, который «собран», к счету добавляются два, а не один. Как я мог бы исправить это, не увеличивая себя?ОЦЕНКА на .5

Комментарии:

1. Я не вижу, чтобы какие-либо воздушные шары когда-либо удалялись из self.balloons списка, так что этот список просто продолжает расти.

2. Это имеет смысл, я добавил функцию «self.balloons.remove(воздушный шар)», но теперь сам. ОЦЕНКА увеличивается в два раза, а не один раз, поэтому с каждым «собранным»воздушным шаром добавляется 2 балла