Advertisement
phjoe

Swap Puzzle

Jan 31st, 2015
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # SWAP IMAGE Puzzle
  2. # joe, 31/01/2015
  3. import appuifw as A
  4. import graphics as G
  5.  
  6. class SwapIMG:
  7.  def __init__(self):
  8.   self.run,self.finished,self.swap=0,0,0
  9.   self.cur=[0,0]
  10.   self.pos,self.old_pos,self.match=[],[],[]
  11.   self.num=4
  12.   self.cur_index=[(x,y) for y in range(self.num) for x in range(self.num)]
  13.   self.mov=[None,None]
  14.   self.x0,self.y0=4,4
  15.   self.w=(min(size)-(self.x0*2))/self.num
  16.   self.h=(min(size)-(self.y0*2))/self.num
  17.   self.gb=None
  18.   A.app.screen='full'
  19.   self.c = A.Canvas(redraw_callback=self._redraw,event_callback=self._event)
  20.   A.app.body=self.c
  21.   A.app.menu=[(u'Select Image',self.select_pic),(u'Replay',self.replay)]
  22.   A.app.exit_key_handler=self.exit
  23.   self.play()
  24.  
  25.  def exit(self):
  26.   self.run=0
  27.  
  28.  def _redraw(self,rect):
  29.   if img:self.c.blit(img)
  30.  
  31.  def _event(self,sc):
  32.   k=sc['scancode']
  33.   if sc['type'] is not A.EEventKey:return
  34.   if not self.finished:
  35.    if k in (0xf,0x36): # 6 / kanan
  36.     self.cur[0]+=1
  37.     if self.cur[0]>self.num-1:
  38.      self.cur[0]=0
  39.      self.cur[1]+=1
  40.      if self.cur[1]>self.num-1:
  41.       self.cur[1]=0
  42.       self.cur[0]=0
  43.    elif k in (0xe,0x34): # 4 / kiri
  44.     self.cur[0]-=1
  45.     if self.cur[0]<0:
  46.      self.cur[0]=self.num-1
  47.      self.cur[1]-=1
  48.      if self.cur[1]<0:
  49.       self.cur[1]=self.num-1
  50.       self.cur[0]=self.num-1
  51.    elif k in (0x10,0x32): # 2 / atas
  52.     self.cur[1]-=1
  53.     if self.cur[1]<0:
  54.      self.cur[1]=self.num-1
  55.    elif k in (0x11,0x38): # 8 / bawah
  56.     self.cur[1]+=1
  57.     if self.cur[1]>self.num-1:
  58.      self.cur[1]=0
  59.    elif k in (0xa7,0x35): # OK / 5
  60.     if self.mov[0] is None:
  61.      self.mov[0]=self.cur[0] + self.cur[1]*self.num
  62.     else:
  63.      if self.mov[0]!=None:
  64.       self.mov[1],self.swap=self.cur[0] + self.cur[1]*self.num,1
  65.  
  66.  def gen_pos(self):
  67.   for i in xrange(self.num*self.num):
  68.    x=self.x0+((i%self.num)*self.w)
  69.    y=self.y0+((i/self.num)*self.h)
  70.    self.pos.append((x,y,x+self.w,y+self.h))
  71.   self.old_pos=[i for i in self.pos]
  72.   random.shuffle(self.pos)
  73.  
  74.  def select_pic(self):
  75.   p=fm.AskUser(ext=['.jpg','.png'])
  76.   if not p:return
  77.   try:
  78.    self.gb=None
  79.    self.gb=G.Image.open(p)
  80.    sz=(min(size)-(self.x0),min(size)-(self.y0))
  81.    if self.gb.size!=sz:
  82.     self.gb=self.gb.resize(sz)
  83.   except:self.gb=None
  84.   self.replay()
  85.  
  86.  def replay(self):
  87.   self.pos=self.old_pos=[]
  88.   self.match,self.finished=[],0
  89.   self.gen_pos()
  90.  
  91.  def play(self):
  92.   self.run=1
  93.   while self.run:
  94.    img.clear(180)
  95.    if self.gb:
  96.     img.rectangle((self.x0-2,self.y0-2,self.x0+2+(self.num*self.w),self.y0+2+(self.num*self.h)),0xfffffff)
  97.     for i in range(len(self.pos)):
  98.      cx,cy=(i%self.num),(i/self.num)
  99.      img.blit(self.gb,target=(self.x0+cx*self.w,self.y0+cy*self.h),source=self.pos[i])
  100.  
  101.      if self.old_pos[i]==self.pos[i]:
  102.       if not self.finished:
  103.        # ceklist
  104.        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)
  105.        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)
  106.  
  107.     if not self.finished:
  108.      # kursor
  109.      dx=self.x0+(self.cur[0]*self.w)
  110.      dy=self.y0+(self.cur[1]*self.h)
  111.      img.rectangle((dx,dy,dx+self.w,dy+self.h),0xff0000,width=2)
  112.  
  113.     if self.mov[0]!=None:
  114.      # gambar kursor kalo ada yg dipilih
  115.      dx=self.x0 + (self.cur_index[self.mov[0]][0]*self.w)
  116.      dy=self.y0 + (self.cur_index[self.mov[0]][1]*self.h)
  117.      img.rectangle((dx,dy,dx+self.w,dy+self.h),0x00ff00,width=2)
  118.     txt=(u'Match: %s' %len(self.match),u'Complete')
  119.     img.text((5,size[1]-8),txt[self.finished],0xffffff,(u'',16,G.FONT_BOLD))
  120.  
  121.     if self.swap:
  122.      # susun list
  123.      self.pos[self.mov[0]],self.pos[self.mov[1]]=self.pos[self.mov[1]],self.pos[self.mov[0]]
  124.      self.swap,self.mov=0,[None,None]
  125.  
  126.     # cek posisi
  127.     for i in range(len(self.pos)):
  128.      if self.old_pos[i]==self.pos[i]:
  129.       if i not in self.match:
  130.        self.match.append(i)
  131.  
  132.     # cek jika sudah benar semua
  133.     if len(self.match)==len(self.pos):
  134.      self.match,self.finished=[],1
  135.    else:
  136.     img.text((5,20),u'Pilih Gambar',0xffffff,(u'',16,G.FONT_BOLD))
  137.    self._redraw(0)
  138.    A.e32.ao_sleep(1e-04)
  139.  
  140.  
  141. import random,powlite_fm
  142. size=G.sysinfo.display_pixels()
  143. img=G.Image.new(size)
  144. fm=powlite_fm.manager()
  145.  
  146. SwapIMG()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement