Всё просто
У вас движение игрока привязано к частоте обновления игры, т.е. чаще обновляется - чаще двигается - быстрее перемещается
Исправить это можно домножив скорость игрока на задержку между обновлениями, вот так
delay = 20
pygame.time.delay(delay)
pos += speed * delay
Тем самым мы получаем, что игрок всегда двигается со скорость speed в миллисекунду
Итоговый код
import pygame
pygame.init();
win = pygame.display.set_mode((320,320));
pygame.display.set_caption("Game")
x = 144
y = 144
width = 32
height = 32
speed = 5
delay = 20
run = True
while run:
pygame.time.delay(delay)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_UP]:
y-=speed*delay
if keys[pygame.K_LEFT]:
x-=speed*delay
if keys[pygame.K_RIGHT]:
x+=speed*delay
if keys[pygame.K_DOWN]:
y+=speed*delay
win.fill((0,0,0))
pygame.draw.rect(win, (0,0,255), (x,y,width,height))
pygame.display.update()
pygame.quit()
Но можно сделать ещё лучше
Можно напрямую указывать фпс, который будет контролироваться pygame
import pygame
pygame.init();
win = pygame.display.set_mode((320,320));
pygame.display.set_caption("Game")
fps = 60
fps_clock = pygame.time.Clock()
x = 144
y = 144
width = 32
height = 32
speed = 5
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_UP]:
y-=speed
if keys[pygame.K_LEFT]:
x-=speed
if keys[pygame.K_RIGHT]:
x+=speed
if keys[pygame.K_DOWN]:
y+=speed
win.fill((0,0,0))
pygame.draw.rect(win, (0,0,255), (x,y,width,height))
pygame.display.update()
fps_clock.tick(fps)
pygame.quit()