NASZE SERWISY:    ANDROID   LINUX   MAEMO   SYMBIAN   WEBOS




Hosting sponsoruje:



GRIN3 - polskie fonty

Profesjonalne czcionki z polskimi znakami - czcionki.com

OpenMobile on Facebook


 

[Py] Snake przerobiony na dotykową 5800

Odpowiednie forum do zadawania pytań dotyczących rozpoczęcia programowania.

[Py] Snake przerobiony na dotykową 5800

Postprzez issa » 22 kwietnia 2009, o 22:30

Ponieważ mam Nokię 5800 , ciekawiło mnie jak można przerobić skrypt snake.py który Nokia dołącza do swojej implementacji Pythona tak aby można było zagrać w niego korzystając z dotykowego ekranu. Ściągnąłem wersję 1.9.3 PyS60 oraz Python Script Shel 1.9.2 ze strony:


https://garage.maemo.org/frs/?group_id=854

Muszę przyznać , że już wcześniej praktycznie do końca rozgryzłem ten skrypt , pokrótce więc powiem , że w konstruktorze klasy SnakeGame inicjalizowana wartością zero jest składowa direction , czyli kierunek ruchu węża. Wartość zero określa ruch w lewo , 1 , w górę , 2 w prawo , oraz 3 , w dół.
Dzięki użyciu funkcji bind i stałych EKeyUpArrow , EKeyLeftArrow itp. , można sterować wężem , wywołując funkcję zwrotną turnto (x) z odpowiednim argumentem 0,1,2 bądź 3.
Wyglądało to np. tak:

self.canvas.bind(EKeyRightArrow,lambda:self.turnto(0))

a funkcja def turnto , miała postać:

def turnto(self,direction):
self.direction=direction

Aby móc sterować wężem za pomocą dotykowego ekranu należało skorzystać z jednej z przeciążonych wersji metody bind klasy Canvas która jako parametr przyjmuje również funkcję zdarzeniową , a sama funkcja zdarzeniowa przyjmuje w klasie oprócz jawnie przekazanego obiektu , także tuplę zawierającą współrzędne (x,y) w których nastąpiło przyciśnięcie ekranu:

def funkcja_zdarzeniowa (self , (x,y))

A więc skorzystałem z nowej stałej dostępnej w module key_codes zdefiniowanej w Py 1.9.3 o nazwie key_codes. EButton1Down określającej przyciśnięcie ekranu , i zmieniłem linię kodu na:

self.canvas.bind (EButton1Down ,self.turnto)

, a samą funkcję zdarzeniową na dosyć rozbudowaną wersję która uwzględnia jednocześnie kierunek ruchu węża co jest bardzo ważne i oczywiście miejsce w którym przyciska się ekran:

def turnto(self,(x,y)):
if (self.direction==0 and x>self.loc[0]*self.step and y<self.loc[1]*self.step):
self.direction = 1
elif (self.direction==0 and x<self.loc[0]*self.step and y<self.loc[1]*self.step):
self.direction = 1
elif (self.direction==0 and x>self.loc[0]*self.step and y>self.loc[1]*self.step):
self.direction = 3
elif (self.direction==0 and x<self.loc[0]*self.step and y>self.loc[1]*self.step):
self.direction = 3
elif (self.direction==1 and x<self.loc[0]*self.step and y<self.loc[1]*self.step):
self.direction = 2
elif (self.direction==1 and x>self.loc[0]*self.step and y<self.loc[1]*self.step):
self.direction = 0
elif (self.direction==1 and x<self.loc[0]*self.step and y>self.loc[1]*self.step):
self.direction = 2
elif (self.direction==1 and x>self.loc[0]*self.step and y>self.loc[1]*self.step):
self.direction = 0
elif (self.direction==2 and x<self.loc[0]*self.step and y<self.loc[1]*self.step):
self.direction = 1
elif (self.direction==2 and x>self.loc[0]*self.step and y<self.loc[1]*self.step):
self.direction = 1
elif (self.direction==2 and x<self.loc[0]*self.step and y>self.loc[1]*self.step):
self.direction = 3
elif (self.direction==2 and x>self.loc[0]*self.step and y>self.loc[1]*self.step):
self.direction = 3
elif (self.direction==3 and x<self.loc[0]*self.step and y<self.loc[1]*self.step):
self.direction = 2
elif (self.direction==3 and x>self.loc[0]*self.step and y<self.loc[1]*self.step):
self.direction = 0
elif (self.direction==3 and x<self.loc[0]*self.step and y>self.loc[1]*self.step):
self.direction = 2
elif (self.direction==3 and x>self.loc[0]*self.step and y>self.loc[1]*self.step):
self.direction = 0

Nie spolszczałem już tego , ale któregoś dnia opiszę ciekawy sposób odwzorowania ruchu węża w słowniku jaki został użyty w tym skrypcie.

A oto cały kod , miłej zabawy na Nokii 5800 (z Py 1.9.3) i już wkrótce N97.

Kod: Zaznacz cały

import appuifw
import math
import e32
from key_codes import *
from graphics import *
import random

class SnakeGame:
    deltas=((1,0),(0,-1),(-1,0),(0,1))
    def __init__(self):
        self.direction=0
        self.step=5
        self.color=(0,128,0)
        self.fillarray={}
        self.exitflag=0
        self.score=0
        self.wormlocs=[]
        self.wormlength=10
        self.foodloc=None
        self.fieldcolor=(192,192,128)
        self.resboxoffset=2       
        self.state='init'       
        self.old_body=appuifw.app.body
        self.canvas=appuifw.Canvas(redraw_callback=self.redraw)
        self.draw=Draw(self.canvas)
        appuifw.app.body=self.canvas
       
        self.fieldsize=(self.canvas.size[0]/self.step,(self.canvas.size[1]-16)/self.step)       
        self.canvas.bind (EButton1Down ,self.turnto)
        self.loc=[self.fieldsize[0]/2,self.fieldsize[1]/2]       
        self.place_food()
        self.state='playing'
        self.redraw(())
    def turnto(self,(x,y)):
        if (self.direction==0 and x>self.loc[0]*self.step and y<self.loc[1]*self.step):
           self.direction = 1
        elif (self.direction==0 and x<self.loc[0]*self.step and y<self.loc[1]*self.step):
           self.direction = 1
        elif (self.direction==0 and x>self.loc[0]*self.step and y>self.loc[1]*self.step):
           self.direction = 3
        elif (self.direction==0 and x<self.loc[0]*self.step and y>self.loc[1]*self.step):
           self.direction = 3
        elif (self.direction==1 and x<self.loc[0]*self.step and y<self.loc[1]*self.step):
           self.direction = 2
        elif (self.direction==1 and x>self.loc[0]*self.step and y<self.loc[1]*self.step):
           self.direction = 0
        elif (self.direction==1 and x<self.loc[0]*self.step and y>self.loc[1]*self.step):
           self.direction = 2
        elif (self.direction==1 and x>self.loc[0]*self.step and y>self.loc[1]*self.step):
           self.direction = 0
        elif (self.direction==2 and x<self.loc[0]*self.step and y<self.loc[1]*self.step):
           self.direction = 1
        elif (self.direction==2 and x>self.loc[0]*self.step and y<self.loc[1]*self.step):
           self.direction = 1
        elif (self.direction==2 and x<self.loc[0]*self.step and y>self.loc[1]*self.step):
           self.direction = 3
        elif (self.direction==2 and x>self.loc[0]*self.step and y>self.loc[1]*self.step):
           self.direction = 3
        elif (self.direction==3 and x<self.loc[0]*self.step and y<self.loc[1]*self.step):
           self.direction = 2
        elif (self.direction==3 and x>self.loc[0]*self.step and y<self.loc[1]*self.step):
           self.direction = 0
        elif (self.direction==3 and x<self.loc[0]*self.step and y>self.loc[1]*self.step):
           self.direction = 2
        elif (self.direction==3 and x>self.loc[0]*self.step and y>self.loc[1]*self.step):
           self.direction = 0
    def close_canvas(self):
        appuifw.app.body=self.old_body
        self.canvas=None
        self.draw=None
        appuifw.app.exit_key_handler=None
    def redraw(self,rect):
        self.draw.clear(self.fieldcolor)
        for loc in self.fillarray.keys():
            self.draw_square(loc,self.color)
        self.draw_score()
        if self.foodloc:
            self.draw_food()       
    def draw_square(self,loc,color):
        self.draw.rectangle((loc[0]*self.step,
                             16+loc[1]*self.step,
                             loc[0]*self.step+self.step,
                             16+loc[1]*self.step+self.step),fill=color)
    def draw_score(self):
        scoretext=u"Score: %d"%self.score
        textrect=self.draw.measure_text(scoretext, font='title')[0]
        self.draw.rectangle((0,0,textrect[2]-textrect[0]+self.resboxoffset,textrect[3]-textrect[1]+self.resboxoffset),fill=(0,0,0))     
        self.draw.text((-textrect[0],-textrect[1]),scoretext,(0,192,0),"title")
    def draw_food(self):
        self.draw_square(self.foodloc,(255,0,0))       
    def place_food(self):
        while 1:
            self.foodloc=(random.randint(0,self.fieldsize[0]-1),
                          random.randint(0,self.fieldsize[1]-1))
            if not self.fillarray.has_key(self.foodloc): break
        self.draw_food()
    def set_exit(self):
        self.exitflag=1
    def run(self):
        appuifw.app.exit_key_handler=self.set_exit
        while not self.exitflag:
            self.draw_square(self.loc,self.color)
            if (tuple(self.loc) in self.fillarray or
                self.loc[0]>=self.fieldsize[0] or self.loc[0]<0 or
                self.loc[1]>=self.fieldsize[1] or self.loc[1]<0):
                break
            if tuple(self.loc)==self.foodloc:
                self.score+=10
                self.draw_score()
                self.place_food()
                self.draw_food()
                self.wormlength+=10
            if len(self.wormlocs)>self.wormlength:
                loc=self.wormlocs[0]
                del self.wormlocs[0]
                del self.fillarray[loc]
                self.draw_square(loc,self.fieldcolor)
            self.fillarray[tuple(self.loc)]=1
            self.wormlocs.append(tuple(self.loc))
            e32.ao_sleep(0.08)
            self.loc[0]+=self.deltas[self.direction][0]
            self.loc[1]+=self.deltas[self.direction][1]
        self.close_canvas()
appuifw.app.screen='full'
playing=1
while playing:
    game=SnakeGame()
    game.run()
    playing=appuifw.query(u'Final score: %d - Play again?'%game.score,'query')   

issa
10%
10%
 
Posty: 49
Dołączył(a): 11 sierpnia 2006, o 20:13
    WindowsXPFirefox

Re: [Py] Snake przerobiony na dotykową 5800

Postprzez Magik » 23 kwietnia 2009, o 10:18

issa, hoho.Świetna robota :)
Może byś nakręcił jakiś filmik albo zrobił screenshoty, coby zachęcić do pobawienia się innych?
Magik, de Lowe,niepoprawny szlachcic,oportunista,czarodziej Sx1.pl,SoS.pl i PDAforum.pl,wojownik o sprawę Polską.
Avatar użytkownika
Magik
Moderator
Moderator
 
Posty: 7312
Dołączył(a): 19 marca 2007, o 07:48
Lokalizacja: Białystok
Mod.tel.: n900 BA N-GageQD SX1
    WindowsXPFirefox

Re: [Py] Snake przerobiony na dotykową 5800

Postprzez issa » 23 kwietnia 2009, o 15:57

Dziękuję:) To akurat nie było oczywiście specjalnie skomplikowane , ale przyznaję , że to fajne uczucie przerobić coś czy napisać i sprawdzić swoją wiedzę w praktyce. Proszę , pod tym adresem:

http://www.zshare.net/download/590709592b35d5dc

jest krótki film w formacie mp4 jak to działa na 5800 i 3 screeny. Pozdrawiam.
issa
10%
10%
 
Posty: 49
Dołączył(a): 11 sierpnia 2006, o 20:13
    WindowsXPFirefox


Powrót do Od czego zacząć?

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość