Screen(the game) flickers the hole time in the console

import os 
import time
import random
import msvcrt


# play ground
WIDTH = 50
HEIGHT = 20


PLAYER = "U"
BOMB= "*"
EMPTY= "."
FOOD="$"
FREEZ="§"
follow_person="V"
live=2
bombs=[]
player_pos = [HEIGHT - 2, WIDTH // 2]
freeZ=[]
nfood=[]
# Directions (dy, dx)
UP = (-1, 0)
DOWN = (1, 0)
LEFT = (0, -1)
RIGHT = (0, 1)

running =True

def getkey(screen):
    
    key = screen.getch()
    if key != -1:
        return chr(key)
    return None


def game():

    global running
    global live
    global player_pos
    global follow_pers_pos2
    direction=None
    score=0
    max_score=5
    food=gift()
    bombs=bom()
    freeZ=frez()
    follow_pers_pos2=sec_player()
    score_player2=0
    max_score_player2=10

    screen = Screen()
    
    #curses.curs_set(0)
    
    Screen.keypad(True)
    screen.timeout(50)
    
    try:
         
        while True and live>0:
         
         clear_screen()
         border(screen)
         time.sleep(0.2)
         field(screen)
         
         screen.addch(player_pos[0], player_pos[1], PLAYER)
         screen.addch(follow_pers_pos2[0], follow_pers_pos2[1], follow_person)
         screen.addch(food[0], food[1],FOOD)
# ChatGPt hat geholfen um das food zu generiern bzw. platzieren 
         screen.addstr(0,25,f"Dein Score: {score}")
         screen.addstr(0,10,f"Leben: {live}")
         screen.addstr(HEIGHT,0,"Seien Sie schneller als 'Golosino'und sammeln mind. 3$")
         for bomb in bombs:
          screen.addch(bomb[0],bomb[1],"*")
         for fres in freeZ:
          screen.addch(fres[0],fres[1],FREEZ)
         
         screen.refresh()

         key = getkey(screen)
         if key:
            if key == "w":
                direction = UP
            elif key == "s":
                direction = DOWN
            elif key == "a":
                direction = LEFT
            elif key == "d":
                direction = RIGHT
# Z.87 bis 96 Quelle Herr Prof.Dok.Nierhoff und so geaendert dass es fuers game passt

         new_pos = player_pos.copy()
         if direction:
             new_pos = [player_pos[0] + direction[0],player_pos[1] + direction[1]]
# Z. 99 bis Z. 101 Loesung dieses Problems von ChatGPT 

         if 0 < new_pos[0] < HEIGHT - 1 and 0 < new_pos[1] < WIDTH - 1:
                    player_pos = new_pos
         for food in nfood:
             if food==player_pos:  
                 nfood.remove(food)
                 score=score+1
                 food=[random.randint(2, HEIGHT - 2), random.randint(2, WIDTH - 2)]  
                 nfood.append(food)
             
         for food in nfood:
             dis=[abs(follow_pers_pos2[0]-food[0]),abs(follow_pers_pos2[1]-food[1])]
           
         if dis[0] != 0 or dis[1] != 0:
             if follow_pers_pos2[0] < food[0]:
                 follow_pers_pos2[0] += 1
             elif follow_pers_pos2[0] > food[0]:
                 follow_pers_pos2[0] -= 1
             if follow_pers_pos2[1] < food[1]:
                 follow_pers_pos2[1] +=1
             elif follow_pers_pos2[1] > food[1]:
                 follow_pers_pos2[1] -= 1
        
             dis=[abs(follow_pers_pos2[0]-food[0]),abs(follow_pers_pos2[1]-food[1])]
             if dis[0]==0 and dis[1]==0:
                nfood.remove(food)
                score_player2=score_player2+1
                food=[random.randint(2, HEIGHT - 2), random.randint(2, WIDTH - 2)]  
                nfood.append(food)
                if score_player2==max_score_player2:
                   clear_screen()
                   print(" BOOOOOH Golosino won , you are Bot! ")
                   break
                 
         if score>=3:
               screen.timeout(25)  
         if score == max_score:
            break
            
         for nbombs in bombs:
             if nbombs ==player_pos:
               bombs.remove(nbombs)
               live-=1
               score-=1
               nbombs=[random.randint(2, HEIGHT - 2), random.randint(2, WIDTH - 2)]
               bombs.append(nbombs)
               if score <0:
                 break
               if live==0:
                  break

         for fres in freeZ:
          if fres!=(HEIGHT - 2, WIDTH // 2):
              if fres ==player_pos:
                freeZ.remove(fres)
                fres = [random.randint(2, HEIGHT - 2), random.randint(2, WIDTH - 2)]
                freeZ.append(fres)
                time.sleep(5)

         new_pos2 = [follow_pers_pos2[0],follow_pers_pos2[1]]
         if 0 < new_pos2[0] < HEIGHT - 2 and 0 < new_pos2[1] < WIDTH - 2:
                    follow_pers_pos2 = new_pos2

                
    finally:
     clear_screen()
     if  score<3 and live==0:
      print("Game Over!")
     elif 3<=score<5 and live==0:
        print(f"You won level_1 ! your Score: {score}")
     elif score==5:
        print(f"You won last-level ! your Score: {score}")
   

def clear_screen():
    os.system('cls')
def get_key():
    if msvcrt.kbhit():
        return msvcrt.getch().decode("utf-8").lower()
    return None

def border(screen):
 
    for x in range(1,WIDTH):
        screen.addch(1, x, "#") 
        screen.addch(HEIGHT - 1, x, "#")
    for y in range(1,HEIGHT):
       screen.addch(y,0,"#")
       screen.addch(y,WIDTH-1,"#")

def field(screen):
    for y in range(2,HEIGHT-1):
        for x in range(1,WIDTH-1):
         screen.addch(y, x, EMPTY) 
        
def gift():
    while True:  
     food=[random.randint(2, HEIGHT - 2), random.randint(2, WIDTH - 2)]
     nfood.append(food)
     if food !=(HEIGHT - 2, WIDTH // 2):
        return food
     

def bom(): 
   while True:
     for _ in range(20):
      nbombs=[random.randint(2, HEIGHT - 2), random.randint(2, WIDTH - 2)]
      bombs.append(nbombs)
     return bombs
# def bom funktion von ChatGPT

def sec_player():
    while True:
        follow_pers_pos2=[random.randint(2, HEIGHT - 2), random.randint(2, WIDTH - 2)]
        if follow_pers_pos2 !=(HEIGHT - 2, WIDTH // 2) and follow_pers_pos2!=bombs:
         return follow_pers_pos2
  
def frez(): 
   while True:
     for _ in range(5):
      freez=[random.randint(2, HEIGHT - 2), random.randint(2, WIDTH - 2)]
      freeZ.append(freez)
     return freeZ
      
class Screen: 
   def render(self):
        # Simuliert das Darstellen auf dem Bildschirm
        print("\033[H", end="")  # Cursor zurücksetzen (ANSI)
        for row in self.buffer:
            print("".join(row))
        print("\033[H", end="")
   
   

if __name__ == "__main__":
 
 game()   

Thank you ver much 

You call cls each time around the loop.
That is causing the flicker.

If you want to avoid flickering change the code to update the screen without clearing it first.

This means you need to know what changes each time around the loop. Then you need to overwrite any position on the screen that has changed.

1 Like