# coding=utf-8 #必須指定 # df_maze.py #!/usr/bin/env python import numpy as np import sys , traceback , os import pdb from collections import deque import math from struct import * import random if sys.version[0] == "2": import Tkinter as tk else: import tkinter as tk import copy import math from collections import deque from p3drect import Room3d debug_flag = False class Maze(): # def __init__(self,nx, ny, ix, iy): def __init__(self): print ("Search data file..") maze = [] argvs = sys.argv argc = len(argvs) if argc >=2: stno = argvs[1] else: stno = '1' sokodat = 'xsokoban/screens/screen.'+stno fs = open(sokodat) print (fs) cc = 0 nxcount = [] while True: a = (fs.readline()) if a=="": break nxcount.append(len(a)) maze.append([]) for ch in a: maze[cc].append([ch]) cc += 1 # for ln in maze: # print (ln) nx = max(nxcount)-1 ny = cc self.nx = nx self.ny = ny self.mazemap = [] cc = 0 for yl in range(len(maze)): self.mazemap.append([]) for xi in range(nx): if xi >= len(maze[cc]) -1: ch = [' '] else: ch = maze[yl][xi] print (ch[0]), self.mazemap[cc].append(ch) self.mazemap[cc].reverse() # print (self.mazemap[cc]) cc += 1 print # reversed(self.mazemap) # room data for y in range(ny): for x in range(nx): # print (self.mazemap[y][x][0]), # check outside if x <= 0: self.mazemap[y][x].append('W') if x >= nx-1: self.mazemap[y][x].append('E') if y <= 0: self.mazemap[y][x].append('N') if y >= ny-1: self.mazemap[y][x].append('S') # check wall N nb_n_x = x nb_n_y = y - 1 if 0 <= nb_n_x <= (nx-1) and 0 <= nb_n_y <= (ny-1): if '#' in self.mazemap[nb_n_y][nb_n_x]: self.mazemap[y][x].append('N') # check wall S nb_s_x = x nb_s_y = y + 1 if 0 <= nb_s_x <= (nx-1) and 0 <= nb_s_y <= (ny-1): if '#' in self.mazemap[nb_s_y][nb_s_x]: self.mazemap[y][x].append('S') # check wall W nb_w_x = x -1 nb_w_y = y if 0 <= nb_w_x <= (nx-1) and 0 <= nb_w_y <= (ny-1): if '#' in self.mazemap[nb_w_y][nb_w_x]: self.mazemap[y][x].append('W') # check wall E nb_e_x = x + 1 nb_e_y = y if 0 <= nb_e_x <= (nx-1) and 0 <= nb_e_y <= (ny-1): if '#' in self.mazemap[nb_e_y][nb_e_x]: self.mazemap[y][x].append('E') # print def mazewall(self): return self.mazemap class Smallworld(): def __init__(self): # Maze dimensions (ncols, nrows) # nx, ny = 15, 7 # self.nx = float(nx) # self.ny = float(ny) # Maze entry position # ix, iy = 2, 2 maze = Maze() # make a sohko instance self.nx = maze.nx self.ny = maze.ny self.cellx = 20.0 self.celly = 20.0 self.walldivx = 5 self.walldivy = 5 self.height = 20.0 self.rm3d = Room3d() self.rm3d.c0.title('sokoban') self.rm3d.c0.bind("",self.quit) self.rm3d.c0.bind("",self.initmx) self.rm3d.c0.bind("",self.viewval) self.rm3d.c0.bind("",self.viewval2) self.rm3d.c0.bind("" ,self.keyup) self.rm3d.c0.bind("" ,self.keydown) self.rm3d.c0.bind("" ,self.keyleft) self.rm3d.c0.bind("" ,self.keyright) self.rm3d.c0.bind("" ,self.toggle_rotsw) self.rm3d.c0.bind("" ,self.height_sw) self.rm3d.c0.bind("" ,self.packman_debug) self.rm3d.c0.bind("" ,self.follow_sw) self.rm3d.c0.bind("" ,self.step) self.rm3d.c0.bind("" ,self.pushcarge) self.rm3d.c0.bind("" ,self.upandpush) valtext = "key assign:\n , view point height\n , distance\n s toggle rotate" # self.rm3d.c6.create_text(30,30,textvariable=self.rm3d.s.get(),fill="white",justify='left',anchor='nw') self.rm3d.s2.set('key assign ------\n h: toggle view point height.\n d: view map\n p: push cargo\n l:push & walk') self.rm3d.s1.set(sys.version) self.rm3d.s3.set('[ ]') # build wall rectangle self.payload_qth = [] self.mazemap = maze.mazewall() self.wall = self.build_a_world(self.mazemap) # self.rm3d.dispwall(self.wall) self.rm3d.dest = [self.maxx/2.0 , self.maxy/2.0,0] self.rm3d.dest = [0.0,0.0,0.0] self.rm3d.cposx = - 100.0 self.rm3d.cposy = - 100.0 self.rm3d.cposz = 300.0 self.rm3d.cpos = [self.rm3d.cposx,self.rm3d.cposy,self.rm3d.cposz] self.rotsw = False xa = 180.0 self.rotang = 180 self.za = 10.0 ix = self.ix iy = self.iy self.qthx = float(ix) self.qthy = float(iy) self.xpos = int(self.qthx) self.ypos = int(self.qthy) self.rl = self.cellx * 3.0 self.rls = self.cellx * 0.38 self.qthxinc = 0.0 self.qthyinc = 0.0 self.walk = 10 self.here = 1.2 self.sidewalk = 0 self.kickoff = False hand = ['N','E','S','W'] # hand = ['N','W','S','E'] waydir = 2 waydirinc = [ [0.0,-0.1],[0.1,0],[0,0.1],[-0.1,0]] followang = [180, 90, 0,270] # use by index variable waydir # followang = [ 0,270,180, 90] # xque = deque(maxlen = 10) # yque = deque(maxlen = 10) xque = deque([0,0,0,0,0,0,0,0,0,0]) yque = deque([0,0,0,0,0,0,0,0,0,0]) packinc = [0.0,0.0] xp2 = 0 yp2 = 0 self.cor_debug = False self.follow = False rotangtemp = 0 self.rm3d.mx = 7.0 self.rm3d.my = 1.0 self.rm3d.xcenter = 0.0 self.rm3d.ycenter = 0.0 self.rm3d.threth = 8.0 # self.rm3d.threth = 0.2 self.rm3d.initmx = False # diseble auto gain in rm3d.shift2center() self.rm3d.width= 1 self.rm3d.focus = 20 self.qthxp = 3.0 self.qthyp = 3.0 self.qthzp = 0.0 self.packtoggle = False self.packsizel = 15.0 payload = self.generate_packman() self.hita = False self.hitw = False self.hitc = False self.pushinc = 0 self.pushkickoff = False self.pushwalk = 0 self.pushandwalk = False ##### loop top ####################### while True: if True: destoffsetx = np.sin(xa)*self.rl destoffsety = np.cos(xa)*self.rl destoffsetxs = np.sin(xa)*self.rls destoffsetys = np.cos(xa)*self.rls self.rm3d.cposx = self.qthx * self.cellx + self.cellx/2.0 - self.maxx/2.0 self.rm3d.cposy = self.qthy * self.celly + self.celly/2.0 - self.maxy/2.0 self.rm3d.cposz = self.za self.rm3d.cpos = [ self.rm3d.cposx , self.rm3d.cposy , self.rm3d.cposz] self.rm3d.dest = [self.rm3d.cposx + destoffsetx ,self.rm3d.cposy + destoffsety,0.1] self.standin = [[ [ self.rm3d.cposx+destoffsetxs-self.here , self.rm3d.cposy+destoffsetys-self.here , 2], [ self.rm3d.cposx+destoffsetxs-self.here , self.rm3d.cposy+destoffsetys+self.here , 2], [ self.rm3d.cposx+destoffsetxs+self.here , self.rm3d.cposy+destoffsetys+self.here , 2], [ self.rm3d.cposx+destoffsetxs+self.here , self.rm3d.cposy+destoffsetys-self.here , 2], [0.9],['#fafdfe'],[56] ]] ##### aux object if True: st = self.rm3d.solve(self.standin) st2 = self.rm3d.reorder(st,[]) st3 = self.rm3d.shift2center(st) self.rm3d.drawaux(st3) if True: ########## packman ############ if True: hogepack = [] for cell in self.payload_qth: cposxp = cell[0] * self.cellx - self.maxx/2.0 cposyp = cell[1] * self.celly - self.maxy/2.0 cposzp = self.qthzp hogetemp = self.rm3d.solve_pack(payload[0],[cposxp,cposyp,cposzp]) hogepack+=hogetemp ##### main object hoge = [] self.imax = 0 self.imin = 32767 for cell in self.wall: hoge2 = self.rm3d.solve(cell) for box in hoge2: if len(box) > 2: hoge.append(box) if box[4][0] > self.imax: self.imax =copy.copy( box[4][0]) if self.imin > box[4][0]: self.imin = box[4][0] doge = self.rm3d.reorder(hoge,hogepack) boge = self.rm3d.shift2center(doge) self.rm3d.drawwall(boge) self.doge = boge ##### walk self.xpos = int(self.qthx+0.49) self.ypos = int(self.qthy+0.49) if self.walk != 0: self.qthx += self.qthxinc self.qthy += self.qthyinc self.walk -= 1 elif self.kickoff and not self.hitw and not self.hita and (not self.hitc or self.pushandwalk): # elif self.kickoff and not self.hitw and not self.hita: self.kickoff = False if 340 < self.rotang or self.rotang < 20: if not 'S' in self.mazemap[self.ypos][self.xpos] : self.qthxinc = 0.0 self.qthyinc = 0.25 self.rotang = 0 self.walk = 4 else: print ("Hit wall S") pass elif 60 < self.rotang < 110: if not 'E' in self.mazemap[self.ypos][self.xpos] : self.qthxinc = 0.25 self.qthyinc = 0.0 self.rotang = 90 self.walk = 4 else: print ("Hit wall E") pass elif 160