# AcceSnake.py # # AcceSnake # # play a snake-like game using the # accelerometer of your phone # # Copyright (C) 2008 CmoaToto # accesnake@cmoatoto.fr # http://cmoatoto.fr # # some helps from : # -Ordiclic : ordiclicordinateur@orange.fr # #This program is a free software : you #can redistribute it and/or modify it #under the terms of the GNU General #Public License as published by the Free #Software Foundation, by the version 3 #of the license. # #This program is distributed in the hope #that it will be useful, but WITHOUT ANY #WARRANTY; without even the implied #warranty of MERCHANTABILITY or #FITNESS FOR A PARTICULAR PURPOSE. #See the GNU General Public License for #more details : #http://www.gnu.org/licenses/ # #VERSIONS: # #2.0 (20 nov 2008) #-CmoaToto made all the graphics and # the engine to use it #-CmoaToto add a keyboard option #-CmoaToto beautify allmost all the code # and changed a lot of details #-Ordiclic add the "exit" code # #1.2 (14 oct 2008) #-CmoaToto made a 'choose language' # option #-Cmoatoto increased the speed with the # difficulty # #1.1 (09 oct 2008) #-Ordiclic add a ligne just after the # imports to force the game to stay in a # portrait orientation #-Ordiclic beautify most of the "for" loop: # "in (0,1,2,3)" became "in range(0,4)" #-CmoaToto corrected a bug in the score # showed in the menu during a game # #1.0 (05 oct 2008) #-Whole source code by CmoaToto import sys import appuifw import math import e32 import graphics import random from key_codes import* import os import time try: import axyz except: 0 appuifw.app.orientation='portrait' appuifw.app.screen='full' global img #Gestion des modes de jeu class ModeDeJeu: def __init__(self): self.playing=0 self.exitflag=0 self.sens=file.read_sens() self.difficulte=file.read_diff() self.acce=file.read_acce() #Gestion des images class SnakePict: def __init__(self): self.apple={} self.appleMask={} self.snake={} self.snakeMask={} self.snakeMaskDark={} self.head={} self.headMask={} self.headMaskDark={} def reloadmask(self,im): width, height = im.size mask = graphics.Image.new(im.size, 'L') mask.blit(im) return mask def create_apples(self): global img img.text((10,80),u"apples",(255,255,255)) canvas.blit(img) self.apple[20]=graphics.Image.open('e:\\AcceSnake\\images\\apple.jpg') self.appleMask[20]=graphics.Image.open('e:\\AcceSnake\\images\\appleMask.jpg') for i in range (0,21): self.apple[i]=self.apple[20].resize((i,i),keepaspect=1) self.appleMask[i]=self.appleMask[20].resize((i,i),keepaspect=1) self.appleMask[i]=self.reloadmask(self.appleMask[i]) img.text((canvas.size[0]-80,80),u"[ OK ]",(0,255,0)) canvas.blit(img) def create_snake(self): global img img.text((10,100),u"snake",(255,255,255)) canvas.blit(img) for i in range (0,9): self.snake[i]=graphics.Image.open('e:\\AcceSnake\\images\\snake%d.jpg'%i) self.snakeMask[i]=graphics.Image.open('e:\\AcceSnake\\images\\snakeMask%d.jpg'%i) self.snakeMaskDark[i]=graphics.Image.open('e:\\AcceSnake\\images\\snakeMaskDark%d.jpg'%i) for i in range (0,9): self.snakeMask[i]=self.reloadmask(self.snakeMask[i]) self.snakeMaskDark[i]=self.reloadmask(self.snakeMaskDark[i]) for i in range (0,9): self.snake[i+27]=self.snake[i].transpose(graphics.ROTATE_90) self.snake[i+18]=self.snake[i].transpose(graphics.ROTATE_180) self.snake[i+9]=self.snake[i].transpose(graphics.ROTATE_270) self.snakeMask[i+27]=self.snakeMask[i].transpose(graphics.ROTATE_90) self.snakeMask[i+18]=self.snakeMask[i].transpose(graphics.ROTATE_180) self.snakeMask[i+9]=self.snakeMask[i].transpose(graphics.ROTATE_270) self.snakeMaskDark[i+27]=self.snakeMaskDark[i].transpose(graphics.ROTATE_90) self.snakeMaskDark[i+18]=self.snakeMaskDark[i].transpose(graphics.ROTATE_180) self.snakeMaskDark[i+9]=self.snakeMaskDark[i].transpose(graphics.ROTATE_270) img.text((canvas.size[0]-80,100),u"[ OK ]",(0,255,0)) canvas.blit(img) def create_head(self): global img img.text((10,120),u"snake's head",(255,255,255)) canvas.blit(img) for i in range (0,9): self.head[i]=graphics.Image.open('e:\\AcceSnake\\images\\head%d.jpg'%i) self.headMask[i]=graphics.Image.open('e:\\AcceSnake\\images\\headMask%d.jpg'%i) self.headMaskDark[i]=graphics.Image.open('e:\\AcceSnake\\images\\headMaskDark%d.jpg'%i) for i in range (0,9): self.headMask[i]=self.reloadmask(self.headMask[i]) self.headMaskDark[i]=self.reloadmask(self.headMaskDark[i]) for i in range (0,9): self.head[i+27]=self.head[i].transpose(graphics.ROTATE_90) self.head[i+18]=self.head[i].transpose(graphics.ROTATE_180) self.head[i+9]=self.head[i].transpose(graphics.ROTATE_270) self.headMask[i+27]=self.headMask[i].transpose(graphics.ROTATE_90) self.headMask[i+18]=self.headMask[i].transpose(graphics.ROTATE_180) self.headMask[i+9]=self.headMask[i].transpose(graphics.ROTATE_270) self.headMaskDark[i+27]=self.headMaskDark[i].transpose(graphics.ROTATE_90) self.headMaskDark[i+18]=self.headMaskDark[i].transpose(graphics.ROTATE_180) self.headMaskDark[i+9]=self.headMaskDark[i].transpose(graphics.ROTATE_270) img.text((canvas.size[0]-80,120),u"[ OK ]",(0,255,0)) canvas.blit(img) def create_back(self): self.background=graphics.Image.open('e:\\AcceSnake\\images\\background.jpg') self.wall=graphics.Image.open('e:\\AcceSnake\\images\\wall.jpg') #Gestion de l'angle du snake class Angle: def snake(self,dirx,diry): diry= -diry try: dir=diry/dirx except: dirx+=0.0001 diry+=0.0001 dir=diry/dirx ang=0 if (dir>11.43 or dir<=-11.43): ang=0 elif (dir<=11.43 and dir>3.73): ang=1 elif (dir<=3.73 and dir>2.14): ang=2 elif (dir<=2.14 and dir>1.43): ang=3 elif (dir<=1.43 and dir>1.0): ang=4 elif (dir<=1.0 and dir>0.7): ang=5 elif (dir<=0.7 and dir>0.47): ang=6 elif (dir<=0.47 and dir>0.27): ang=7 elif (dir<=0.27 and dir>0.09): ang=8 elif (dir<=0.09 and dir>-0.09): ang=9 elif (dir<=-0.09 and dir>-0.27): ang=10 elif (dir<=-0.27 and dir>-0.47): ang=11 elif (dir<=-0.47 and dir>-0.7): ang=12 elif (dir<=-0.7 and dir>-1.0): ang=13 elif (dir<=-1.0 and dir>-1.43): ang=14 elif (dir<=-1.43 and dir>-2.14): ang=15 elif (dir<=-2.14 and dir>-3.73): ang=16 elif (dir<=-3.73 and dir>-11.43): ang=17 if (dirx<0 and ang!=0): ang+=18 elif (ang==0 and diry<0): ang=18 return ang #Gestion de la langue du jeu class Langue: def __init__(self): global img img.text((10,60),u"language",(255,255,255)) canvas.blit(img) self.cree=u"" self.help=u"" self.play=u"" self.highscore1=u"" self.screenshot1=u"" self.options1=u"" self.exit1=u"" self.continue0=u"" self.pause=u"" self.standup=u"" self.laydown=u"" self.leaning=u"" self.back2=u"" self.phonesway2=u"" self.back1=u"" self.highscore2=u"" self.take=u"" self.screenshot2=u"" self.ok=u"" self.exit2=u"" self.playagain=u"" self.menu=u"" self.gameover=u"" self.credits=u"" self.resethighscore=u"" self.phonesway1=u"" self.difficulty1=u"" self.options2=u"" self.easy=u"" self.medium=u"" self.hard=u"" self.difficulty2=u"" self.areyousuretodeletehighscore=u"" self.score=u"" self.apple=u"" self.life=u"" self.time=u"" self.typeyourname=u"" self.screensaveto=u"" self.beginagame=u"" self.finishyourgame=u"" self.pausegame=u"" self.moreoptions=u"" self.options3=u"" self.chooselanguage=u"" self.usekey=u"" self.useacce=u"" self.resetdico=u"" self.noaxyz=u"" def create_english(self): config={} config['cree']=u"Created by" config['help']=u"some help from" config['play']=u"Play" config['highscore1']=u"High Score" config['screenshot1']=u"Screen Shot" config['options1']=u"Options" config['exit1']=u"Exit" config['continue0']=u"Continue" config['pause']=u" PAUSE" config['standup']=u"Stand up" config['laydown']=u"Lay down" config['leaning']=u"Leaning" config['back2']=u" Back" config['phonesway2']=u" PHONE'S WAY" config['back1']=u"Back" config['highscore2']=u" HIGH SCORE" config['take']=u"Take" config['screenshot2']=u" SCREEN SHOT" config['ok']=u"OK" config['exit2']=u" EXIT" config['playagain']=u"Play Again" config['menu']=u"Menu" config['gameover']=u" GAME OVER" config['credits']=u"Credits" config['resethighscore']=u"Reset High Score" config['phonesway1']=u"Phone's way" config['difficulty1']=u"Difficulty" config['options2']=u" OPTIONS" config['easy']=u"Easy" config['medium']=u"Medium" config['hard']=u"Hard" config['difficulty2']=u" DIFFICULTY" config['areyousuretodeletehighscore']=u"Are you sure to Delete High Score?" config['score']=u"Score" config['apple']=u"ap." config['life']=u"life" config['time']=u"time" config['typeyourname']=u"Type your Name :" config['screensaveto']=u"ScreenShot saved to " config['beginagame']=u"Begin a game first." config['finishyourgame']=u"Finish your game first." config['pausegame']=u"pause" config['moreoptions']=u"More Options" config['options3']=u" OPTIONS 2" config['chooselanguage']=u"Choose Language" config['usekey']=u"Use the Keyboard" config['useacce']=u"Use the Accelerometer" config['resetdico']=u"Reset the dictionnary" config['noaxyz']=u"The Axyz module can not be load.\nYou can not use the Accelerometer.\nUse the Keyboard." CONFIG_DIR='e:/AcceSnake/language' try: os.makedirs(CONFIG_DIR) except: 0 CONFIG_FILE=os.path.join(CONFIG_DIR,'english.txt') f=open(CONFIG_FILE,'wt') f.write(repr(config)) f.close() def open_language(self,language_file): CONFIG_FILE=language_file try: f=open(CONFIG_FILE,'r') except: self.create_english() CONFIG_FILE='e:/AcceSnake/language/english.txt' f=open(CONFIG_FILE,'r') content=f.read() config=eval(content) f.close() self.cree=config.get('cree','') self.help=config.get('help','') self.play=config.get('play','') self.highscore1=config.get('highscore1','') self.screenshot1=config.get('screenshot1','') self.options1=config.get('options1','') self.exit1=config.get('exit1','') self.continue0=config.get('continue0','') self.pause=config.get('pause','') self.standup=config.get('standup','') self.laydown=config.get('laydown','') self.leaning=config.get('leaning','') self.back2=config.get('back2','') self.phonesway2=config.get('phonesway2','') self.back1=config.get('back1','') self.highscore2=config.get('highscore2','') self.take=config.get('take','') self.screenshot2=config.get('screenshot2','') self.ok=config.get('ok','') self.exit2=config.get('exit2','') self.playagain=config.get('playagain','') self.menu=config.get('menu','') self.gameover=config.get('gameover','') self.credits=config.get('credits','') self.resethighscore=config.get('resethighscore','') self.phonesway1=config.get('phonesway1','') self.difficulty1=config.get('difficulty1','') self.options2=config.get('options2','') self.easy=config.get('easy','') self.medium=config.get('medium','') self.hard=config.get('hard','') self.difficulty2=config.get('difficulty2','') self.areyousuretodeletehighscore=config.get('areyousuretodeletehighscore','') self.score=config.get('score','') self.apple=config.get('apple','') self.life=config.get('life','') self.time=config.get('time','') self.typeyourname=config.get('typeyourname','') self.screensaveto=config.get('screensaveto','') self.beginagame=config.get('beginagame','') self.finishyourgame=config.get('finishyourgame','') self.pausegame=config.get('pausegame','') self.moreoptions=config.get('moreoptions','') self.options3=config.get('options3','') self.chooselanguage=config.get('chooselanguage','') self.usekey=config.get('usekey','') self.useacce=config.get('useacce','') self.resetdico=config.get('resetdico','') self.noaxyz=config.get('noaxyz','') self.textlist=(self.cree, self.help, self.play, self.highscore1, self.screenshot1, self.options1, self.exit1, self.continue0, self.pause, self.standup, self.laydown, self.leaning, self.back2, self.phonesway2, self.back1, self.highscore2, self.take, self.screenshot2, self.ok, self.exit2, self.playagain, self.menu, self.gameover, self.credits, self.resethighscore, self.phonesway1, self.difficulty1, self.options2, self.easy, self.medium, self.hard, self.difficulty2, self.areyousuretodeletehighscore, self.score, self.apple, self.life, self.time, self.typeyourname, self.screensaveto, self.beginagame, self.finishyourgame, self.pausegame, self.moreoptions, self.options3, self.chooselanguage, self.usekey, self.useacce, self.resetdico, self.noaxyz) for text in self.textlist: if text==u"": if appuifw.query(u"This dictionnary is not perfect. Some text could not appear.Do you want to reset and use the english dictionnary?", "query"): self.reset() else: break def select_langue(self): files=os.listdir('e:/AcceSnake/language') N=0 while 1: try: files[N]=u''+files[N] N+=1 except: break fileNumero=appuifw.popup_menu(files, u"Select the file:") language_file=u'e:/AcceSnake/language/'+files[fileNumero] try: langue.open_language(language_file) CONFIG_FILE='e:/AcceSnake/language_file.txt' f=open(CONFIG_FILE,'wt') config={} config['language_file']=language_file f.write(repr(config)) f.close() except: appuifw.note(u'not supported file', "info") def reset(self): self.create_english() CONFIG_DIR='e:/AcceSnake' CONFIG_FILE=os.path.join(CONFIG_DIR,'language_file.txt') f=open(CONFIG_FILE,'wt') config={} config['language_file']=u"e:/AcceSnake/language/english.txt" f.write(repr(config)) f.close() language_file=config.get('language_file','') self.open_language(language_file) #Affichage des frames par sec. class ShowFps: def __init__(self): self.time0=time.clock() self.frame=0 self.fps=0 def inc_frame(self): self.frame+=1 if 1.0<(time.clock()-self.time0): self.time0=time.clock() self.fps=self.frame self.frame=0 #introduction du clavier class Keyboard(object): def __init__(self,onevent=lambda:None): self._keyboard_state={} self._downs={} self._onevent=onevent def handle_event(self,event): if event['type'] == appuifw.EEventKeyDown: code=event['scancode'] if not self.is_down(code): self._downs[code]=self._downs.get(code,0)+1 self._keyboard_state[code]=1 elif event['type'] == appuifw.EEventKeyUp: self._keyboard_state[event['scancode']]=0 self._onevent() def is_down(self,scancode): return self._keyboard_state.get(scancode,0) def pressed(self,scancode): if self._downs.get(scancode,0): self._downs[scancode]-=1 return True return False keyboard=Keyboard() canvas=appuifw.Canvas(event_callback=keyboard.handle_event, redraw_callback=None) appuifw.app.body=canvas #introduction de l'accéléromètre class Accelerometre: def __init__(self): self.ax=0.00001 self.ay=0.00001 def xyz(self,x,y,z): self.ax = (x*0.0005) if mode.sens==0: self.ay = (z*0.0005) elif mode.sens==1: self.ay = ((y-4)*0.0005) else : self.ay = ((z+25)*0.0005) def key_or_acce(self): if mode.acce: if mode.playing!=0: axyz.disconnect() file.write_acce(0) mode.acce=0 else: try: axyz.connect(acce.xyz) if mode.playing==0: axyz.disconnect() file.write_acce(1) mode.acce=1 except: appuifw.note(langue.noaxyz, "info") #gestion des infos ds des fichiers class GestionFile: def make_dir(self): CONFIG_DIR='e:/AcceSnake' if not os.path.isdir(CONFIG_DIR): os.makedirs(CONFIG_DIR) self.check_language() global img img.text((canvas.size[0]-80,60),u"[ OK ]",(0,255,0)) canvas.blit(img) def check_language(self): CONFIG_FILE='e:/AcceSnake/language_file.txt' try: f=open(CONFIG_FILE,'r') except: langue.create_english() CONFIG_DIR='e:/AcceSnake' CONFIG_FILE=os.path.join(CONFIG_DIR,'language_file.txt') f=open(CONFIG_FILE,'wt') config={} config['language_file']=u"e:/AcceSnake/language/english.txt" f.write(repr(config)) f.close() f=open(CONFIG_FILE,'r') content=f.read() config=eval(content) f.close() language_file=config.get('language_file','') langue.open_language(language_file) def write_acce(self,acce): CONFIG_DIR='e:/AcceSnake' CONFIG_FILE=os.path.join(CONFIG_DIR,'acce.txt') if not os.path.isdir(CONFIG_DIR): os.makedirs(CONFIG_DIR) CONFIG_FILE=os.path.join(CONFIG_DIR,'acce.txt') config={} config['acce']= acce f=open(CONFIG_FILE,'wt') f.write(repr(config)) f.close() def read_acce(self): CONFIG_FILE='e:/AcceSnake/acce.txt' try: f=open(CONFIG_FILE,'rt') try: content = f.read() config=eval(content) f.close() acce=config.get('acce','') if not acce==None: return acce else: try: axyz.connect(acce.xyz) axyz.disconnect() return 1 except: return 0 except: try: axyz.connect(acce.xyz) axyz.disconnect() return 1 except: return 0 except: try: axyz.connect(acce.xyz) axyz.disconnect() return 1 except: return 0 def write_sens(self,sens): CONFIG_DIR='e:/AcceSnake' CONFIG_FILE=os.path.join(CONFIG_DIR,'sens.txt') if not os.path.isdir(CONFIG_DIR): os.makedirs(CONFIG_DIR) CONFIG_FILE=os.path.join(CONFIG_DIR,'sens.txt') try: content=f.read() config=eval(content) except: config={} config['sens']= sens f=open(CONFIG_FILE,'wt') f.write(repr(config)) f.close() def read_sens(self): CONFIG_FILE='e:/AcceSnake/sens.txt' try: f=open(CONFIG_FILE,'rt') try: content = f.read() config=eval(content) f.close() sens=config.get('sens','') if not sens==None: return sens else: return 1 except: return 1 except: return 1 def write_diff(self,diff): CONFIG_DIR='e:/AcceSnake' CONFIG_FILE=os.path.join(CONFIG_DIR,'diff.txt') if not os.path.isdir(CONFIG_DIR): os.makedirs(CONFIG_DIR) CONFIG_FILE=os.path.join(CONFIG_DIR,'diff.txt') config={} config['diff']= diff f=open(CONFIG_FILE,'wt') f.write(repr(config)) f.close() def read_diff(self): CONFIG_FILE='e:/AcceSnake/diff.txt' try: f=open(CONFIG_FILE,'rt') try: content = f.read() config=eval(content) f.close() diff=config.get('diff','') if not diff==None: return diff else: return 3 except: return 3 except: return 3 def write_score(self,nom,score): CONFIG_DIR='e:/AcceSnake' CONFIG_FILE=os.path.join(CONFIG_DIR,'score.txt') if not os.path.isdir(CONFIG_DIR): os.makedirs(CONFIG_DIR) CONFIG_FILE=os.path.join(CONFIG_DIR,'score.txt') config={} config['nom']= nom config['score']= score config['accelerometer']= mode.acce config['difficulty']= mode.difficulte config['sens']= mode.sens f=open(CONFIG_FILE,'wt') f.write(repr(config)) f.close() def read_score(self): CONFIG_FILE='e:/AcceSnake/score.txt' try: f=open(CONFIG_FILE,'rt') try: content = f.read() config=eval(content) f.close() nom=config.get('nom','') score=config.get('score','') if not [nom,score]==[None,None]: return [nom,score] else: return [u'',0] except: return [u'',0] except: return [u'',0] def name_dir(self,name): essai=0 n=1 while n: try: CONFIG_FILE=u'e:\\AcceSnake\screen_%s'%name+u'_%d.png'%essai f=open(CONFIG_FILE,'rt') essai+=1 except: return CONFIG_FILE #pub avant le jeu def pub(): global img cree=langue.cree toto=u"CmoaToto" mail=u"accesnake@cmoatoto.fr" site=u"http://cmoatoto.fr" help=langue.help helper=u"Ordiclic" nom=u"AcceSnake" version=u"v 2.0" for i in range(0,26): fond=255-(10*i) texte=255 img.clear((fond,fond,fond)) img.text((83,115),cree,(texte,texte,texte)) img.text((80,140),toto,(texte,texte,texte),"title") img.text((40,200),mail,(texte,texte,texte)) img.text((60,240),site,(texte,texte,texte)) img.text((70,300),help,(texte,texte,texte)) img.text((97,315),helper,(texte,texte,texte)) canvas.blit(img) e32.ao_sleep(0.02) e32.ao_sleep(2) for i in range(0,26): fond=0 texte=255-(10*i) img.clear((fond,fond,fond)) img.text((83,115),cree,(texte,texte,texte)) img.text((80,140),toto,(texte,texte,texte),"title") img.text((40,200),mail,(texte,texte,texte)) img.text((60,240),site,(texte,texte,texte)) img.text((70,300),help,(texte,texte,texte)) img.text((97,315),helper,(texte,texte,texte)) canvas.blit(img) e32.ao_sleep(0.02) wallMask = graphics.Image.new((screenSize[0],screenSize[1]), 'L') for i in range(0,26): fond=0 texte=(10*i) wallMask.clear((texte,texte,texte)) img.clear((fond,fond,fond)) img.blit(snakepict.wall,mask=wallMask) img.text((80,70),nom,(150*texte/255,texte,20*texte/255),"title") img.text((10,300),version,(texte,texte,texte)) canvas.blit(img) e32.ao_sleep(0.02) e32.ao_sleep(0.05) #menu du jeu def menu(): def initMenu(nom): nomJeu=u"AcceSnake" version=u"v 2.0" if nom==0: menu1=langue.play menu2=langue.highscore1 menu3=langue.screenshot1 menu4=langue.options1 menu5=langue.exit1 detail=u"" titre=u"" N=5 elif nom==1: menu1=langue.continue0 menu2=langue.highscore1 menu3=langue.screenshot1 menu4=langue.options1 menu5=langue.exit1 detail=u"Score : %d" %((game.score[0]+game.score[1])*mode.difficulte) titre=langue.pause N=5 elif nom==2: menu1=langue.standup menu2=langue.laydown menu3=langue.leaning menu4=langue.back2 menu5=u"" detail=u"" titre=langue.phonesway2 N=4 elif nom==3: HS=file.read_score() menu1=langue.back1 menu2=u"" menu3=HS[0] menu4=(u"%d pts" %HS[1]) menu5=u"" detail=u"" titre=langue.highscore2 N=1 elif nom==4: menu1=langue.take menu2=langue.back1 menu3=u"" menu4=u"" menu5=u"" detail=u"" titre=langue.screenshot2 N=2 elif nom==5: menu1=langue.ok menu2=langue.back1 menu3=u"" menu4=u"" menu5=u"" detail=u"" titre=langue.exit2 N=2 elif nom==6: HS=file.read_score() menu1=langue.playagain menu2=langue.menu menu3=u"" menu4=langue.score + u" :" menu5=u"%d pts" %((game.score[0]+game.score[1])*mode.difficulte) detail=HS[0] + u" : %d pts"%HS[1] titre=langue.gameover N=2 elif nom==7: menu1=langue.moreoptions menu2=langue.resethighscore menu3=langue.phonesway1 menu4=langue.difficulty1 menu5=langue.back1 detail=u"" titre=langue.options2 N=5 elif nom==8: menu1=langue.easy menu2=langue.medium menu3=langue.hard menu4=langue.back2 menu5=u"" detail=u"" titre=langue.difficulty2 N=4 elif nom==9: menu1=langue.credits menu2=langue.chooselanguage menu3=langue.resetdico if mode.acce: menu4=langue.usekey else: menu4=langue.useacce menu5=langue.back1 detail=u"" titre=langue.options3 N=5 tabMenu=[menu1,menu2,menu3,menu4,menu5,titre,nomJeu,version,detail,0,N] return tabMenu def affiche(): img.clear((0,0,0)) img.blit(snakepict.wall) img.text((83,73),tabMenu[6],(50,50,50),"title") img.text((63,113),tabMenu[5],(50,50,50),"title") img.text((13,303),tabMenu[7],(50,50,50)) img.text((83,303),tabMenu[8],(50,50,50)) img.text((80,70),tabMenu[6],(150,255,20),"title") img.text((60,110),tabMenu[5],(255,200,0),"title") img.text((10,300),tabMenu[7],(255,255,255)) img.text((80,300),tabMenu[8],(255,255,255)) for i in range(0,5): if i==tabMenu[9]: color=(255,55,20) else: color=(255,255,255) img.text((53,153+25*i),tabMenu[i],(50,50,50),"title") img.text((50,150+25*i),tabMenu[i],color,"title") def choix(nom): waitChoix=1 N=tabMenu[10] ssMenu=[nom,0] while waitChoix: if keyboard.pressed(EScancodeSelect): ssMenu[1]=tabMenu[9] waitChoix=0 if keyboard.pressed(EScancodeDownArrow): tabMenu[9]+=1 if tabMenu[9]==N: tabMenu[9]=0 if keyboard.pressed(EScancodeUpArrow): tabMenu[9]-=1 if tabMenu[9]==-1: tabMenu[9]=N-1 affiche() canvas.blit(img) e32.ao_sleep(0.001) return ssMenu def sous_menu(ssMenu,inGame): nom=0 waitMenu=1 if ssMenu==[0,0]: game.__init__() mode.playing=1 waitMenu=0 if ssMenu==[0,1]: nom=3 if ssMenu==[0,2]: nom=4 if ssMenu==[0,3]: nom=7 if ssMenu==[0,4]: nom=5 if ssMenu==[1,0]: waitMenu=0 if ssMenu==[1,1]: nom=3 if ssMenu==[1,2]: nom=4 if ssMenu==[1,3]: nom=7 if ssMenu==[1,4]: nom=5 if ssMenu==[2,0]: mode.sens=0 file.write_sens(0) nom=7 if ssMenu==[2,1]: mode.sens=1 file.write_sens(1) nom=7 if ssMenu==[2,2]: mode.sens=2 file.write_sens(2) nom=7 if ssMenu==[2,3]: nom=7 if ssMenu==[3,0]: if inGame: nom=1 else: nom=0 if ssMenu==[4,0]: if inGame: game.redraw(()) game.screenshot() nom=4 else: appuifw.note(langue.beginagame, "info") nom=4 if ssMenu==[4,1]: if inGame==1: nom=1 else: nom=0 if ssMenu==[5,0]: if inGame==1: mode.exitflag=1 inGame=0 mode.playing=0 waitMenu=0 if ssMenu==[5,1]: if inGame==1: nom=1 else: nom=0 if ssMenu==[6,0]: game.__init__() mode.playing=1 waitMenu=0 mode.exitflag=0 if ssMenu==[6,1]: mode.playing=0 nom=0 if ssMenu==[7,0]: nom=9 if ssMenu==[7,1]: if appuifw.query(langue.areyousuretodeletehighscore, "query") == True: file.write_score(u"",0) nom=7 if ssMenu==[7,2]: nom=2 if ssMenu==[7,3]: if inGame: appuifw.note(langue.finishyourgame, "info") nom=7 else: nom=8 if ssMenu==[7,4]: if inGame==1: nom=1 else: nom=0 if ssMenu==[8,0]: mode.difficulte=1 file.write_diff(1) nom=7 if ssMenu==[8,1]: mode.difficulte=2 file.write_diff(2) nom=7 if ssMenu==[8,2]: mode.difficulte=3 file.write_diff(3) nom=7 if ssMenu==[8,3]: nom=7 if ssMenu==[9,0]: pub() nom=9 if ssMenu==[9,1]: langue.select_langue() nom=9 if ssMenu==[9,2]: langue.reset() nom=9 if ssMenu==[9,3]: if inGame: appuifw.note(langue.finishyourgame, "info") nom=9 else: acce.key_or_acce() nom=0 if ssMenu==[9,4]: nom=7 return [nom,waitMenu] waitMenu=1 nom = mode.playing if nom==1: inGame = 1 else: inGame=0 while waitMenu: tabMenu=initMenu(nom) affiche() canvas.blit(img) ssMenu=choix(nom) [nom,waitMenu]=sous_menu(ssMenu,inGame) class AcceSnake: #initialisation def __init__(self): mode.acce=file.read_acce() mode.sens=file.read_sens() mode.difficulte=file.read_diff() self.acceleration = 0.05 self.frottement = 0.999 self.wormSpeed = [0.01,0.01] self.wormLocs=[] self.wormSpeedLimit=0.05 self.wormLoc=None self.wormLength=20 self.wormLengthLimit=70 self.wormBadTime=0 self.wormBadTimeInit=200 self.fillarray={} mode.exitflag=0 self.score=[0,0,1,0] self.appleLoc=[None,None,None,None,None] if mode.difficulte==1: width=18 elif mode.difficulte==2: width=15 else: width=12 self.appleWidth=[width,20,20,width,width,width,width,width] self.appleTime=[0,0,0,0,0,0] self.appleTimeMove=2 self.appleTimeReplace=500 self.appleTimeReplaceGhost=400 self.appleTimeReplaceWall=450 self.appleTimeReplaceMin=100 self.appleTimeDel=300 self.appleDirection=[[0.1,0.1],[0.1,0.1],[0.1,0.1]] self.appleBeginMove=100 self.appleBeginReplace=200 self.appleBeginGhost=300 self.appleBeginWall=400 self.appleSpeed=0.01 self.fieldSize=[5,canvas.size[0]-5,17+5,canvas.size[1]-5] self.wormLoc=[self.fieldSize[1]*0.5,self.fieldSize[3]*0.5,0] self.place_apple(0) #on va tout redessiner def redraw(self,rect): img.blit(snakepict.wall) img.blit(snakepict.background,target=(self.fieldSize[0],self.fieldSize[2]),source=((self.fieldSize[0],self.fieldSize[2]),(240-self.fieldSize[0],320-self.fieldSize[2]+17) ) ) img.rectangle((self.fieldSize[0],self.fieldSize[2],self.fieldSize[1],self.fieldSize[3]),0x222222) img.text((screenSize[0]-40,screenSize[1]-10),langue.pausegame,0xffffff) img.text((5,screenSize[1]-10),u'fps:%d'%fps.fps,0xffffff) self.draw_snake() self.draw_score() for bonus in range(0,5): if not self.appleLoc[bonus]==None: self.draw_apple(bonus) canvas.blit(img) #dessine le worm def draw_snake(self): i=self.wormLength-5 while i>0: try: loc=self.wormLocs[i] if self.wormBadTime>0: mask=snakepict.snakeMaskDark[loc[2]] else: mask=snakepict.snakeMask[loc[2]] img.blit(snakepict.snake[loc[2]],target=(loc[0]-13,loc[1]+3),mask=mask) except:0 i-=5 try: loc=self.wormLocs[0] if self.wormBadTime>0: mask=snakepict.snakeMaskDark[loc[2]] else: mask=snakepict.snakeMask[loc[2]] img.blit(snakepict.snake[loc[2]],target=(loc[0]-13,loc[1]+3),mask=mask) except:0 i=self.wormLength while i>0: try: loc=self.wormLocs[i] if self.wormBadTime>0: mask=snakepict.headMaskDark[loc[2]] else: mask=snakepict.headMask[loc[2]] img.blit(snakepict.head[loc[2]],target=(loc[0]-13,loc[1]+3),mask=mask) i=0 except: i-=1 #affiche le score et les vitesses def draw_score(self): scoreText=langue.score+u": %d"%((self.score[0]+self.score[1])*mode.difficulte) apple=langue.apple+u":%d"%(self.score[0]/10) life=langue.life+u":%d"%(self.score[2]) if self.appleTime[1]>0: time=langue.time+u": %d"%(self.appleTime[1]) if (self.appleTime[1]==0 and self.appleTime[2]>0): time=langue.time+u": %d"%(self.appleTime[2]) img.text((3,16),scoreText,(255,255,255),"title") img.text((90,16),apple,(100,255,100)) img.text((130,16),life,(100,100,255)) if (self.appleTime[1]>0 or self.appleTime[2]>0): img.text((160,16),time,(255,0,0),"title") #dessine une pomme def draw_apple(self,bonus): loc=self.appleLoc[bonus] img.blit(snakepict.apple[self.appleWidth[bonus]],target=(loc[0]-(self.appleWidth[bonus]/2),loc[1]-(self.appleWidth[bonus]/2)+16),mask=snakepict.appleMask[self.appleWidth[bonus]]) #définie l'emplacement d'une pomme def place_apple(self,bonus): loc=[random.randint(self.fieldSize[0]+25,self.fieldSize[1]-25), random.randint(self.fieldSize[2]+50,self.fieldSize[3]-50)] if bonus in (4,5): self.appleLoc[bonus-1]=loc self.appleDirection[bonus-3]=[random.randint(-10,10)*0.02,random.randint(-10,10)*0.02] else: self.appleLoc[bonus]=loc self.appleDirection[bonus]=[random.randint(-10,10)*0.02,random.randint(-10,10)*0.02] #screenshot def screenshot(self): name = appuifw.query(langue.typeyourname, "text") if not name==None: fichier=u"" fichier=file.name_dir(name) self.redraw(()) img.save(fichier) appuifw.note(langue.screensaveto+u":\n%s"%fichier, "conf") #s'il se cogne def wall(self): # if (tuple((self.wormLoc[0],self.wormLoc[1])) in self.fillarray or if self.score[2]==0: if (self.wormLoc[0]-3>self.fieldSize[1] or self.wormLoc[0]+3(self.fieldSize[3]-17) or self.wormLoc[1]+3<(self.fieldSize[2]-17)): img.rectangle((self.fieldSize[0],self.fieldSize[2],self.fieldSize[1],self.fieldSize[3]),fill=(255,0,0)) e32.ao_sleep(0.05) self.redraw(()) mode.playing=6 mode.exitflag=1 highScore=file.read_score() if highScore[1]<((self.score[0]+self.score[1])*mode.difficulte): nomHS = appuifw.query(langue.highscore2+u" !!!\n"+langue.typeyourname, "text") if not nomHS==None: file.write_score(nomHS,((self.score[0]+self.score[1])*mode.difficulte)) while self.fieldSize[0]self.fieldSize[1] or self.wormLoc[0]+3(self.fieldSize[3]-17) or self.wormLoc[1]+3<(self.fieldSize[2]-17)): self.wormSpeed[1]=-self.wormSpeed[1] self.score[2]-=1 img.rectangle((self.fieldSize[0],self.fieldSize[2],self.fieldSize[1],self.fieldSize[3]),fill=(255,0,0)) e32.ao_sleep(0.05) self.redraw(()) #Les pommes disparaissent et réapparaissent def apple_replace(self): if (self.appleTime[3]>0 and self.appleTime[3]=((self.appleTimeReplace)-self.appleWidth[5]): self.appleWidth[0]=(self.appleTimeReplace)-self.appleTime[3] for j in (4,5): if (self.appleTime[j]>0 and self.appleTime[j]=((self.appleTimeReplaceGhost)-self.appleWidth[6])) or (j==5 and self.appleTime[5]>=((self.appleTimeReplaceWall)-self.appleWidth[7]))): if j==4: self.appleWidth[3]=(self.appleTimeReplaceGhost)-self.appleTime[4] if j==5: self.appleWidth[4]=(self.appleTimeReplaceWall)-self.appleTime[5] #s'il trouve de la bouffe def apple_found(self): for bonus in range(0,5): if (bonus==0 or (bonus==1 and self.appleTime[1]>0) or (bonus==2 and self.appleTime[2]>0) or (bonus==3 and self.appleTime[4]>0) or (bonus==4 and self.appleTime[5]>0)): loc=self.appleLoc[bonus] if ((self.wormLoc[0]-loc[0])<(self.appleWidth[bonus]*0.6) and (self.wormLoc[0]-loc[0])>-(self.appleWidth[bonus]*0.6) and (self.wormLoc[1]-loc[1])<(self.appleWidth[bonus]*0.6) and (self.wormLoc[1]-loc[1])>-(self.appleWidth[bonus]*0.6)): if bonus==0: self.score[0]+=10 self.appleWidth[0]=self.appleWidth[5] self.place_apple(0) if self.wormLength=self.appleBeginMove: self.appleTime[0]=self.appleTimeMove if self.score[0]>=self.appleBeginReplace: if self.appleTimeReplace>self.appleTimeReplaceMin: self.appleTimeReplace-=10 self.appleTime[3]=self.appleTimeReplace/2 if self.score[0]==self.appleBeginGhost: self.place_apple(4) self.appleTime[4]=self.appleTimeReplaceGhost/2 if self.score[0]==self.appleBeginWall: self.place_apple(5) self.appleTime[5]=self.appleTimeReplaceWall/2 if bonus==1: self.score[1]+=self.appleTime[1] self.appleLoc[1]=None self.appleTime[1]=0 if bonus==2: self.score[2]+=1 self.appleLoc[2]=None self.appleTime[2]=0 if bonus==3: self.wormBadTime=self.wormBadTimeInit self.wormBadTimeInit+=10 self.appleWidth[3]=self.appleWidth[6] self.appleTime[4]=self.appleTimeReplaceGhost/2 self.place_apple(4) if bonus==4: if (self.fieldSize[1]-self.fieldSize[0])>55: for i in range(0,5): self.fieldSize[0]+=1 self.fieldSize[1]-=1 self.fieldSize[2]+=1 self.fieldSize[3]-=1 self.redraw(()) e32.ao_sleep(0.02) self.score[3]+=5 img.rectangle((self.fieldSize[0],self.fieldSize[2],self.fieldSize[1],self.fieldSize[3]),fill=(0,0,0)) loc=self.appleLoc[0] if (loc[0]>(self.fieldSize[1]) or loc[0](self.fieldSize[3]-17) or loc[1](self.fieldSize[1]) or loc[0](self.fieldSize[3]-17) or loc[1]self.wormLength: try: loc=self.wormLocs[0] del self.fillarray[loc] del self.wormLocs[0] except: loc=self.wormLocs[1] del self.fillarray[loc] del self.wormLocs[1] #il efface les pommes def apple_delete(self): for bonus in range(0,6): if self.appleTime[bonus]==1: self.appleTime[bonus]=0 if bonus==0: self.appleTime[0]=self.appleTimeMove loc=self.appleLoc[0] dir=self.appleDirection[0] loc[0]+=(dir[0]*((self.score[0]-(self.appleBeginMove-10))*self.appleSpeed*0.5)) loc[1]+=(dir[1]*((self.score[0]-(self.appleBeginMove-10))*self.appleSpeed)) if (loc[0]>(self.fieldSize[1]) or loc[0](self.fieldSize[3]-17) or loc[1]0: loc=self.appleLoc[j-1] dir=self.appleDirection[j-3] loc[0]+=(dir[0]*((self.score[0]-(self.appleBeginMove-10))*self.appleSpeed*0.5)) loc[1]+=(dir[1]*((self.score[0]-(self.appleBeginMove-10))*self.appleSpeed)) if (loc[0]>(self.fieldSize[1]-3) or loc[0]<(self.fieldSize[0]+2)): dir[0]=-dir[0] if (loc[1]>(self.fieldSize[3]-17) or loc[1]<(self.fieldSize[2]-17)): dir[1]=-dir[1] self.appleLoc[j-1]=loc self.appleDirection[j-3]=dir elif bonus==3: self.appleTime[3]=self.appleTimeReplace if self.appleTime[3]<30: self.appleTime[3]=30 self.place_apple(0) elif (bonus==4 or bonus==5): if bonus==4: self.appleTime[4]=self.appleTimeReplaceGhost else: self.appleTime[5]=self.appleTimeReplaceWall self.place_apple(bonus) else: self.appleLoc[bonus]=None #il va mieux def worm_better(self): if self.wormBadTime==1 : self.wormBadTime=0 self.abc=[250,250,250,0] self.maxABC=[250,250,250] self.minABC=[25,25,25] #mouvement du worm def worm_move(self): if mode.acce==0: self.wormSpeed[0]*=self.frottement self.wormSpeed[1]*=self.frottement if keyboard.is_down(EScancodeLeftArrow): self.wormSpeed[0] -= self.acceleration*(self.score[0]*0.01+1) if keyboard.is_down(EScancodeRightArrow): self.wormSpeed[0] += self.acceleration*(self.score[0]*0.01+1) if keyboard.is_down(EScancodeDownArrow): self.wormSpeed[1] += self.acceleration*(self.score[0]*0.01+1) if keyboard.is_down(EScancodeUpArrow): self.wormSpeed[1] -= self.acceleration*(self.score[0]*0.01+1) if keyboard.is_down(EScancode4): self.wormSpeed[0] -= self.acceleration*(self.score[0]*0.01+1) if keyboard.is_down(EScancode6): self.wormSpeed[0] += self.acceleration*(self.score[0]*0.01+1) if keyboard.is_down(EScancode8): self.wormSpeed[1] += self.acceleration*(self.score[0]*0.01+1) if keyboard.is_down(EScancode2): self.wormSpeed[1] -= self.acceleration*(self.score[0]*0.01+1) if keyboard.is_down(EScancode1): self.wormSpeed[0] -= self.acceleration*(self.score[0]*0.01+1) self.wormSpeed[1] -= self.acceleration*(self.score[0]*0.01+1) if keyboard.is_down(EScancode3): self.wormSpeed[0] += self.acceleration*(self.score[0]*0.01+1) self.wormSpeed[1] -= self.acceleration*(self.score[0]*0.01+1) if keyboard.is_down(EScancode7): self.wormSpeed[0] -= self.acceleration*(self.score[0]*0.01+1) self.wormSpeed[1] += self.acceleration*(self.score[0]*0.01+1) if keyboard.is_down(EScancode9): self.wormSpeed[0] += self.acceleration*(self.score[0]*0.01+1) self.wormSpeed[1] += self.acceleration*(self.score[0]*0.01+1) else: acce.ax+=(self.score[0]*0.002*acce.ax) acce.ay+=(self.score[0]*0.002*acce.ay) self.wormSpeed[0]+=acce.ax*mode.difficulte self.wormSpeed[1]+=acce.ay*mode.difficulte if self.wormSpeed[0]>(self.wormSpeedLimit*mode.difficulte*(self.score[0]*0.1+10)): self.wormSpeed[0]=(self.wormSpeedLimit*mode.difficulte*(self.score[0]*0.1+10)) if self.wormSpeed[0]<-(self.wormSpeedLimit*mode.difficulte*(self.score[0]*0.1+10)): self.wormSpeed[0]=-(self.wormSpeedLimit*mode.difficulte*(self.score[0]*0.1+10)) if self.wormSpeed[1]>(self.wormSpeedLimit*mode.difficulte*(self.score[0]*0.1+10)): self.wormSpeed[1]=(self.wormSpeedLimit*mode.difficulte*(self.score[0]*0.1+10)) if self.wormSpeed[1]<-(self.wormSpeedLimit*mode.difficulte*(self.score[0]*0.1+10)): self.wormSpeed[1]=-(self.wormSpeedLimit*mode.difficulte*(self.score[0]*0.1+10)) self.wormLoc[0]+=self.wormSpeed[0] self.wormLoc[1]+=self.wormSpeed[1] self.wormLoc[2]=angle.snake(self.wormSpeed[0],self.wormSpeed[1]) #temps + 1 def time(self): for bonus in range(0,6): if self.appleTime[bonus]>0: self.appleTime[bonus]-=1 if self.wormBadTime>0: self.wormBadTime-=1 #fonction principale def run(self): self. __init__() while not mode.exitflag: self.apple_replace() self.apple_found() self.apple_delete() self.worm_better() self.fillarray[tuple(self.wormLoc)]=1 self.wormLocs.append(tuple(self.wormLoc)) e32.ao_sleep(0.01) self.worm_move() self.time() self.worm_delete() fps.inc_frame() self.redraw(()) e32.reset_inactivity() self.wall() screenSize=[canvas.size[0],canvas.size[1]] img=graphics.Image.new((screenSize[0],screenSize[1])) file=GestionFile() mode=ModeDeJeu() snakepict=SnakePict() acce=Accelerometre() fps=ShowFps() img.clear(0) img.text((10,20),u"Loading : ..............................",(255,255,255)) canvas.blit(img) img.text((10,40),u"accelerometer",(255,255,255)) try: axyz.connect(acce.xyz) axyz.disconnect() mode.acce=1 img.text((canvas.size[0]-80,40),u"[ OK ]",(0,255,0)) except: mode.acce=0 img.text((canvas.size[0]-80,40),u"[ ERROR ]",(255,0,0)) canvas.blit(img) langue=Langue() file.make_dir() angle=Angle() snakepict.create_back() snakepict.create_apples() snakepict.create_snake() snakepict.create_head() e32.ao_sleep(0.1) blc=graphics.Image.new((screenSize[0],screenSize[1]), '1') blcMask = graphics.Image.new((screenSize[0],screenSize[1]), 'L') for i in range(0,26): maskcolor=(10*i,10*i,10*i) blcMask.clear(maskcolor) img.blit(blc,mask=blcMask) canvas.blit(img) e32.ao_sleep(0.01) pub() game=AcceSnake() menu() while mode.playing: appuifw.app.exit_key_handler=menu if mode.acce: axyz.connect(acce.xyz) game.run() if mode.acce: axyz.disconnect() sys.exit(appuifw.note(u"Bye Bye !!",'conf'))