Python’da Proje – Yazma Hız Testi

Yazma Hız Testinde Python Projesi – Python’da ilk oyununuzu oluşturun.

Klavye ile Yazı Yazma hızınızı takip etmek ve düzenli alıştırmalarla geliştirmek için çok faydalı bir oyundur. Şimdi, sadece birkaç adımı izleyerek Python’da kendi yazma hızı oyununuzu oluşturabileceksiniz.

Python Projesi Hakkında

Bu Python proje fikrinde, yazma hızınızı kontrol edebileceğiniz ve hatta geliştirebileceğiniz heyecan verici bir proje oluşturacağız . Grafiksel bir kullanıcı arayüzü için, grafiklerle çalışmak için kullanılan pygame kütüphanesini kullanacağız. Ekranda görüntülenecek görselleri ve yazıları çizeceğiz.

Önkoşullar

Python’daki proje, temel python programlama ve pygame kitaplığı bilgisine sahip olmanızı gerektirir.

Pygame kitaplığını kurmak için terminalinize aşağıdaki kodu yazın.

pip install pygame

Yazma Hızı Testinde Python Projesini Oluşturma Adımları

Projenin tam kaynak kodunu bu bağlantıdan indirebilirsiniz:

Yazma Hız Testi Python Proje Dosyası

Oluşturacağımız kaynak kod ile Python projesinin dosya yapısını anlayalım:

  • Background.jpg – Programımızda kullanacağımız bir arka plan resmi
  • Icon.png – Sıfırlama düğmesi olarak kullanacağımız bir simge görüntüsü.
  • Sentences.txt – Bu metin dosyası, yeni bir satırla ayrılmış cümlelerin bir listesini içerecektir.
  • Speedwriting.py – Tüm kodu içeren ana program dosyası
  • Typing-speed-open.png – Oyuna başlarken görüntülenecek resim

İlk olarak, yeni bir satırla ayırarak birden fazla cümle eklediğimiz cümleler.txt dosyasını oluşturduk.

Bu sefer programı oluşturmak için Nesne yönelimli bir yaklaşım kullanacağız.

1. Kitaplıkları içe aktarın

Python tabanlı bu proje için pygame kütüphanesini kullanıyoruz. Bu nedenle, zaman ve rastgele kitaplık gibi bazı yerleşik Python modülleriyle birlikte kitaplığı içe aktarmamız gerekiyor.

import pygame
from pygame.locals import *
import sys
import time
import random

2. Oyun sınıfını oluşturun

Şimdi Python’da projemiz için gerekli hesaplamaları yapmak için oyunu başlatmaktan sorumlu birçok işlevi, oyunu sıfırlamayı ve birkaç yardımcı işlevi içeren oyun sınıfını oluşturuyoruz.

Devam edelim ve projemizde kullanacağımız tüm değişkenleri tanımladığımız sınıfımız için yapıcıyı oluşturalım.

class Game:

    def __init__(self):
        self.w=750
        self.h=500
        self.reset=True
        self.active = False
        self.input_text=''
        self.word = ''
        self.time_start = 0
        self.total_time = 0
        self.accuracy = '0%'
        self.results = 'Time:0 Accuracy:0 % Wpm:0 '
        self.wpm = 0
        self.end = False
        self.HEAD_C = (255,213,102)
        self.TEXT_C = (240,240,240)
        self.RESULT_C = (255,70,70)


        pygame.init()
        self.open_img = pygame.image.load('type-speed-open.png')
        self.open_img = pygame.transform.scale(self.open_img, (self.w,self.h))


        self.bg = pygame.image.load('background.jpg')
        self.bg = pygame.transform.scale(self.bg, (500,750))

        self.screen = pygame.display.set_mode((self.w,self.h))
        pygame.display.set_caption('Type Speed test')

Bu kurucuda, pencerenin genişliğini ve yüksekliğini, hesaplama için gerekli değişkenleri başlattık ve ardından pygame’i başlattık ve görüntüleri yükledik. Ekran değişkeni, üzerine her şeyi çizeceğimiz en önemli değişkendir.

3. draw_text() yöntemi

Game sınıfının draw_text() yöntemi , metni ekrana çizecek bir yardımcı fonksiyondur . Aldığı argüman ekran, çizmek istediğimiz mesaj, metnimizi konumlandırmak için ekranın y koordinatı, yazı tipinin boyutu ve yazı tipinin rengidir. Her şeyi ekranın ortasına çizeceğiz. Ekrana herhangi bir şey çizdikten sonra, pygame ekranı güncellemenizi gerektirir.

def draw_text(self, screen, msg, y ,fsize, color):
    font = pygame.font.Font(None, fsize)
    text = font.render(msg, 1,color)
    text_rect = text.get_rect(center=(self.w/2, y))
    screen.blit(text, text_rect)
    pygame.display.update()

4. get_sentence() yöntemi

Cümleler.txt dosyamızda bir cümle listemiz olduğunu hatırlıyor musunuz? get_sentence() yöntemi dosyayı açar ve listeden rastgele bir cümle döndürür. Tüm dizeyi yeni satır karakteriyle böldük.

def get_sentence(self):
    f = open('sentences.txt').read()
    sentences = f.split('\n')
    sentence = random.choice(sentences)
    return sentence

5. show_results() yöntemi

show_results() yöntemi, kullanıcının yazma hızını hesapladığımız yerdir . Kullanıcı giriş kutusuna tıkladığında süre başlar ve kullanıcı “Enter” dönüş tuşuna bastığında farkı yapar ve saniye cinsinden süreyi hesaplarız.

Doğruluğu hesaplamak için biraz matematik yaptık. Girilen metni, kullanıcının yazması gereken ekran metniyle karşılaştırarak doğru yazılan karakterleri saydık.

Doğruluk formülü:

(doğru karakterler)x100/ (cümledeki toplam karakter)

WPM, dakikadaki kelime sayısıdır. Tipik bir kelime yaklaşık 5 karakterden oluşur, bu yüzden toplam kelime sayısını beşe bölerek dakikadaki kelimeleri hesaplıyoruz ve ardından sonuç tekrar dakika cinsinden toplam süreye bölünüyor. Toplam süremiz saniye olduğu için toplam süreyi 60’a bölerek dakikaya çevirmemiz gerekti.

Son olarak sıfırlama butonu olarak kullanacağımız ekranın alt kısmındaki yazı ikonu resmini çizdik. Kullanıcı tıkladığında oyunumuz sıfırlanır. Bu makalenin ilerleyen bölümlerinde reset_game() yöntemini göreceğiz.

def show_results(self, screen):
    if(not self.end):
        #Calculate time
        self.total_time = time.time() - self.time_start

        #Calculate accuracy
        count = 0
        for i,c in enumerate(self.word):
            try:
                if self.input_text[i] == c:
                    count += 1
            except:
                pass
        self.accuracy = count/len(self.word)*100

        #Calculate words per minute
        self.wpm = len(self.input_text)*60/(5*self.total_time)
        self.end = True
        print(self.total_time)

        self.results = 'Time:'+str(round(self.total_time)) +" secs Accuracy:"+ str(round(self.accuracy)) + "%" + ' Wpm: ' + str(round(self.wpm))

        # draw icon image
        self.time_img = pygame.image.load('icon.png')
        self.time_img = pygame.transform.scale(self.time_img, (150,150))
        #screen.blit(self.time_img, (80,320))
        screen.blit(self.time_img, (self.w/2-75,self.h-140))
        self.draw_text(screen,"Reset", self.h - 70, 26, (100,100,100))

        print(self.results)
        pygame.display.update()

6. run() yöntemi

Bu, tüm olayları ele alacak olan sınıfımızın ana yöntemidir . Tüm değişkenleri sıfırlayan bu yöntemin başlangıcında reset_game() yöntemini çağırıyoruz. Ardından, tüm fare ve klavye olaylarını yakalayacak sonsuz bir döngü çalıştırıyoruz. Ardından ekrana başlığı ve giriş kutusunu çiziyoruz.

Daha sonra fare ve klavye olaylarını arayacak başka bir döngü kullanırız. Mouse butonuna basıldığında mouse pozisyonunun input box üzerinde olup olmadığını kontrol ediyoruz ardından zamanı başlatıyoruz ve active’i True olarak ayarlıyoruz. Reset butonu üzerinde ise oyunu sıfırlıyoruz.

Etkin True olduğunda ve yazma işlemi bitmediğinde klavye olaylarını ararız. Kullanıcı herhangi bir tuşa basarsa, giriş kutumuzdaki mesajı güncellememiz gerekir. Enter tuşu yazmayı bitirecek ve bunu görüntülemek için puanları hesaplayacağız. Diğer bir geri alma olayı, son karakteri kaldırarak giriş metnini kırpmak için kullanılır.

def run(self):
    self.reset_game()


    self.running=True
    while(self.running):
        clock = pygame.time.Clock()
        self.screen.fill((0,0,0), (50,250,650,50))
        pygame.draw.rect(self.screen,self.HEAD_C, (50,250,650,50), 2)
        # update the text of user input
        self.draw_text(self.screen, self.input_text, 274, 26,(250,250,250))
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == QUIT:
                self.running = False
                sys.exit()
            elif event.type == pygame.MOUSEBUTTONUP:
                x,y = pygame.mouse.get_pos()
                # position of input box
                if(x>=50 and x<=650 and y>=250 and y<=300):
                    self.active = True
                    self.input_text = ''
                    self.time_start = time.time()
                 # position of reset box
                 if(x>=310 and x<=510 and y>=390 and self.end):
                    self.reset_game()
                    x,y = pygame.mouse.get_pos()


            elif event.type == pygame.KEYDOWN:
                if self.active and not self.end:
                    if event.key == pygame.K_RETURN:
                        print(self.input_text)
                        self.show_results(self.screen)
                        print(self.results)
                        self.draw_text(self.screen, self.results,350, 28, self.RESULT_C)
                        self.end = True

                    elif event.key == pygame.K_BACKSPACE:
                        self.input_text = self.input_text[:-1]
                    else:
                        try:
                            self.input_text += event.unicode
                        except:
                            pass

        pygame.display.update()


    clock.tick(60)

7. reset_game() yöntemi

reset_game() yöntemi , yazma hızımızı yeniden test etmeye başlayabilmemiz için tüm değişkenleri sıfırlar . Ayrıca get_sentence() yöntemini çağırarak rastgele bir cümle seçiyoruz. Sonunda sınıf tanımını kapattık ve programı çalıştırmak için Game sınıfının nesnesini oluşturduk.

    def reset_game(self):
        self.screen.blit(self.open_img, (0,0))

        pygame.display.update()
        time.sleep(1)

        self.reset=False
        self.end = False

        self.input_text=''
        self.word = ''
        self.time_start = 0
        self.total_time = 0
        self.wpm = 0

        # Get random sentence
        self.word = self.get_sentence()
        if (not self.word): self.reset_game()
        #drawing heading
        self.screen.fill((0,0,0))
        self.screen.blit(self.bg,(0,0))
        msg = "Typing Speed Test"
        self.draw_text(self.screen, msg,80, 80,self.HEAD_C)
        # draw the rectangle for input box
        pygame.draw.rect(self.screen,(255,192,25), (50,250,650,50), 2)

        # draw the sentence string
        self.draw_text(self.screen, self.word,200, 28,self.TEXT_C)

        pygame.display.update()



Game().run()

Çıktı:

Özet

Bu makalede, pygame kitaplığı yardımıyla kendi yazma hızı testi oyununuzu oluşturmak için Python projesi üzerinde çalıştınız.

Umarım yeni şeyler öğrenmişsinizdir ve bu ilginç Python projesini inşa etmekten keyif almışsınızdır. Makaleyi sosyal medyada arkadaşlarınız ve iş arkadaşlarınızla paylaşın.

Makalenin orjinal kaynağını bu linkten okuyabilirsiniz

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.