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
Geri bildirim: Python öğrenmek isteyenler için To-Do list - Bilişim Profesyonelleri
Geri bildirim: Python eğitimi almak isteyenler için To-Do List - Bilişim Profesyonelleri