Не получается реализовать перемещение моба по платформе

Всем доброго дня, вот не могу сообразить как мне реализовать возможность перемещение спрайта моба по платформе списка lavel. Список читается и выводится успешно на экран вот этим кодом

x = 0
y = 0

for row in lavel:
    for col in row:
        if col == '-':
            platfornome (x,y) #Строим платформы в режиме онлайн
        elif col == '+':
            hililka (x,y)
        elif col == '$':
                
            bar = Mob(x,y)   #Координаты платформы
            all_sprites.add(bar)  
            barmalei.add(bar)

        x += 40
    x = 0
    y += 40

Возможно я ошибаюсь но вот я такой способ построил. То есть если строка
col == " " тогда self.vel.x += 0.5 в противному если строка col == ‘-’ self.vel.x -= 0.5 .
В итоге работы

   #Движения
    def update(self):

        #Защита от проваливания моба сквозь платформу
        #Нужно извлечь переменную из функции вызывающую мобов 
        #И поместить в место переменной bar
        hits = pygame.sprite.spritecollide(bar ,platforms, False)
        if bar.vel.y > 0:        
            if hits:
                self.vel.y = 0
                self.pos.y = hits[0].rect.top + 1
         #свойства движение в зад назад
        #если строка col == " " тогда self.vel.x += 0.5 в противному случае если строка 
        #col ==  тогда  self.vel.x -= 0.5

                self.vel.x += 0.5
                if col == ' ':
                   self.vel.x = 0
                   if col == '-':
                      self.vel.x -= 0.5
                       #if col < '-':
                       #   self.vel.x += 0.5

Моб бежит падает потом снова бежит по платформам куда то в даль и не что его остановить не может. Пробовал проверять значения какие приходят на col тесть ставил col = ’ ’ во всех условиях и соответственно мой моб вставал как в копанный на платформе. То есть не перемещался. В общем все перепробовал не получается. Для целостности картины ниже код игры привожу.

import pygame
from pygame.locals import *
import sys
import random
import clasiki
import array

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
 
pygame.init()
vec = pygame.math.Vector2 #2 for two dimensional
 
WIDTH = 1400  # Длина сцены
HEIGHT = 750 #Высота сцены
ACC = 0.5
FRIC = -0.12
FPS = 60
 
FramePerSec = pygame.time.Clock()
 
displaysurface = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Палигон отработки решений")

DOG = 0


#Класс персонажа
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        #self.image = pygame.image.load("character.png")
        self.surf = pygame.Surface((40, 60))
        self.surf.fill((128,255,40))
        self.rect = self.surf.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 200
        self.pos = vec((300, 360))
        self.vel = vec(0,0)
        self.acc = vec(0,0)
 
    def move(self):
        self.acc = vec(0,0.5)
    
        pressed_keys = pygame.key.get_pressed()
                
        if pressed_keys[K_LEFT]:
            self.acc.x = -ACC
        if pressed_keys[K_RIGHT]:
            self.acc.x = ACC
                
        self.acc.x += self.vel.x * FRIC
        self.vel += self.acc
        self.pos += self.vel + 0.5 * self.acc
        
        if self.pos.x > WIDTH:
            self.pos.x = 0
        if self.pos.x < 0:
            self.pos.x = WIDTH
            
        self.rect.midbottom = self.pos
 
    def jump(self):
        hits = pygame.sprite.spritecollide(self, platforms, False)
        if hits:
           self.vel.y = -15
 
 
    def update(self):
        hits = pygame.sprite.spritecollide(P1 ,platforms, False)
        if P1.vel.y > 0:       
            if hits:
                self.vel.y = 0
                self.pos.y = hits[0].rect.top + 1

    #------------------------------------------------------

     # обработка выстрела

    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)

    #--------------------------------------------------------

 #Клас платформы
class platform(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.surf = pygame.Surface((WIDTH, 20))
        self.surf.fill((255,0,0))
        self.rect = self.surf.get_rect(center = (WIDTH/2, HEIGHT - 10))
 
    def move(self):
        pass







#Класс преграды для персанажа
class pregrada(pygame.sprite.Sprite):
    def __init__(self,zx,zy):
        super().__init__()
        self.surf = pygame.Surface((40, 40))
        self.surf.fill((BLUE))
        self.rect = self.surf.get_rect()

        self.rect.x = zx
        self.rect.y = zy
        
    def move(self):
       pass





#Лечилка   появляется в случайном месте карты игры
class hil(pygame.sprite.Sprite):
    def __init__(self,zx,zy):
        super().__init__()
        self.surf = pygame.Surface((40, 40))
        self.surf.fill((WHITE))
        self.rect = self.surf.get_rect()
        self.rect.x = zx
        self.rect.y = zy
        
    def move(self):
       pass


#Класс выстрелов

class Bullet(pygame.sprite.Sprite):
    def __init__(self, zx, zy):
        super().__init__()
        self.surf = pygame.Surface((40, 40))
        self.surf.fill((WHITE))
        self.rect = self.surf.get_rect()
        self.rect.x = zx
        self.rect.y = zy
    #полёт пуль
    def update(self):
        self.rect.y += self.speedy
        # убить, если он заходит за верхнюю часть экрана
        if self.rect.bottom < 0:
            self.kill()

#Мобы
class Mob(pygame.sprite.Sprite):
    def __init__(self,zx,zy):
        super().__init__()
        #self.image = pygame.image.load("character.png")
        self.surf = pygame.Surface((40, 60))
        self.surf.fill((RED))
        self.rect = self.surf.get_rect()

        

        self.pos = vec((zx, zy))
        self.vel = vec(0,0)
        self.acc = vec(0,0)
        self.engage = False

        #Гравитайия действующая на моба
    def move(self):
        self.acc = vec(0,0.5)



        pressed_keys = pygame.key.get_pressed()

        self.acc.x += self.vel.x * FRIC
        self.vel += self.acc
        self.pos += self.vel + 0.5 * self.acc
        
        #if self.pos.x > col:
        #    self.pos.x = 0
        #if self.pos.x < 0:
        #    self.pos.x = col
            
        self.rect.midbottom = self.pos
       


    #Движения
    def update(self):

        #Защата от провалеваниея моба сквозь платформу
        #Нужно извлеч переменную из функции вызыыввающию мобов 
        #И поместить в место переменной bar
        hits = pygame.sprite.spritecollide(bar ,platforms, False)
        if bar.vel.y > 0:        
            if hits:
                self.vel.y = 0
                self.pos.y = hits[0].rect.top + 1
         #свойства движение в зад назад
        #если строка col == " " тогда self.vel.x += 0.5 в противному случае если строка 
        #col ==  тогда  self.vel.x -= 0.5

                self.vel.x += 0.5
                if col == ' ':
                   self.vel.x = 0
                   if col == '-':
                      self.vel.x -= 0.5
                       #if col < '-':
                       #   self.vel.x += 0.5



                #if self.vel.x < 0 and not self.engage:
                #    if self.rect.right >= platforms.rect.right:
                #        self.vel = vec(-3, 0)  # Reverse the horizontal velocity.
                #elif self.vel.x < 0 and not self.engage:
                #    if self.rect.left <= platforms.rect.left:
                #        self.vel = vec(3, 0)  # Reverse the horizontal velocity.

PT1 = platform()
P1 = Player()

all_sprites = pygame.sprite.Group()

all_sprites.add(PT1)
all_sprites.add(P1)


platforms = pygame.sprite.Group()

barmalei = pygame.sprite.Group()

hilila = pygame.sprite.Group()

pre = pygame.sprite.Group()
#Группа выстрилов
bullets = pygame.sprite.Group()


platforms.add(PT1)

#Функции и всякая ерунда
#Функция посроения платформ

def platfornome (x,y):
    K = pregrada(x,y)   #Кардинаты платформы
    all_sprites.add(K)  
    platforms.add(K)

#Функция размещение хила
def hililka (x,y):
    K = hil(x,y)   #Кардинаты платформы
    all_sprites.add(K)  
    hilila.add(K)

#Функция размещение врага

#def vrag (x,y):
#    global bar
#    bar = Mob(x,y)   #Кардинаты платформы
#    all_sprites.add(bar)  
#    barmalei.add(bar)
#    global bar

#####################################################

"""
        -   это платформа (реализовано)
        +   это хилилка (реализована )
        $   это враг
        #   это жуть при соприкосновение игра заканчивается
        p   место появление перса

"""    
#Карата уравня 1
lavel = [
           "                                   ",
           "                                   ",
           "                                   ",
           "                                   ",
           "                                   ",
           "                                  ",
           "                                   ",
           "                       $           ",
           "                  --------         ",
           "                                   ",
           "                                   ",
           "                                   ",
           "    -----------                    ",
           "                                   ",
           "                                   ",
           "                 ---               ",
           "                                   ",
           "                                   ",
           "-----------------------------------"]

#Построение уровня

x = 0
y = 0

for row in lavel:
    for col in row:
        if col == '-':
            platfornome (x,y) #Строим платформы в режиме онлаин
        elif col == '+':
            hililka (x,y)
        elif col == '$':
                
            bar = Mob(x,y)   #Кардинаты платформы
            all_sprites.add(bar)  
            barmalei.add(bar)

        x += 40
    x = 0
    y += 40

##########################################################
 
 
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            #Обработка событий 
            #Событие прыжка перса
            if event.key == pygame.K_SPACE:
                P1.jump()  

            #Событие выстрела перса
            elif event.key == pygame.K_KP_ENTER:
                P1.shoot()

    displaysurface.fill((0,0,0))
    all_sprites.update()

    for entity in all_sprites:
        displaysurface.blit(entity.surf, entity.rect)
        entity.move()
    pygame.display.flip()
    #pygame.display.update()
    FramePerSec.tick(FPS)

непонятно что за ' ' и '-'.
И в коде ниже нигде не создана переменная col.

В переменную col записываются значение строк массива Lavel “Карты игры” . ’ ’ - это обозначается пустота а вот ‘-’ это ужа сама платформа. То есть for листает сначала строки столбцы row после чего считывает значения по строчно значення записывая в переменную col после чего записывая значения кардинат положения платформы в x, y. Ну и рисует далее по этим координатам спрайт.

#Карата уравня 1
lavel = [
           "                                   ",
           "                                   ",
           "                                   ",
           "                                   ",
           "                                   ",
           "                                  ",
           "                                   ",
           "                       $           ",
           "                  --------         ",
           "                                   ",
           "                                   ",
           "                                   ",
           "    -----------                    ",
           "                                   ",
           "                                   ",
           "                 ---               ",
           "                                   ",
           "                                   ",
           "-----------------------------------"]

#Построение уровня

x = 0
y = 0

for row in lavel:
    for col in row:
        if col == '-':
            platfornome (x,y) #Строим платформы в режиме онлаин
        elif col == '+':
            hililka (x,y)
        elif col == '$':
                
            bar = Mob(x,y)   #Кардинаты платформы
            all_sprites.add(bar)  
            barmalei.add(bar)

        x += 40
    x = 0
    y += 40

Так а с движением как это связано, как оно должно работать?

в

не листает.

По задумки с каждым циклом работы self.vel.x -= 0.5 значения уменьшается на 0.5 пикселя. Ровно до тех пор пока значение переменной col будит равно пустому значению ’ '. После чего self.vel.x += 0.5 увеличивает координату спрайта на 0.5 пикселя. Вот груба говоря так работает программа, то есть def update(self): задаёт координату х отрисовывая уменьшая на 0.5 пикселя ровно до того момента пока не будет край платформы, после чего он увеличивает на 0.5 пикселя до того момента пока значения col снова не будет ’ ’ то есть пустота.

Так где вы видите col в том месте? Если технически переменная с таким именем там и существует, то это будет просто значение с последней итерации того цикла.
Python | Область видимости переменных

for i in range(0, 10):
    print(i)

def f():
    print('f:')
    print(i) # 9
    
f()

Да и мобу ж видимо надо не каждый рах все ячейки смотреть, а запоминать позицию своей текущей ячейки и смотреть что в той ячейке, куда он хочет пойти.