Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # SWAP IMAGE Puzzle
- # joe, 31/01/2015
- import appuifw as A
- import graphics as G
- class SwapIMG:
- def __init__(self):
- self.run,self.finished,self.swap=0,0,0
- self.cur=[0,0]
- self.pos,self.old_pos,self.match=[],[],[]
- self.num=4
- self.cur_index=[(x,y) for y in range(self.num) for x in range(self.num)]
- self.mov=[None,None]
- self.x0,self.y0=4,4
- self.w=(min(size)-(self.x0*2))/self.num
- self.h=(min(size)-(self.y0*2))/self.num
- self.gb=None
- A.app.screen='full'
- self.c = A.Canvas(redraw_callback=self._redraw,event_callback=self._event)
- A.app.body=self.c
- A.app.menu=[(u'Select Image',self.select_pic),(u'Replay',self.replay)]
- A.app.exit_key_handler=self.exit
- self.play()
- def exit(self):
- self.run=0
- def _redraw(self,rect):
- if img:self.c.blit(img)
- def _event(self,sc):
- k=sc['scancode']
- if sc['type'] is not A.EEventKey:return
- if not self.finished:
- if k in (0xf,0x36): # 6 / kanan
- self.cur[0]+=1
- if self.cur[0]>self.num-1:
- self.cur[0]=0
- self.cur[1]+=1
- if self.cur[1]>self.num-1:
- self.cur[1]=0
- self.cur[0]=0
- elif k in (0xe,0x34): # 4 / kiri
- self.cur[0]-=1
- if self.cur[0]<0:
- self.cur[0]=self.num-1
- self.cur[1]-=1
- if self.cur[1]<0:
- self.cur[1]=self.num-1
- self.cur[0]=self.num-1
- elif k in (0x10,0x32): # 2 / atas
- self.cur[1]-=1
- if self.cur[1]<0:
- self.cur[1]=self.num-1
- elif k in (0x11,0x38): # 8 / bawah
- self.cur[1]+=1
- if self.cur[1]>self.num-1:
- self.cur[1]=0
- elif k in (0xa7,0x35): # OK / 5
- if self.mov[0] is None:
- self.mov[0]=self.cur[0] + self.cur[1]*self.num
- else:
- if self.mov[0]!=None:
- self.mov[1],self.swap=self.cur[0] + self.cur[1]*self.num,1
- def gen_pos(self):
- for i in xrange(self.num*self.num):
- x=self.x0+((i%self.num)*self.w)
- y=self.y0+((i/self.num)*self.h)
- self.pos.append((x,y,x+self.w,y+self.h))
- self.old_pos=[i for i in self.pos]
- random.shuffle(self.pos)
- def select_pic(self):
- p=fm.AskUser(ext=['.jpg','.png'])
- if not p:return
- try:
- self.gb=None
- self.gb=G.Image.open(p)
- sz=(min(size)-(self.x0),min(size)-(self.y0))
- if self.gb.size!=sz:
- self.gb=self.gb.resize(sz)
- except:self.gb=None
- self.replay()
- def replay(self):
- self.pos=self.old_pos=[]
- self.match,self.finished=[],0
- self.gen_pos()
- def play(self):
- self.run=1
- while self.run:
- img.clear(180)
- if self.gb:
- img.rectangle((self.x0-2,self.y0-2,self.x0+2+(self.num*self.w),self.y0+2+(self.num*self.h)),0xfffffff)
- for i in range(len(self.pos)):
- cx,cy=(i%self.num),(i/self.num)
- img.blit(self.gb,target=(self.x0+cx*self.w,self.y0+cy*self.h),source=self.pos[i])
- if self.old_pos[i]==self.pos[i]:
- if not self.finished:
- # ceklist
- img.rectangle( (self.old_pos[i][0]+1,self.old_pos[i][1]+1,self.old_pos[i][0]+12,self.old_pos[i][1]+12),0xffffff,0)
- img.line((self.old_pos[i][0]+3,self.old_pos[i][1]+6,self.old_pos[i][0]+4,self.old_pos[i][1]+8,self.old_pos[i][0]+8,self.old_pos[i][1]+3),0xffffff,width=2)
- if not self.finished:
- # kursor
- dx=self.x0+(self.cur[0]*self.w)
- dy=self.y0+(self.cur[1]*self.h)
- img.rectangle((dx,dy,dx+self.w,dy+self.h),0xff0000,width=2)
- if self.mov[0]!=None:
- # gambar kursor kalo ada yg dipilih
- dx=self.x0 + (self.cur_index[self.mov[0]][0]*self.w)
- dy=self.y0 + (self.cur_index[self.mov[0]][1]*self.h)
- img.rectangle((dx,dy,dx+self.w,dy+self.h),0x00ff00,width=2)
- txt=(u'Match: %s' %len(self.match),u'Complete')
- img.text((5,size[1]-8),txt[self.finished],0xffffff,(u'',16,G.FONT_BOLD))
- if self.swap:
- # susun list
- self.pos[self.mov[0]],self.pos[self.mov[1]]=self.pos[self.mov[1]],self.pos[self.mov[0]]
- self.swap,self.mov=0,[None,None]
- # cek posisi
- for i in range(len(self.pos)):
- if self.old_pos[i]==self.pos[i]:
- if i not in self.match:
- self.match.append(i)
- # cek jika sudah benar semua
- if len(self.match)==len(self.pos):
- self.match,self.finished=[],1
- else:
- img.text((5,20),u'Pilih Gambar',0xffffff,(u'',16,G.FONT_BOLD))
- self._redraw(0)
- A.e32.ao_sleep(1e-04)
- import random,powlite_fm
- size=G.sysinfo.display_pixels()
- img=G.Image.new(size)
- fm=powlite_fm.manager()
- SwapIMG()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement