Форум сайта python.su
Здравствуйте!
Змейка…
Красота пока не нужна. Хочется более детального движения фишки. Логика тоже вызывает вопросы.
Подскажите, пожалуйста, в правильном направлении работаем?
Спасибо!
# импорт библиотек import pygame import random import os # ввод констант WIDTH = 700 HEIGHT = 700 FPS = 60 WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) YELLOW = (255, 255, 0) KOORD = ((30, 665), (108, 653), (177, 647), (251, 648), (322, 642), (390, 641), (462, 648), (528, 653), (601, 659), (674, 656), (669, 584), (602, 583), (527, 577), (460, 569), (392, 573), (322, 571), (249, 577), (179, 576), (108, 573), (33, 582), (33, 509), (111, 510), (181, 508), (253, 505), (322, 503), (389, 501), (462, 505), (531, 503), (603, 515), (671, 515), (669, 439), (600, 444), (522, 436), (460, 434), (386, 435), (318, 435), (246, 442), (178, 440), (103, 437), (37, 440), (32, 374), (107, 372), (178, 373), (245, 371), (320, 370), (387, 371), (468, 372), (527, 367), (603, 370), (670, 369), (669, 296), (598, 296), (531, 302), (466, 306), (385, 304), (318, 304), (247, 305), (180, 302), (106, 305), (31, 306), (35, 235), (108, 234), (178, 234), (249, 234), (319, 233), (388, 234), (454, 236), (524, 237), (602, 234), (666, 233), (663, 166), (593, 171), (523, 169), (454, 166), (385, 167), (315, 166), (244, 167), (181, 167), (109, 168), (38, 165), (35, 100), (112, 103), (180, 106), (252, 101), (320, 99), (389, 98), (457, 96), (523, 97), (587, 101), (665, 98), (662, 33), (586, 32), (522, 32), (454, 33), (379, 31), (315, 34), (247, 36), (175, 36), (107, 38), (41, 38)) # создание игры и окна pygame.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Змеи и лестницы") clock = pygame.time.Clock() font_name = pygame.font.match_font('arial') game_folder = os.path.dirname(__file__) # загрузка игровой графики background = pygame.image.load(os.path.join(game_folder, 'pole.png')).convert() background_rect = background.get_rect() def draw_text(surf, text, size, x, y): """пишет текст в цикле игры""" font = pygame.font.Font(font_name, size) text_surface = font.render(text, True, BLACK, WHITE) text_rect = text_surface.get_rect() text_rect.midtop = (x, y) surf.blit(text_surface, text_rect) def key(param): """Отработка нажатия на пробел""" resp = False keys = pygame.key.get_pressed() if keys[param]: resp = True return resp def open_game(): """Начальная заставка игры""" draw_text(screen, "ЗМЕИ И ЛЕСТНИЦЫ", 64, WIDTH / 2, HEIGHT / 4) draw_text(screen, "Игра с кубиком", 64, WIDTH / 2, HEIGHT / 2) draw_text(screen, "Нажми кнопку s", 64, WIDTH / 2, HEIGHT * 3 / 4) if key(pygame.K_s): Loop.flag_begin = False Loop.flag_gamer_turn = True def victor(): """Заставка победа и выход в начало""" draw_text(screen, "Победил {} игрок!".format(Loop.flag_vic), 64, WIDTH / 2, HEIGHT / 4) draw_text(screen, "Нажми кнопку f", 44, WIDTH / 2, HEIGHT / 2) if key(pygame.K_f): player.index = 0 player1.index = 0 player.rect.center = KOORD[player.index] player1.rect.center = KOORD[player1.index] Loop.flag_begin = True Loop.flag_gamer_turn = False Loop.flag_vipalo = False Loop.flag_hod = False Loop.flag_victor = False class Player(pygame.sprite.Sprite): """Основной класс для игроков""" def __init__(self, color, name): pygame.sprite.Sprite.__init__(self) self.name = name self.image = pygame.Surface((20, 20)) self.image.fill(color) self.rect = self.image.get_rect() self.index = 0 self.rect.center = KOORD[self.index] def brosok(self): """Игрок бросает кубик""" draw_text(screen, "{} игрок бросает кубик".format(self.name), 44, WIDTH / 2, HEIGHT / 4) draw_text(screen, "Нажми кнопку d", 44, WIDTH / 2, HEIGHT / 2) if key(pygame.K_d): self.kubik = random.randint(1, 6)#int(input("input")) Loop.flag_gamer_turn = False Loop.flag_vipalo = True def vipalo(self): """Заставка выпало на кубике""" draw_text(screen, "Выпадает {}".format(self.kubik), 64, WIDTH / 2, HEIGHT / 4) draw_text(screen, "Нажми кнопку c", 44, WIDTH / 2, HEIGHT / 2) if key(pygame.K_c): Loop.flag_vipalo = False Loop.flag_hod = True def hod(self): """Движение фишки""" def foo(): nonlocal x, x1, y, y1 if x!=x1 or y!=y1: if x!=x1: if x<x1: x += 1 elif x>x1: x -= 1 if y!=y1: if y<y1: y += 1 elif y>y1: y -= 1 self.rect.center = x, y foo() if self.kubik: if self.index==98: Loop.flag_vic = self.name Loop.flag_hod = False Loop.flag_victor = True x, y = KOORD[self.index] x1, y1 = KOORD[self.index + 1] foo() print(self.index) self.index += 1 self.kubik -= 1 else: self.turner() Loop.flag_hod = False Loop.flag_gamer_turn = True def turner(self): """Переход хода""" if Loop.flag_turn==1: Loop.flag_turn = 2 else: Loop.flag_turn = 1 class Loop: """Здесь будем хранить флаги цикла игры""" flag_begin = True flag_gamer_turn = False flag_vipalo = False flag_hod = False flag_turn = 1 flag_victor = False flag_vic = None player = Player(GREEN, "Первый") player1 = Player(RED, "Второй") all_sprites = pygame.sprite.Group() all_sprites.add(player, player1) # цикл игры running = True while running: # скорость цикла clock.tick(FPS) # контроль выхода крестиком for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # рендеринг screen.blit(background, background_rect) all_sprites.draw(screen) # начальная заставка if Loop.flag_begin: open_game() # заставка бросок игрока if Loop.flag_gamer_turn: if Loop.flag_turn==1: player.brosok() else: player1.brosok() # заставка выпало if Loop.flag_vipalo: if Loop.flag_turn==1: player.vipalo() else: player1.vipalo() # ход игрока if Loop.flag_hod: if Loop.flag_turn==1: player.hod() else: player1.hod() # заставка победа if Loop.flag_victor: victor() # переворот экрана pygame.display.flip() # выход из игры pygame.quit()
Прикреплённый файлы:
pole.png (845,4 KБ)
Офлайн
Игра в логике готова. Подскажите, пожалуйста,
как организовать медленное движение фишек?
Спасибо!
# импорт библиотек import pygame import random import os # ввод констант WIDTH = 700 HEIGHT = 700 FPS = 60 WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) YELLOW = (255, 255, 0) KOORD = ((30, 665), (108, 653), (177, 647), (251, 648), (322, 642), (390, 641), (462, 648), (528, 653), (601, 659), (674, 656), (669, 584), (602, 583), (527, 577), (460, 569), (392, 573), (322, 571), (249, 577), (179, 576), (108, 573), (33, 582), (33, 509), (111, 510), (181, 508), (253, 505), (322, 503), (389, 501), (462, 505), (531, 503), (603, 515), (671, 515), (669, 439), (600, 444), (522, 436), (460, 434), (386, 435), (318, 435), (246, 442), (178, 440), (103, 437), (37, 440), (32, 374), (107, 372), (178, 373), (245, 371), (320, 370), (387, 371), (468, 372), (527, 367), (603, 370), (670, 369), (669, 296), (598, 296), (531, 302), (466, 306), (385, 304), (318, 304), (247, 305), (180, 302), (106, 305), (31, 306), (35, 235), (108, 234), (178, 234), (249, 234), (319, 233), (388, 234), (454, 236), (524, 237), (602, 234), (666, 233), (663, 166), (593, 171), (523, 169), (454, 166), (385, 167), (315, 166), (244, 167), (181, 167), (109, 168), (38, 165), (35, 100), (112, 103), (180, 106), (252, 101), (320, 99), (389, 98), (457, 96), (523, 97), (587, 101), (665, 98), (662, 33), (586, 32), (522, 32), (454, 33), (379, 31), (315, 34), (247, 36), (175, 36), (107, 38), (41, 38)) # создание игры и окна pygame.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Змеи и лестницы") clock = pygame.time.Clock() font_name = pygame.font.match_font('arial') game_folder = os.path.dirname(__file__) # загрузка игровой графики background = pygame.image.load(os.path.join(game_folder, 'pole.png')).convert() background_rect = background.get_rect() def draw_text(surf, text, size, x, y): """пишет текст в цикле игры""" font = pygame.font.Font(font_name, size) text_surface = font.render(text, True, BLACK, WHITE) text_rect = text_surface.get_rect() text_rect.midtop = (x, y) surf.blit(text_surface, text_rect) def key(param): """Отработка нажатия на пробел""" resp = False keys = pygame.key.get_pressed() if keys[param]: resp = True return resp def open_game(): """Начальная заставка игры""" draw_text(screen, "ЗМЕИ И ЛЕСТНИЦЫ", 64, WIDTH / 2, HEIGHT / 4) draw_text(screen, "Игра с кубиком", 64, WIDTH / 2, HEIGHT / 2) draw_text(screen, "Нажми кнопку s", 64, WIDTH / 2, HEIGHT * 3 / 4) if key(pygame.K_s): Loop.flag_begin = False Loop.flag_gamer_turn = True def victor(): """Заставка победа и выход в начало""" draw_text(screen, "Победил {} игрок!".format(Loop.flag_vinner), 64, WIDTH / 2, HEIGHT / 4) draw_text(screen, "Нажми кнопку f", 44, WIDTH / 2, HEIGHT / 2) if key(pygame.K_f): player.index = 0 player1.index = 0 player.rect.center = KOORD[player.index] player1.rect.center = KOORD[player1.index] Loop.flag_begin = True Loop.flag_gamer_turn = False Loop.flag_vipalo = False Loop.flag_hod = False Loop.flag_victor = False def sdvig(): x, y = KOORD[player.index] x += 10 player.rect.center = x, y class Player(pygame.sprite.Sprite): """Основной класс для игроков""" def __init__(self, color, name): pygame.sprite.Sprite.__init__(self) self.name = name self.image = pygame.Surface((20, 20)) self.image.fill(color) self.rect = self.image.get_rect() self.index = 0 self.rect.center = KOORD[self.index] def brosok(self): """Игрок бросает кубик""" draw_text(screen, "{} игрок бросает кубик".format(self.name), 44, WIDTH / 2, HEIGHT / 4) draw_text(screen, "Нажми кнопку d", 44, WIDTH / 2, HEIGHT / 2) if key(pygame.K_d): self.kubik = random.randint(1, 6) #self.kubik = int(input("input")) Loop.flag_gamer_turn = False Loop.flag_vipalo = True def vipalo(self): """Заставка выпало на кубике""" draw_text(screen, "Выпадает {}".format(self.kubik), 64, WIDTH / 2, HEIGHT / 4) draw_text(screen, "Нажми кнопку c", 44, WIDTH / 2, HEIGHT / 2) if key(pygame.K_c): Loop.flag_vipalo = False Loop.flag_hod = True def hod(self): """Движение фишки""" def foo(x, y, x1, y1): #### delete #### nonlocal x, x1, y, y1 if x!=x1 or y!=y1: if x!=x1: if x<x1: x += 1 elif x>x1: x -= 1 if y!=y1: if y<y1: y += 1 elif y>y1: y -= 1 #print("self.rect.center x={} y{}".format(x, y)) self.rect.center = x, y foo(x, y, x1, y1) def foo1(kort, delta): for self.index in kort: print("self.index = ",self.index) x, y = KOORD[self.index] x1, y1 = KOORD[self.index + delta] foo(x, y, x1, y1) self.index += delta if self.kubik: if self.index==98: Loop.flag_vinner = self.name Loop.flag_hod = False Loop.flag_victor = True print("{} kub {} index {}".format(self.name, self.kubik, self.index)) x, y = KOORD[self.index] x1, y1 = KOORD[self.index + 1] foo(x, y, x1, y1) self.index += 1 self.kubik -= 1 elif self.index==4: self.index = 14 self.rect.center = KOORD[self.index] elif self.index==8: foo1((8, 7, 6), -1) elif self.index==9: foo1((9, 10, 29), 1) elif self.index==17: foo1((17, 1, 2), 1) elif self.index==23: foo1((23, 37, 40), 1) elif self.index==32: foo1((32, 47, 52, 67, 72, 86), 1) elif self.index==33: foo1((33, 27, 12), 1) elif self.index==39: foo1((39, 20, 21), 1) elif self.index==40: foo1((40, 59, 60, 78), 1) elif self.index==50: foo1((50, 49), -1) elif self.index==56: foo1((56, 64, 73), 1) elif self.index==61: foo1((61, 57, 43, 44, 34, 25, 23), 1) elif self.index==83: self.index = 95 self.rect.center = KOORD[self.index] elif self.index==89: self.index = 91 self.rect.center = KOORD[self.index] elif self.index==93: foo1((93, 86, 73, 66, 65, 54), 1) elif self.index==97: foo1((97, 82, 77), 1) else: print("Stop on ", self.index) self.turner() Loop.flag_hod = False Loop.flag_gamer_turn = True def turner(self): """Переход хода""" if Loop.flag_turn==1: Loop.flag_turn = 2 else: Loop.flag_turn = 1 class Loop: """Здесь будем хранить флаги цикла игры""" flag_begin = True flag_gamer_turn = False flag_vipalo = False flag_hod = False flag_turn = 1 flag_victor = False flag_vinner = None player = Player(GREEN, "Первый") player1 = Player(RED, "Второй") all_sprites = pygame.sprite.Group() all_sprites.add(player, player1) # цикл игры running = True while running: # скорость цикла clock.tick(FPS) # контроль выхода крестиком for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # рендеринг screen.blit(background, background_rect) all_sprites.draw(screen) # начальная заставка if Loop.flag_begin: open_game() # заставка бросок игрока if Loop.flag_gamer_turn: if Loop.flag_turn==1: player.brosok() else: player1.brosok() # заставка выпало if Loop.flag_vipalo: if Loop.flag_turn==1: player.vipalo() else: player1.vipalo() # ход игрока if Loop.flag_hod: if Loop.flag_turn==1: player.hod() else: player1.hod() # сдвиг фишек в одной клетке if player.index==player1.index: sdvig() # заставка победа if Loop.flag_victor: victor() # переворот экрана pygame.display.flip() # выход из игры pygame.quit()
Офлайн