Advertisement
phjoe

IMG Puzzle v2

Feb 2nd, 2015
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # IMAGE Puzzle v2
  2. # joe, 03/01/2015
  3. import appuifw as A
  4. import graphics as G
  5.  
  6. class SwapIMG:
  7.  def __init__(self):
  8.   self.state=''
  9.   self.run,self.finished,self.swap,self.hint=0,0,0,0
  10.   self.pos,self.old_pos,self.match=[],[],[]
  11.   self.num=4
  12.   self.mov=[None,None]
  13.   self.gb=[None,None]
  14.   self.cur=[0,0]
  15.   self.cur_m=0
  16.   self.cur_index=[(x,y) for y in range(self.num) for x in range(self.num)]
  17.   self.x0,self.y0=4,4
  18.   self.w=(min(size)-(self.x0*2))/self.num
  19.   self.h=(min(size)-(self.y0*2))/self.num
  20.   self.cur_f,self.page,self.offset,self.fs=0,0,12,0
  21.   self.files=[]
  22.   A.app.screen='full'
  23.   self.c=A.Canvas(redraw_callback=self._redraw,event_callback=self._event)
  24.   A.app.body=self.c
  25.   A.app.exit_key_handler=lambda:None
  26.   self.play()
  27.  
  28.  def exit(self):
  29.   self.run=0
  30.  
  31.  def _redraw(self,rect):
  32.   if img:self.c.blit(img)
  33.  
  34.  def _event(self,sc):
  35.   k=sc['scancode']
  36.   self.hint=0
  37.   if self.state=='':
  38.    if sc['type']==3 and k==164:
  39.     self.state,self.cur_m='menu',0
  40.    if sc['type'] is not A.EEventKey:return
  41.    if not self.finished:
  42.     if k in (0xf,0x36):
  43.      self.cur[0]+=1
  44.      if self.cur[0]>self.num-1:
  45.       self.cur[0]=0
  46.       self.cur[1]+=1
  47.       if self.cur[1]>self.num-1:
  48.        self.cur[1]=0
  49.        self.cur[0]=0
  50.     elif k in (0xe,0x34):
  51.      self.cur[0]-=1
  52.      if self.cur[0]<0:
  53.       self.cur[0]=self.num-1
  54.       self.cur[1]-=1
  55.       if self.cur[1]<0:
  56.        self.cur[1]=self.num-1
  57.        self.cur[0]=self.num-1
  58.     elif k in (0x10,0x32):
  59.      self.cur[1]-=1
  60.      if self.cur[1]<0:
  61.       self.cur[1]=self.num-1
  62.     elif k in (0x11,0x38):
  63.      self.cur[1]+=1
  64.      if self.cur[1]>self.num-1:
  65.       self.cur[1]=0
  66.     elif k==0x37:
  67.      self.hint=1
  68.     elif k==0x30:
  69.      self.replay()
  70.     elif k in (0xa7,0x35):
  71.      if self.mov[0] is None:
  72.       self.mov[0]=self.cur[0] + self.cur[1]*self.num
  73.      else:
  74.       if self.mov[0]!=None:
  75.        self.mov[1],self.swap=self.cur[0] + self.cur[1]*self.num,1
  76.   elif self.state=='menu':
  77.    if sc['type']==3 and k in (164,165):
  78.     self.state=''
  79.    if sc['type'] is not A.EEventKey:return
  80.    lem=len(self.list_menu)-1
  81.    if k in (0x10,0x32):
  82.     self.cur_m-=1
  83.     if self.cur_m<0:
  84.      self.cur_m=lem
  85.    elif k in (0x11,0x38):
  86.     self.cur_m+=1
  87.     if self.cur_m>lem:
  88.      self.cur_m=0
  89.    elif k in (0xa7,0x35):
  90.     if callable(self.list_menu[self.cur_m][1]):
  91.      self.state=''
  92.      self.list_menu[self.cur_m][1]()
  93.   elif self.state=='fman':
  94.    if sc['type']==3 and k==165:
  95.     self.state,self.fs='',0
  96.     self.gb[0]=self.gb[1]
  97.    if sc['type'] is not A.EEventKey:return
  98.    if k in (0x11,0x38):
  99.     self.cur_f+=1
  100.     if self.cur_f>self.offset-1:
  101.      self.page+=1
  102.      self.cur_f=0
  103.     if self.page*self.offset+self.cur_f>=len(self.files):
  104.       self.page=0
  105.       self.cur_f=0
  106.    elif k in (0x10,0x32):
  107.     self.cur_f-=1
  108.     if self.cur_f<0:
  109.      self.page-=1
  110.      self.cur_f=self.offset-1
  111.     if self.page<0:
  112.      self.page=len(self.files)/self.offset
  113.      self.cur_f=(len(self.files)-1)-self.page*self.offset
  114.    elif k==0x2a:
  115.     self.page-=1
  116.     self.cur_f=0
  117.     if self.page<0:
  118.      self.page=len(self.files)/self.offset
  119.      self.cur_f=0
  120.    elif k==0x7f:
  121.     self.page+=1
  122.     if self.page<len(self.files)/self.offset:
  123.      self.cur_f=self.offset-1
  124.     else:
  125.      self.cur_f = (len(self.files)-1)-self.page*self.offset
  126.     if self.page > len(self.files)/self.offset:
  127.      self.page=0
  128.      self.cur_f=self.offset-1
  129.    elif k in (0xa7,0x35):
  130.     if self.fs:
  131.      p=os.path.join(img_dir,self.files[self.page*self.offset+self.cur_f])
  132.      try:
  133.       self.gb[0]=None
  134.       self.gb[0]=G.Image.open(p)
  135.       sz=(min(size)-(self.x0),min(size)-(self.y0))
  136.       if self.gb[0].size!=sz:
  137.        self.gb[0]=self.gb[0].resize(sz)
  138.      except:
  139.       self.gb=[None,None]
  140.      self.state=''
  141.      self.replay()
  142.  
  143.  def _get_pos(self):
  144.   for i in xrange(self.num*self.num):
  145.    x=self.x0+((i%self.num)*self.w)
  146.    y=self.y0+((i/self.num)*self.h)
  147.    self.pos.append((x,y,x+self.w,y+self.h))
  148.   self.old_pos=[i for i in self.pos]
  149.   random.shuffle(self.pos)
  150.  
  151.  def select_pic(self):
  152.   if not len(self.files):
  153.    self.files=map(dec,filter(lambda f:os.path.isfile(os.path.join(img_dir,f)),os.listdir(img_dir)))
  154.   self.gb[1]=self.gb[0]
  155.   self.state='fman'
  156.  
  157.  def replay(self):
  158.   self.pos=self.old_pos=[]
  159.   self.match,self.finished=[],0
  160.   self._get_pos()
  161.  
  162.  def _checkpos(self):
  163.   for i in range(len(self.pos)):
  164.    if self.old_pos[i]==self.pos[i]:
  165.     if i not in self.match:
  166.      self.match.append(i)
  167.  
  168.  def _checkall(self):
  169.   if len(self.match)==len(self.pos):
  170.    self.match,self.finished=[],1
  171.  
  172.  def _swaplist(self):
  173.   self.pos[self.mov[0]],self.pos[self.mov[1]]=self.pos[self.mov[1]],self.pos[self.mov[0]]
  174.   self.swap,self.mov=0,[None,None]
  175.  
  176.  def _draw_f(self):
  177.   self.gb[0],self.fs=None,1
  178.   x,y,th=5,30,14
  179.   if len(self.files)-self.page*self.offset<self.offset:mx=len(self.files)-self.page*self.offset
  180.   else:mx=self.offset
  181.   img.rectangle((x-3,y+3+((self.cur_f-1)*th),size[0]-2,y+3+((self.cur_f-1)*th+th)),fill=h_color)
  182.   for i in range(0,mx):
  183.    col=(txt_color,foc_color)[i==self.cur_f]
  184.    img.text((x,y+i*th),self.files[i+self.page*self.offset],col)
  185.   img.text((x,y-15),u'%s' %img_dir,txt_color,'legend')
  186.   img.text((size[0]-35,size[1]-5),u'Back',txt_color,'legend')
  187.  
  188.  def _draw_m(self):
  189.   menu=[(u'Select Image',self.select_pic),(u'Replay (0)',self.replay),(u'Show Match (7)',lambda:None),(u'About',lambda:None),(u'Exit',self.exit)]
  190.   if not self.gb[0]:
  191.    menu.pop(1)
  192.    menu.pop(1)
  193.   self.list_menu=menu
  194.   lem=len(menu)
  195.   x,y,th=1,size[1]-1,16
  196.   rw,rh=100,lem*th+(th/2)
  197.   img.rectangle((x,y-rh,x+rw,y),b_color,win_color)
  198.   img.rectangle((x+2,y-rh+3+(self.cur_m*th),x+rw-3,y-rh+3+(self.cur_m*th+th)),fill=h_color)
  199.   for i in range(len(menu)):
  200.    col=(txt_color,foc_color)[i==self.cur_m]
  201.    img.text((x+5,y-rh+th+(i*th)),u'%s' %menu[i][0],col,'legend')
  202.  
  203.  def _tsize(self,text,fnt):
  204.   if not isinstance(text,unicode):
  205.    text=unicode(text)
  206.   m=img.measure_text(text,font=fnt)[0]
  207.   w,h=(m[2]-m[0],m[3]-m[1])
  208.   return (w,h)
  209.  
  210.  def play(self):
  211.   self.run=1
  212.   while self.run:
  213.    img.clear(bg_color)
  214.    if self.gb[0]:
  215.     img.rectangle((self.x0-2,self.y0-2,self.x0+2+(self.num*self.w),self.y0+2+(self.num*self.h)),b_color)
  216.     for i in range(len(self.pos)):
  217.      cx,cy=(i%self.num),(i/self.num)
  218.      img.blit(self.gb[0],target=(self.x0+cx*self.w,self.y0+cy*self.h),source=self.pos[i])
  219.  
  220.      if self.old_pos[i]==self.pos[i]:
  221.       if not self.finished:
  222.        if self.hint:
  223.         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),b_color,win_color)
  224.         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),b_color,width=2)
  225.  
  226.     if not self.finished:
  227.      dx=self.x0+(self.cur[0]*self.w)
  228.      dy=self.y0+(self.cur[1]*self.h)
  229.      img.rectangle((dx,dy,dx+self.w,dy+self.h),cur_color,width=2)
  230.  
  231.     if self.mov[0]!=None:
  232.      dx=self.x0+(self.cur_index[self.mov[0]][0]*self.w)
  233.      dy=self.y0+(self.cur_index[self.mov[0]][1]*self.h)
  234.      img.rectangle((dx,dy,dx+self.w,dy+self.h),sel_color,width=2)
  235.     p=len(self.match)*100.0/len(self.pos)
  236.     txt,fnt=(u'%d match (%.0f %%)' %(len(self.match),p),u'Complete')[self.finished],'legend'
  237.     img.text((size[0]/2-self._tsize(txt,fnt)[0]/2,size[1]-14),txt,txt_color,fnt)
  238.  
  239.     self._checkpos()
  240.     self._checkall()
  241.     if self.swap:self._swaplist()
  242.    else:
  243.     if not self.state:
  244.      txt,fnt=u'No Image Selected','legend'
  245.      img.text((size[0]/2-self._tsize(txt,fnt)[0]/2,size[1]/2),txt,txt_color,fnt)
  246.  
  247.    if self.state=='menu':self._draw_m()
  248.    if self.state=='fman':self._draw_f()
  249.    self._redraw(())
  250.    A.e32.ao_sleep(1e-04)
  251.  
  252.  
  253. size=G.sysinfo.display_pixels()
  254. img=G.Image.new(size)
  255. import powlite_fm
  256. fm=powlite_fm.manager()
  257. import random
  258.  
  259. bg_color=0
  260. txt_color=0xcccccc
  261. foc_color=0xffffff
  262. b_color=0xffffff
  263. win_color=0x111111
  264. cur_color=0xef0000
  265. sel_color=0x00ef00
  266. h_color=0xfff
  267.  
  268. img_dir=u'e:\\images\\'
  269. def dec(x):
  270.  if len(x)>30:
  271.   x=x[:25]+'...'
  272.  return x.decode('u8')
  273.  
  274. A.e32.ao_sleep(0)
  275. import os
  276. SwapIMG()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement