2017-12-28 10 views
-3

Ich möchte eine Art Spiel in Python mit Pygame eingeben. Also, wenn das gedrückte Zeichen der Schlüssel das gleiche wie das Zeichen im Wort ist, sollte es True zurückgeben ... Gibt es eine Möglichkeit, dies in Python zu tun? Beispiel: Das Wort ist "cat", wenn der Benutzer die Taste "c" drückt, dann gibt es true zurück ... und so weiter für den Rest der Zeichen.Vergleichen von keypressed zu einem char

hier ist meine main.py Datei

from time import sleep 
import pygame 
import random 
import winsound 
from words import Words 

BLACK = ( 0, 0, 0) 
WHITE = (255, 255, 255) 
BLUE = ( 0, 0, 255) 
GREEN = ( 0, 255, 0) 
RED = (255, 0, 0) 

pygame.init() 

SCREEN_WIDTH = 800 
SCREEN_HEIGHT = 600 

done = False 

clock = pygame.time.Clock() 

screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) 

w1 = Words(screen) #making a single word (for now) to see if typing works 

while not done: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 


    screen.fill(WHITE) 
    w1.draw() 

    #attempting to write code here to compare word and user input 



    pygame.display.flip() 
    clock.tick(60) 


pygame.init() 
exit() 

hier ist meine words.py Datei

from random_words import RandomWords 
import pygame 
import random 
from queue import * 

rw = RandomWords() 

class Words(): 
    def __init__(self, screen): 
     self.screen = screen 
     self.x_point = 400 
     self.y_point = 400 
     self.word = rw.random_word() #generates a random word 
     self.queue = Queue() #was hoping to use the queue so that if the user types the char correctly in the right order, then the letter would change color or something (but that's further down the line) 
     for c in self.word: #iterate through randomized word.. 
      self.queue.put(c) #add each char in randomized word to queue, for typing reasons 

    def getY(self): 
     return self.y_point 

    def draw(self): 
     #creates a new object 
     myfont = pygame.font.SysFont('Comic Sans MS' ,30) 
     #creates a new surface with text drawn on it 
     textsurface = myfont.render(self.word, False, (0,0,0)) 

     self.screen.blit(textsurface,(self.x_point,self.y_point)) 
+2

Was haben Sie versucht, so weit? – Dragonthoughts

+0

Das Vergleichen von Tastendrucken mit Zeichen hat viele Probleme. Zum Beispiel brauchen Sie oft mehrere Tastendrücke, um ein Zeichen zu erstellen. Die Probleme beginnen mit Umschalttasten auf lateinischen Tastaturen, die für Akzente schlechter werden. Schließlich wird die Übereinstimmung zwischen Schlüssel und Zeichen immens, wenn IME (Eingabemethoden-Editoren) für Skripte wie Chinesisch oder Japanisch verwendet werden. – Dragonthoughts

+0

Ich dachte, ich könnte tun, wenn K_a == 'a' oder etwas ähnliches, aber Sie können den Variablennamen selbst nicht vergleichen, soweit ich weiß (da k_a, k_b usw. eine Variable in pygame ist). Im Moment denke ich daran, den Nutzer einfach in die Konsole tippen zu lassen und ihn dann mit dem Wort zu vergleichen. – cation

Antwort

1

Ereignis KEYDOWN hat event.unicode, event.key, event.mod

Sie können

if event.type == pygame.KEYDOWN: 
    if event.unicode == "a": 
vergleichen

oder sogar

if event.type == pygame.KEYDOWN: 
    if event.unicode.lower() == "a": 

"a" und "A"

zu überprüfen char in Wort

if event.type == pygame.KEYDOWN: 
    if event.unicode.lower() in your_word.lower(): 

Beispielcode event.unicode Verwendung Um zu überprüfen, Text mit gedrückten Tasten zu machen.

BTW: Es ist nicht irgendein Entry widget, also löscht es Char nicht, wenn Sie backspace drücken.

import pygame 

# --- constants --- 

BLACK = ( 0, 0, 0) 
WHITE = (255, 255, 255) 
BLUE = ( 0, 0, 255) 
GREEN = ( 0, 255, 0) 
RED = (255, 0, 0) 

SCREEN_WIDTH = 300 
SCREEN_HEIGHT = 200 

FPS = 5 # `FPS = 25` is enough for human eye to see animation. 
     # If your program don't use animation 
     # then `FPS = 5` or even `FPS = 1` can be enough 

# --- main --- 

# - init - 

pygame.init() 

screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) 
screen_rect = screen.get_rect() 

# - objects - 

font = pygame.font.SysFont(None, 30) 

text = "" 

text_image = font.render(text, True, GREEN) 
text_rect = text_image.get_rect()  # get current size 
text_rect.center = screen_rect.center # center on screen 

# - mainloop - 

clock = pygame.time.Clock() 

done = False 

while not done: 

    # - events - 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
     elif event.type == pygame.KEYDOWN: 
      text += event.unicode 

      text_image = font.render(text, True, GREEN) 
      text_rect = text_image.get_rect()  # get current size 
      text_rect.center = screen_rect.center # center on screen 

    # - draws - 

    screen.fill(BLACK) 

    screen.blit(text_image, text_rect) 

    pygame.display.flip() 
    clock.tick(FPS) 

# - end - 
pygame.quit() # <-- quit(), not init() 

enter image description here

Verwandte Themen