Pause / Resume
Pauza zatrzymuje model w miejscu – konsumuje tę samą grę, nie rozpoczyna nowej.
Pauza zatrzymuje tykanie, a nie rysuje na wierzchu gry biegowej
Klawisz Space przełącza grę między RUNNING
oraz PAUSED:
def toggle_pause(self):
if self.state.status is GameStatus.RUNNING:
self._generation += 1 # natychmiast unieruchamia już zaplanowany tik
self.state.status = GameStatus.PAUSED
self._show_overlay(„PAUZA”, „Space kontynuować”)
elif self.state.status is GameStatus.PAUSED:
self._generation += 1 # Nowe pokolenie – dokładnie jeden świeży łańcuch odkleń
self.state.status = GameStatus.RUNNING
self._clear_overlay()
self._schedule_next_tick()
toggle_pause() nie dotyka state.snake, state.score lub state.food — tylko zmiany status. Restart kontynuuje tę samą grę z tego samego punktu zamiast zaczynać nową.Dlaczego jedna kontrola status nie wystarcza
screen.ontimer(callback, delay_ms) tylko PLANUJE przyszłe
wywołanie — sam fakt, że status zmienione na
PAUSEDnie usuwa już zaplanowanych
callback z kolejki Tkinter: wciąż zostanie wywołany, po prostu nic pożytecznego nie zrobi, jeśli wewnątrz sprawdzić status. Prawie działa — ale nie do końca, a różnica ujawnia się tam, gdzie jest najtrudniej ją zauważyć: co jeśli wznowienie (Resume) stanie się PRZED wywołaniem połączenia
Tik zaplanowany przed przerwą?
status is RUNNING w środku tyka nie łapie tego wyścigu: zanim stary tik w końcu działa, gra jest już RUNNING – test przechodzi, a tik planuje kontynuować, jakby nic się nie stało.Dlatego toggle_pause() zwiększa
self._generation przy KAŻDEJ zmianie — i przy ustawianiu na
Pauza, a przy wznowieniu, nie tylko podczas restartu. Pauza jest paraliżująca
zaplanowane tiknięcie natychmiast, w momencie naciskania Space, nie
Polega na tym, że rozpozna siebie, gdy w końcu zacznie pracować. Odnowienie otrzymuje
posiadanie nowej generacji i planowanie dokładnie jednego nowego odszycia – niezależnie od sieci
istniał wcześniej, już nie żyje.