首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python/Pygame为什么精灵不能移动?

Python/Pygame为什么精灵不能移动?
EN

Stack Overflow用户
提问于 2014-06-26 06:17:07
回答 1查看 213关注 0票数 -1

我的代码应该在计算机随机选择的11个、15个或19个精灵中产生,其中一个在移动,然后停止工作。我不关心看到精灵移动,只要它们确实改变了x坐标。他们应该直接跳到新的位置。我使用的是python 2.7和pygame。如果你发现我的代码有什么问题,我很乐意听到!总的来说,我是个编程新手,我希望能变得更好。谢谢!我的代码如下:

代码语言:javascript
复制
import pygame, sys
from pygame.locals import *
import pygame
import time
import random

pygame.init()

screen = pygame.display.set_mode((720, 480))

gray = pygame.Color(220, 220, 220)
black = pygame.Color(0, 0, 0)
blue = pygame.Color(0, 0, 255)
red = pygame.Color(255, 0 ,0)
white = pygame.Color(255, 255, 255)


t_delta = 0
t_target = 60*15
t_start = time.time()

g=0

#f = open("results", "a")
#f.write("trial number, answer, reaction time, correct answer, number of balls in left circle at response, number of balls in middle circle at response, number of balls in right circle at response\n")
#f.close()

class tokens(pygame.sprite.Sprite):
    def __init__(self, color, width, height):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.Surface([width, height])
        self.image.fill(color)

        self.rect = self.image.get_rect()

token_list = pygame.sprite.Group()

'''t_end = time.time() + 60*15
while time.time() < t_end: (other method for determining 15 minute timer)'''

while t_delta < t_target:

    screen.fill(gray)
    pygame.draw.rect(screen, black, Rect((30,140), (200,200)))
    pygame.draw.rect(screen, black, Rect((260,140), (200,200)))
    pygame.draw.rect(screen, black, Rect((490,140), (200,200)))
    pygame.display.update()
    #draws three squares on screen

    if len(token_list) == 0:
        n = random.randint(1,3)
        if n == 1:
            n=11
        elif n == 2:
            n = 15
        elif n == 3:
            n = 19
    #chooses amount of tokens

    x_coords = [265, 305, 345, 385, 425, 265, 305, 345, 385, 425, 265, 305, 345, 385, 425, 265, 305, 345, 385] 
    y_coords = [170, 170, 170, 170, 170, 210, 210, 210, 210, 210, 250, 250, 250, 250, 250, 290, 290, 290, 290]
    # initial x y coords for token 

    left_score = 0
    right_score = 0

    if len(token_list) < n:
        for i in range(0,n):
            token = tokens((255,120,0), 20, 20)
            token.rect.x = x_coords[i-1]
            token.rect.y = y_coords[i-1]

            token_list.add(token)



    if len(token_list) == n:
        token_list.draw(screen)
        pygame.display.update()
        for i in token_list:
            token_direction = random.randint(1,2)
            if token_direction == 1:
                token.rect.x -= 230
                pygame.display.update()
                left_score += 1
                time.sleep(1)

            if token_direction == 2:
                token.rect.x += 230
                pygame.display.update()
                right_score += 1
                time.sleep(1)

    for event in pygame.event.get():
        if event.type == KEYDOWN:
            g+=1
            keys = pygame.key.get_pressed()
            if keys[pygame.K_LEFT]:
                answer = "left"
                #f = open("results", "a")
                #f.write(str(g) + ", left\n")
                #f.close()
                pygame.draw.rect(screen, blue, Rect((30,140), (200,200)))
                print("You picked left!")
                pygame.display.update()
                time.sleep(1)
                screen.fill(black)
                token_list.empty()
                pygame.display.update()
                time.sleep(1)

            elif keys[pygame.K_RIGHT]:
                answer = "right"
                #f = open("results", "a")
                #f.write(str(g) + ", right\n")
                #f.close()
                pygame.draw.rect(screen, blue, Rect((490,140), (200,200)))
                print("You picked right!")
                pygame.display.update()
                time.sleep(1)
                screen.fill(black)
                token_list.empty()
                pygame.display.update()
                time.sleep(1)

        t_delta = time.time() - t_start
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-26 07:37:15

仍然有很多工作要做,但至少令牌正在移动。

代码语言:javascript
复制
import pygame
from pygame.locals import *

import random

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

class Tokens(pygame.sprite.Sprite):

    def __init__(self, color, x, y, width, height):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.Surface([width, height])
        self.image.fill(color)

        self.rect = self.image.get_rect(x=x, y=y)

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

# constants (uppercase names)

GRAY  = (220, 220, 220)
BLACK = (  0,   0,   0)
BLUE  = (  0,   0, 255)
RED   = (255,   0,   0)
WHITE = (255, 255, 255)

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

f = open("results", "a")
f.write("trial number, answer, reaction time, correct answer, number of balls in left circle at response, number of balls in middle circle at response, number of balls in right circle at response\n")
f.close()

g = 0

# initial x y coords for token 

x_coords = [265, 305, 345, 385, 425, 265, 305, 345, 385, 425, 265, 305, 345, 385, 425, 265, 305, 345, 385] 
y_coords = [170, 170, 170, 170, 170, 210, 210, 210, 210, 210, 250, 250, 250, 250, 250, 290, 290, 290, 290]

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

# start program

pygame.init()

screen = pygame.display.set_mode((720, 480))

clock = pygame.time.Clock()

state_reset = True

current_time = pygame.time.get_ticks()
end_time = current_time + 60*15*1000 # ms

# --- mainloop ---

while current_time < end_time:

    if state_reset:
        # chooses amount of tokens

        tokens_to_move = random.choice( (11,15,19) )

        tokens_left = 0
        tokens_right = 0

        # create tokens

        tokens_list = []
        tokens_group = pygame.sprite.Group()

        for i in range(tokens_to_move):
            token = Tokens((255,120,0), x_coords[i], y_coords[i], 20, 20)
            tokens_list.append( token )
            tokens_group.add( token )

        move_speed = 1000

        current_time = pygame.time.get_ticks()
        time_to_move = current_time + move_speed # ms

        selected_side = None

        state_selected = False
        state_reset = False


    # --- DRAWS ---

    screen.fill(GRAY)

    pygame.draw.rect(screen, BLACK, Rect((30,140), (200,200)))
    pygame.draw.rect(screen, BLACK, Rect((260,140), (200,200)))
    pygame.draw.rect(screen, BLACK, Rect((490,140), (200,200)))

    if state_selected:
        if selected_side == 'left':
            pygame.draw.rect(screen, BLUE, Rect((30,140), (200,200)))

        elif selected_side == 'right':
            pygame.draw.rect(screen, BLUE, Rect((490,140), (200,200)))

    tokens_group.draw(screen)

    pygame.display.update()

    # --- CHANGES ---

    if state_selected:
        if selected_time <= current_time:
            state_selected = False

    # moves token

    if tokens_to_move:
        if time_to_move <= current_time:
            time_to_move = current_time + move_speed
            tokens_to_move -= 1
            print 'tokens_to_move:', tokens_to_move
            if random.randint(1,2) == 1:
                tokens_list[tokens_to_move].rect.x -= 230
                tokens_left += 1
            else:
                tokens_list[tokens_to_move].rect.x += 230
                tokens_right += 1
    else:
        state_reset = True

    # --- EVENTS ---

    for event in pygame.event.get():
        if event.type == KEYDOWN:
            g += 1

            if event.key == K_ESCAPE:
                pygame.quit()
                exit()

            elif event.key == pygame.K_SPACE:
                print 'reset'
                state_reset = True

            if not selected_side:
                if event.key == K_LEFT:
                    answer = "left"
                    f = open("results", "a")
                    f.write(str(g) + ", left\n")
                    f.close()
                    selected_side = 'left'
                    print("You picked left!")
                    selected_time = current_time + 1000 # ms
                    move_speed = 0.1
                    state_selected = True

                elif event.key == K_RIGHT:
                    answer = "right"
                    f = open("results", "a")
                    f.write(str(g) + ", right\n")
                    f.close()
                    selected_side = 'right'
                    print("You picked right!")
                    selected_time = current_time + 1000 # ms
                    move_speed = 0.1
                    state_selected = True


    # --- CLOCK ---

    clock.tick(20) # 20 FPS 

    current_time = pygame.time.get_ticks()
    #print 'current_time:', current_time
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24419525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档