Лекция · 5.7

Ойын нәтижесін есептеу

Бөлімнің қорытынды сабағы: ойын жасаудың барлық бөлшегін (терезе, фон, кейіпкер, қозғалыс, соқтығысу) біріктіріп, НАҚТЫ нәтижесі бар ойын құрастырамыз. Кез келген ойын соңында бір нәрсе шешілуі керек — ұпай саны, жеңіс немесе жеңіліс. Бұл сабақта «Футболшы» ойынының мысалында ұпай есептеу мен ойынды аяқтау логикасын үйренеміз.

Ойын сценарийі
Анықтама
Кез келген ойынның түпкі идеясында ойыншылардың біреуі жеңу, біреуі жеңілу немесе тең ойнауы керек — ойын белгілі бір қорытынды НӘТИЖЕГЕ жетуі тиіс.

«Футболшы» ойынының мақсаты: футболшы допты басымен қайтарып, допты жерге түсірмей мүмкіндігінше көп ұпай жинау керек. Футболшыға 3 «өмір» беріледі — доп 3 рет жерге түскенде ойын аяқталады. Доп жоғарғы шекараға (қабырғаға) соғылған сайын 1 ұпай қосылады.

Аналогия: нағыз футболда доп аутқа шықса, ойын тоқтамайды — тек қайта беріледі. Компьютерлік ойында да дәл солай: «өмір» — рұқсат етілген қателер саны, ал ұпай — жетістіктің өлшемі.
Ұпайды экранға шығару (font модулі)

Экранда мәтін (ұпай саны, хабарлама) көрсету үшін pygame.font модулі үш қадаммен қолданылады:

# 1. Қаріп нысанын құру
score_font = pygame.font.Font(None, 50)

# 2. Мәтінді суретке (Surface) айналдыру
score_surf = score_font.render(str(score), 1, (0, 0, 0))

# 3. Экранға шығару
screen.blit(score_surf, [10, 10])

Доп футболшыдан немесе жоғарғы қабырғадан серпілгенде, ұпай саны артады және мәтін ҚАЙТА render етіледі — өйткені render() тек сол сәттегі жолдың кескінін жасайды, автоматты жаңармайды.

if self.rect.top <= 0:
    self.speed[1] = -self.speed[1]
    score = score + 1
    score_surf = score_font.render(str(score), 1, (0, 0, 0))
⚠️
Ең жиі қате: score айнымалысын өзгертіп, бірақ score_surf-ты қайта render етпей ұмытып кету — сонда экрандағы сан өзгермей қалады, себебі блитталған сурет ескі күйінде қалады.
«Өмір» мен ойынды аяқтау
Анықтама
lives — ойыншыға берілген қателесу мүмкіндігінің саны. Доп төменгі шекараға жеткен сайын lives бірге азаяды; lives == 0 болғанда ойын аяқталады.
if myBall.rect.top >= screen.get_rect().bottom:
    lives = lives - 1
    if lives == 0:
        final_text2 = "Upailarsany: " + str(score)
        ft2_font = pygame.font.Font(None, 50)
        ft2_surf = ft2_font.render(final_text2, 1, (255, 0, 0))
        screen.blit(ft2_surf, [screen.get_width()/2 - ft2_surf.get_width()/2, 200])
        pygame.display.flip()
        done = True
    else:
        pygame.time.delay(1000)
        myBall.rect.topleft = [50, 50]

Мұнда screen.get_width()/2 - ft2_surf.get_width()/2 формуласы мәтінді экранның дәл ортасына (горизонталь бойынша) орналастыру үшін қолданылады — мәтіннің жарты ені экран ортасынан алынып тасталады.

🎯 ҰБТ байланысы
Ойын нәтижесін есептеу — 2D ойын блогының қорытынды тақырыбы.
1
font.render() әр рет ЖАҢА мәтін суретін жасайды, ескісін автоматты жаңартпайды.
2
lives==0 шарты — ойынды аяқтаудың негізгі белгісі.
3
Мәтінді ортаға келтіру формуласы: экран ені/2 − мәтін ені/2.
Сабақ қорытындысы
  • pygame.font модулі: Font() → render() → blit() — үш қадам.
  • Ұпай (score) мен өмір (lives) — ойын нәтижесінің екі негізгі көрсеткіші.
  • Ұпай өзгерген сайын мәтінді ҚАЙТА render ету керек.
  • lives==0 — ойынды аяқтап, қорытынды нәтижені экранға шығару шарты.