Найти - Пользователи
Полная версия: Как сделать медленное (плавное) движение фишки?
Начало » Python для новичков » Как сделать медленное (плавное) движение фишки?
1
IgorDubkov
Здравствуйте!
Змейка…
Красота пока не нужна. Хочется более детального движения фишки. Логика тоже вызывает вопросы.
Подскажите, пожалуйста, в правильном направлении работаем?
Спасибо!
 # импорт библиотек
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()
IgorDubkov
Игра в логике готова. Подскажите, пожалуйста,
как организовать медленное движение фишек?
Спасибо!


 # импорт библиотек
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()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB