Etkileşimli konsoldan yazı karakteri okuma ve GASP

Başlatan Jey@Nfer, 14 Aralık 2012 - 02:19:22

« önceki - sonraki »

0 Üyeler ve 4 Ziyaretçi konuyu incelemekte.

Jey@Nfer

Yazı karakterleri nasıl oluşturuluyor acaba sorusunun cevabını realize etmek için merak edip yazdığım kod :)
İki tane modül içeriyor :
* GASP ; ki Bilgisayar Bilimcisi Gibi Düşünmek kitabında anlatıldığı kadar biliyorum, kodlarda zaten açıkça belli neyin ne işe yaradığı
* curses modülü ; ki aslında hakkında çok da şey bilmediğim sadece imleçle ilgili olduğunu bildiğim ve konsoldan entera basmadan yazı yazmamı sağlayan modül :)

Buyrun kodlar:


#!/usr/bin/env python
#-*- coding: utf-8 -*-

from gasp import*
import curses

begin_graphics()


def a(x,y):
Line( (x,y), (x+20, y+40) )
Line( (x+20,y+40) , (x+40, y) )
Line( (x+10, y+20) , (x+30,y+20))

def b(x,y):
Line( (x,y) , (x, y+40) )
Line( (x,y) , (x+20,y) )
Line( (x,y+40) , (x+20,y+40) )
Line( (x,y+20) , (x+20,y+20) )
Line( (x+20,y+40) , (x+30,y+30) )
Line( (x+30,y+30) , (x+20,y+20) )
Line( (x+20,y+20) , (x+30,y+10) )
Line( (x+30,y+10) , (x+20,y) )


def c(x,y):
Line( (x,y) , (x+20,y) )
Line( (x,y) , (x, y+40) )
Line( (x,y+40) , (x+20,y+40) )

def d(x,y):
Line( (x,y) , (x+20,y) )
Line( (x+20,y) , (x+30,y+10) )
Line( (x+30,y+10) , (x+30,y+30) )
Line( (x+30,y+30) , (x+20,y+40) )
Line( (x+20,y+40) , (x,y+40) )
Line( (x,y) , (x,y+40) )

def e(x,y):
Line( (x,y) , (x+20,y) )
Line( (x,y) , (x,y+40) )
Line( (x,y+40) , (x+20,y+40) )
Line( (x,y+20) , (x+20,y+20) )

def f(x,y):
Line( (x,y) , (x,y+40) )
Line( (x,y+40) , (x+20,y+40) )
Line( (x,y+20) , (x+20,y+20) )


def g(x,y):
Line( (x,y) , (x+30,y) )
Line( (x,y) , (x,y+40) )
Line( (x,y+40) , (x+30,y+40) )
Line( (x+30,y) , (x+30,y+20) )
Line( (x+30,y+20) , (x+10,y+20) )


def h(x,y):
Line( (x,y) , (x,y+40) )
Line( (x+20,y) , (x+20,y+40) )
Line( (x,y+20) , (x+20,y+20) )

def i(x,y):
Line( (x,y) , (x,y+40) )


def j(x,y):
Line( (x,y) , (x+20,y) )
Line( (x+20,y) , (x+30,y+10) )
Line( (x+30,y+10) , (x+30,y+40) )


def k(x,y):
Line( (x,y) , (x,y+40) )
Line( (x,y+20) , (x+20,y+40) )
Line( (x,y+20) , (x+20,y) )


def l(x,y):
Line( (x,y) , (x+20,y) )
Line( (x,y) , (x,y+40) )


def m(x,y):
Line( (x,y) , (x,y+40) )
Line( (x,y+40) , (x+20,y+10) )
Line( (x+20,y+10) , (x+40,y+40) )
Line( (x+40,y+40) , (x+40,y) )


def n(x,y):
Line( (x,y) , (x,y+40) )
Line( (x,y+40) , (x+30,y) )
Line( (x+30,y) , (x+30,y+40) )


def o(x,y):
Circle( (x+20,y+20) , 20)


def p(x,y):
Line( (x,y) , (x,y+40) )
Line( (x,y+40) , (x+20,y+40) )
Line( (x+20,y+40) , (x+20,y+20) )
Line( (x+20,y+20) , (x,y+20) )


def r(x,y):
Line( (x,y) , (x,y+40) )
Line( (x,y+40) , (x+20,y+40) )
Line( (x+20,y+40) , (x+20,y+20) )
Line( (x+20,y+20) , (x,y+20) )
Line( (x,y+20) , (x+20,y) )


def s(x,y):
Line( (x,y) , (x+20,y) )
Line( (x+20,y) , (x+20,y+20) )
Line( (x+20,y+20) , (x,y+20) )
Line( (x,y+20) , (x,y+40) )
Line( (x,y+40) , (x+20,y+40) )


def t(x,y):
Line( (x+20,y) , (x+20,y+40) )
Line( (x,y+40) , (x+40,y+40) )


def u(x,y):
Line( (x,y) , (x+30,y) )
Line( (x,y) , (x, y+40) )
Line( (x+30,y) , (x+30,y+40) )


def v(x,y):
Line( (x+20,y) , (x,y+40) )
Line( (x+20,y) , (x+40,y+40) )


def w(x,y):
Line( (x+20,y) , (x,y+40) )
Line( (x+20,y) , (x+40,y+40) )
Line( (x+40,y) , (x+20,y+40) )
Line( (x+40,y) , (x+60,y+40) )


def x(x_,y):
Line( (x_,y) , (x_+30,y+40) )
Line( (x_+30,y) , (x_,y+40) )



def y(x,y_):
Line( (x+20,y_) , (x+20,y_+20) )
Line( (x+20,y_+20) , (x, y_+40) )
Line( (x+20,y_+20) , (x+40,y_+40) )



def z(x,y):
Line( (x,y) , (x+40,y) )
Line( (x,y) , (x+40,y+40) )
Line( (x+40,y+40) , (x,y+40) )



def sec_gonder(fonk,x_,y_):
if fonk== "a" :  a(x_,y_)
if fonk== "b" :  b(x_,y_)
if fonk== "c" :  c(x_,y_)
if fonk== "d" :  d(x_,y_)
if fonk== "e" :  e(x_,y_)
if fonk== "f" :  f(x_,y_)
if fonk== "g" :  g(x_,y_)
if fonk== "h" :  h(x_,y_)
if fonk== "i" :  i(x_,y_)
if fonk== "j" :  j(x_,y_)
if fonk== "k" :  k(x_,y_)
if fonk== "l" :  l(x_,y_)
if fonk== "m" :  m(x_,y_)
if fonk== "n" :  n(x_,y_)
if fonk== "o" :  o(x_,y_)
if fonk== "p" :  p(x_,y_)
if fonk== "r" :  r(x_,y_)
if fonk== "s" :  s(x_,y_)
if fonk== "t" :  t(x_,y_)
if fonk== "u" :  u(x_,y_)
if fonk== "v" :  v(x_,y_)
if fonk== "w" :  w(x_,y_)
if fonk== "x" :  x(x_,y_)
if fonk== "y" :  y(x_,y_)
if fonk== "z" :  z(x_,y_)


def alfabe(x,y):
if ( (x<20 or y>430) or (y<50 and x>600) ): return
if(x>600 and y>=50):
x =20
y -=50

oku = curses.initscr()
fonk="a"

while fonk != "q" :
fonk = oku.getch()
fonk=chr(fonk)
if fonk == "\n":
print "\n",
else :
fonk ,
sec_gonder(fonk,x,y)

if fonk== "a" :  x +=50
if fonk== "b" :  x +=40
if fonk== "c" :  x +=30
if fonk== "d" :  x +=40
if fonk== "e" :  x +=30
if fonk== "f" :  x +=30
if fonk== "g" :  x +=40
if fonk== "h" :  x +=30
if fonk== "i" :  x +=10
if fonk== "j" :  x +=40
if fonk== "k" :  x +=30
if fonk== "l" :  x +=30
if fonk== "m" :  x +=50
if fonk== "n" :  x +=40
if fonk== "o" :  x +=50
if fonk== "p" :  x +=30
if fonk== "r" :  x +=30
if fonk== "s" :  x +=30
if fonk== "t" :  x +=50
if fonk== "u" :  x +=40
if fonk== "v" :  x +=50
if fonk== "w" :  x +=70
if fonk== "x" :  x +=40
if fonk== "y" :  x +=50
if fonk== "z" :  x +=50
if fonk== " ": x +=30

if fonk=="\n":
x =20
y -=50
curses.endwin()

def alfabe_yaz():
x=20
y=430
alfabe(x,y)

alfabe_yaz()


Kodda anlamadığınız bir kısım olursa açıklayayım.

Şimdilik benim gözüme batan tek kapalılık şu;
oradaki

def sec_gonder(fonk,x_,y_):
....

fonksiyonu çok hantal duruyor.
Bu kısmı kısaltmak için fonksiyon adlarını karakter olarak atadım ki doğrudan f girince f(x,y) çağırabileyim .
ancak burada şu sorun çıktı ;
bunu yapmak için giriş yöntemi olarak "input" metodunu kullanmam gerekecekti ;
fakat "input"u kullanamam çünkü o zaman "enter" basmam gerekiyor.

bir diğer alternatif olarak da:
getattr() ile referansını almak olabilirdi ancak onu yapmak için de ;
  * ya bu karakter çizdiren kodları başka bir dosyaya alıp ordan import ederek çağırmam gerekiyordu (bu yöntemi kullanmak istemedim , her şey tek sayfada olsun küçücük kod zaten )
   * ya da bir sınıfın nesneleri olarak falan tanımlamam gerekiyordu , ki asıl ihtiyacım olan da buydu fakat beceremedim :(
bunu nasıl yapabilirim arkadaşlar ?
yani o sec_gonder fonksiyonunu teker teker karşılaştırma yaparak değil de doğrudan zaten karakter adıyla aynı olan fonksiyon adından referans alma yoluyla fonksiyonu çağıracak biçimde nasıl değiştirebilirim?

Hırs , azim , tevekkül ...

www.mehmetvahit.net

hitokiri

Aslında sec_gonder değilde daha çok liste veya sozluklerden yararlanırsan öz. alfabe için kod dahada kısalır aslında,
birde tekrar kodları kopyala yapıştır gibi sıralamak yerine döngülerden faydalanabilirsin,
örneğin;
>>> liste = ["A","B","C","Ç","D","E","F","G","Ğ","H","I","İ","J","K","L","M","N","O","Ö","P","R","S","Ş","T","U","Ü","V","Y","Z"]
>>> for x in liste:
...     print x, x *2
...
A AA
B BB


Benzeri şeyler en son sınıflara bakarsın , istihzayı sık ziyaret etmekte fayda var XD


ct

@Jey@Nfer,

Elinize sağlık. Modüller yüklü olmadığı için çalıştıramadım ancak görsel kısmı da var sanırım. Pygame görsel animasyon oyun geliştirme için çok eğlenceli duruyor. Python bilmiyorum ancak Raspberry Pi'mde denemek için bir anlatımdan yararlanarak bir resmi alıp arkaplana koyma ve fare imlecini başka bir resimle (Raspberry Pi'nin amblemi olan çilek) yer değiştirme yapıyordu. Sonra ekleme olarak o fare imlecinde kullandığım resmin boyutlarını değiştirerek rastgele yerlerde küçükten büyülterek sanki ekrana geliyorlarmış gibi (canavar çilekler diyebiliriz bunlara) yaptım. Resim işleme mümkünmüş yani pygame ile. Ayrıca çarpıya basınca ve aşağı ok tuşuna basınca çıkıyor. O çıkma işini Q'ya yaptıracaktım sanırım ama üşenmiş olabilirim. O gelen canavar çilekleri sınıf yazarak çok daha kolay kullanılabilir yapabilirdim ama python'da sınıf konusunu açıp okumaya üşendim. time modülünü kendim akıl edip koymuştum ama zaten pygame'de öyle bir metod varmış. random modülüyle oluşturulan canavar çilekleri yalancı-rastgele konumlara atmak için yaptım. Kodda görüleceği üzere onlardan ki tane geliyor. Bazı yerlerdeki printleri hızlıca debug etmek için koymuştum.

Resimler kodunuzla aynı dizinde olmalı. Fare için kullandığım resim 100x126 piksel, arkaplan 370x542 piksel. Gimple herhangi bir resmi bu hale getirebilirsiniz.

Pygame'in şöyle kurulması lazım:

sudo apt-get install python-pygame

Yazdığım kod da şöyle:

#!/usr/bin/env python

import  pygame, sys, time, random

from pygame.locals import *

pygame.init()

screen = pygame.display.set_mode((370, 542), 0, 32)

backgroundfile = "background.png"
mousefile = "mouse.png"

background = pygame.image.load(backgroundfile).convert()
mouse = pygame.image.load(mousefile).convert_alpha()
mouse2 = pygame.image.load(mousefile).convert_alpha()

a1 = 1;
b1 = 2;
a4 = 1;
b4 = 2;
a2 = random.randint(50, 250);
b2 = random.randint(50, 250);
a3 = random.randint(50, 250);
b3 = random.randint(50, 250);
i = 0;
j = 0;

while True:

for event in pygame.event.get():
if event.type in (QUIT, KEYDOWN):
pygame.quit()
sys.exit()

screen.blit(background, (0, 0))

x,y = pygame.mouse.get_pos()

x -= mouse.get_width()/2
y -= mouse.get_height()/2

pygame.mouse.set_visible(False)

screen.blit(mouse, (x, y))


while (i < 15):

print a1
print b1

mouseStretchedImage = pygame.transform.scale(mouse, (a1,b1))
screen.blit(mouseStretchedImage,(a2,b2))
pygame.time.delay(70)
#time.sleep(0.02)
pygame.display.flip()
#pygame.display.update()
i = i + 1
a1 = a1+20;
b1 = b1+20;
a2 = a2 - 10;
b2 = b2 -10;
#pygame.time.delay(20)
pygame.display.update()
while (j < 15):

#print a4
#print b4

mouseStretchedImage = pygame.transform.scale(mouse, (a1,b1))
screen.blit(mouseStretchedImage,(a2,b2))

pygame.time.delay(70)

#time.sleep(0.02)
pygame.display.flip()
#pygame.display.update()
j = j + 1
a1 = a1+20;
b1 = b1+20;
a2 = a3 - 10;
b2 = b3 -10;

print(x,y)

pygame.display.update()

Jey@Nfer

@hitokiri teşekkürler yalnız burada çok da gerekli olduğunu sanmıyorum liste veya sözlüğün;
ancak şu olurdu ;
sozluk={"A" : fonkA , "B" : fonkB ...} tarzı isimlerle fonksiyonları birleştirerek mesela sozluk[fonkismi] şeklinde fonksiyonu çağırmak.
Fakat ne yazık ki bu yöntem de olmaz çünkü hem dışardan x ve y değerlerini girmene müsade etmez , hem de sözlük yapısı içinde fonksiyon barındırmaz.

@ct
güzelmiş :D yalnız ben niyeyse oyun yapmak istemiyorum ya .
daha çok işlevsel fakat gerçekten hoş ve farklı "UYGULAMA"lar yapmak istiyorum. Yani oyun yapma fikri nedense bana sıkıcı geliyor ; hiç oynamadığım için olabilir belki :)
bu yönden pygame modülüne girmeyi düşünmüyorum.
ama şu olur aklıma bi fikir gelir , ihtiyaç hissederim , o zaman neden olmasın :)
Hırs , azim , tevekkül ...

www.mehmetvahit.net

ct

Alıntı yapılan: Jey@Nfer - 17 Aralık 2012 - 03:29:23
@hitokiri teşekkürler yalnız burada çok da gerekli olduğunu sanmıyorum liste veya sözlüğün;
ancak şu olurdu ;
sozluk={"A" : fonkA , "B" : fonkB ...} tarzı isimlerle fonksiyonları birleştirerek mesela sozluk[fonkismi] şeklinde fonksiyonu çağırmak.
Fakat ne yazık ki bu yöntem de olmaz çünkü hem dışardan x ve y değerlerini girmene müsade etmez , hem de sözlük yapısı içinde fonksiyon barındırmaz.

@ct
güzelmiş :D yalnız ben niyeyse oyun yapmak istemiyorum ya .
daha çok işlevsel fakat gerçekten hoş ve farklı "UYGULAMA"lar yapmak istiyorum. Yani oyun yapma fikri nedense bana sıkıcı geliyor ; hiç oynamadığım için olabilir belki :)
bu yönden pygame modülüne girmeyi düşünmüyorum.
ama şu olur aklıma bi fikir gelir , ihtiyaç hissederim , o zaman neden olmasın :)

Ben de güya SCADA/otomasyon arayüzü tarzı bir şeyi python'da hızlıca çıkarabilir miyim diye bakınırken buldum bunu. Sonra nerelere vardı :P

hitokiri

#5
Alıntı Yapsozluk={"A" : fonkA , "B" : fonkB ...} tarzı isimlerle fonksiyonları birleştirerek mesela sozluk[fonkismi] şeklinde fonksiyonu çağırmak.
Fakat ne yazık ki bu yöntem de olmaz ...
...

Neden olmasın bana kalırsa olabilir gibi geliyor , şöyle bir şey olmayacak mı yoksa?


>>> def deneme(a,b):
...     print a +"==>"+  b
...
>>> x = {"a":deneme }
>>> x["a"]("200","241")
200==>241
>>> exec 'deneme("200","241")'
200==>241



Doğru anlıyorum umarım soruyu XD

Jey@Nfer

@hitokiri vaay güzelmiş :)
ya aklıma gelmişti ve çok benzerini yapmıştım dediğim gibi :)

Alıntı Yap
sozluk={"A" : fonkA , "B" : fonkB ...} tarzı isimlerle fonksiyonları birleştirerek mesela sozluk[fonkismi] şeklinde fonksiyonu çağırmak.

ben şu kısmı yapmamıştım :

>>> x["a"]("200","241")


diyorum "abi bu sözlük yani dışardan veri nasıl gircez ?"
demek ki böyle giriyormuşuz :)

ufak bi deneme yaptım :

>>> def fa(x,y):
...     print x , "+", y ,"=",x+y
...
>>> def fb(x,y):
...     print "b: ", x , "+", y ,"=",x+y
...
>>> def fc(x,y):
...     print "c: ", x , "+", y ,"=",x+y
...
>>> x={"a":fa , "b":fb , "c":fc }
>>> fonksiyon="a"
>>> x_=10
>>> y_=20
>>> x[fonksiyon](x_,y_)
10 + 20 = 30
>>> fonksiyon="b"
>>> x[fonksiyon](x_,y_)
b:  10 + 20 = 30
>>>


eveet şimdi sıra geldi yukardaki programı editlemeye :)

ama hala bir sorun geçerliliğini koruyor:
getattr ile referans alarak direk olarak sözlük falan oluşturmadan fonksiyon ismiyle çağırmayı yapamadım :(
Hırs , azim , tevekkül ...

www.mehmetvahit.net

hitokiri

#7
>>> import deneme
>>> y = deneme.__dict__
>>> for x in y:
...     if callable(y[x]) is True:
...             print x
...
alfabe_yaz
sec_gonder
alfabe
a
c
b


Şimdi tam olarak anlamadım soruyu ancak,
Alıntı Yapalfabe_yaz
sec_gonder
alfabe
şu kısmı başka bir dosyaya alır veya alfabe sırasını bir sınıfa tıkarsan,
yukardaki fonksiyonları bir listeye alabilirsin,
sonra girdi fonksiyon isimleri listesine eşitse;
exec srt+"(str,str)"
şeklinde ilk str ile fonksiyon ismini diğerleriyle argümanları girerek fonk. çalıştırabilirsin sanırım XD
Tabi yanlış anlamıyorsun böyle bir yanıt olacak , başka yöntemlerde vardır muhtemelen XD

z = filter(lambda i:callable(y[i]) is True,y)