Exemplo n.º 1
0
class HanoiEngine:
    """Play the Hanoi-game on a given TurtleScreen."""
    def __init__(self, canvas, nrOfDiscs, speed, moveCntDisplay=None):
        """Sets Canvas to play on as well as default values for
        number of discs and animation-speed.
        moveCntDisplay is a function with 1 parameter, which communicates
        the count of the actual move to the GUI containing the
        Hanoi-engine-canvas."""
        self.ts = canvas
        self.ts.tracer(False)
        # setup scene
        self.designer = RawTurtle(canvas, shape="square")
        self.designer.penup()
        self.designer.shapesize(0.5, 21)
        self.designer.goto(0,-80); self.designer.stamp()
        self.designer.shapesize(7, 0.5)
        self.designer.fillcolor('darkgreen')
        for x in -140, 0, 140:
            self.designer.goto(x,-5); self.designer.stamp()

        self.nrOfDiscs = nrOfDiscs
        self.speed = speed
        self.moveDisplay = moveCntDisplay
        self.running = False
        self.moveCnt = 0
        self.discs = [Disc(canvas) for i in range(10)]
        self.towerA = Tower(-140)
        self.towerB = Tower(0)
        self.towerC = Tower(140)
        self.ts.tracer(True)

    def setspeed(self):
        for disc in self.discs: disc.speed(self.speed)

    def move(self, src_tower, dest_tower):
        """move uppermost disc of source tower to top of destination
        tower."""
        dest_tower.push(src_tower.pop())
        self.moveCnt += 1
        self.moveDisplay(self.moveCnt)

    def reset(self):
        """Setup of (a new) game."""
        self.ts.tracer(False)
        self.moveCnt = 0
        self.moveDisplay(0)
        for t in self.towerA, self.towerB, self.towerC:
            while t != []: t.pop(200)
        for k in range(self.nrOfDiscs-1,-1,-1):
            self.discs[k].config(k, self.nrOfDiscs)
            self.towerA.push(self.discs[k])
        self.ts.tracer(True)

    def run(self):
        """run game ;-)
        return True if game is over, else False"""
        self.running = True
        ex7.play_hanoi(self, self.nrOfDiscs,
                             self.towerA, self.towerC, self.towerB)
        return True
Exemplo n.º 2
0
class HanoiEngine:
    """Play the Hanoi-game on a given TurtleScreen."""
    def __init__(self, canvas, nrOfDiscs, speed, moveCntDisplay=None):
        """Sets Canvas to play on as well as default values for
        number of discs and animation-speed.
        moveCntDisplay is a function with 1 parameter, which communicates
        the count of the actual move to the GUI containing the
        Hanoi-engine-canvas."""
        self.ts = canvas
        self.ts.tracer(False)
        # setup scene
        self.designer = RawTurtle(canvas, shape="square")
        self.designer.penup()
        self.designer.shapesize(0.5, 21)
        self.designer.goto(0,-80); self.designer.stamp()
        self.designer.shapesize(7, 0.5)
        self.designer.fillcolor('darkgreen')
        for x in -140, 0, 140:
            self.designer.goto(x,-5); self.designer.stamp()

        self.nrOfDiscs = nrOfDiscs
        self.speed = speed
        self.moveDisplay = moveCntDisplay
        self.running = False
        self.moveCnt = 0
        self.discs = [Disc(canvas) for i in range(10)]
        self.towerA = Tower(-140)
        self.towerB = Tower(0)
        self.towerC = Tower(140)
        self.ts.tracer(True)

    def setspeed(self):
        for disc in self.discs: disc.speed(self.speed)

    def move(self, src_tower, dest_tower):
        """move uppermost disc of source tower to top of destination
        tower."""
        dest_tower.push(src_tower.pop())
        self.moveCnt += 1
        self.moveDisplay(self.moveCnt)

    def reset(self):
        """Setup of (a new) game."""
        self.ts.tracer(False)
        self.moveCnt = 0
        self.moveDisplay(0)
        for t in self.towerA, self.towerB, self.towerC:
            while t != []: t.pop(200)
        for k in range(self.nrOfDiscs-1,-1,-1):
            self.discs[k].config(k, self.nrOfDiscs)
            self.towerA.push(self.discs[k])
        self.ts.tracer(True)

    def run(self):
        """run game ;-)
        return True if game is over, else False"""
        self.running = True
        ex7.play_hanoi(self, self.nrOfDiscs,
                             self.towerA, self.towerC, self.towerB)
        return True
Exemplo n.º 3
0
    def draw_polygon(self, node, screen):
        pen = RawTurtle(screen)
        pen.speed(0)
        pen.hideturtle()
        pen.penup()

        try:
            linecolor = node.attrs['color']
        except KeyError:
            linecolor = None
        try:
            fillcolor = node.attrs['fillcolor']
        except KeyError:
            fillcolor = None

        if linecolor is not None:
            pen.pencolor(*linecolor)
        else:
            pen.pencolor(*(0, 0, 0))

        polygon = node.data
        polygon = [self.translate_coords(screen, x) for x in polygon]
        points = to_tups(polygon)
        pen.goto(*(points[0]))
        pen.pendown()
        if fillcolor:
            pen.fillcolor(*fillcolor)
            pen.pencolor(*fillcolor)
            pen.begin_fill()
        for point in points[::-1]:
            pen.goto(*point)
        if fillcolor:
            pen.end_fill()
Exemplo n.º 4
0
class HanoiEngine:
    def __init__(self, canvas, nrOfDiscs, speed, moveCntDisplay=None):
        self.ts = canvas
        self.ts.tracer(False)
        # setup scene
        self.designer = RawTurtle(canvas, shape="square")
        self.designer.penup()
        self.designer.shapesize(0.5, 21)
        self.designer.goto(0, -80);
        self.designer.stamp()
        self.designer.shapesize(7, 0.5)
        self.designer.fillcolor('yellow')
        for x in -140, 0, 140:
            self.designer.goto(x, -5);
            self.designer.stamp()

        self.nrOfDiscs = nrOfDiscs
        self.speed = speed
        self.moveDisplay = moveCntDisplay
        self.running = False
        self.moveCnt = 0
        self.discs = [Disc(canvas) for i in range(10)]
        self.towerA = Pole(-140)
        self.towerB = Pole(0)
        self.towerC = Pole(140)
        self.ts.tracer(True)
Exemplo n.º 5
0
class HanoiEngine:
    def __init__(self, canvas, nrOfDiscs, speed, moveCntDisplay=None):
        self.ts = canvas
        self.ts.tracer(False)
        # setup scene
        self.designer = RawTurtle(canvas, shape="square")
        self.designer.penup()
        self.designer.shapesize(0.5, 21)
        self.designer.goto(0, -80)
        self.designer.stamp()
        self.designer.shapesize(7, 0.5)
        self.designer.fillcolor('yellow')
        for x in -140, 0, 140:
            self.designer.goto(x, -5)
            self.designer.stamp()

        self.nrOfDiscs = nrOfDiscs
        self.speed = speed
        self.moveDisplay = moveCntDisplay
        self.running = False
        self.moveCnt = 0
        self.discs = [Disc(canvas) for i in range(10)]
        self.towerA = Pole(-140)
        self.towerB = Pole(0)
        self.towerC = Pole(140)
        self.ts.tracer(True)

    def setspeed(self):
        for disc in self.discs:
            disc.speed(self.speed)

    def hanoi(self, n, src, dest, temp):
        if n > 0:
            for x in self.hanoi(n - 1, src, temp, dest):
                yield None
            yield self.move(src, dest)
            for x in self.hanoi(n - 1, temp, dest, src):
                yield None

    def move(self, src_tower, dest_tower):
        dest_tower.push(src_tower.pop())
        self.moveCnt += 1
        self.moveDisplay(self.moveCnt)

    def reset(self):
        self.ts.tracer(False)
        self.moveCnt = 0
        self.moveDisplay(0)
        for t in self.towerA, self.towerB, self.towerC:
            while t != []:
                t.pop(200)
        for k in range(self.nrOfDiscs - 1, -1, -1):
            self.discs[k].config(k, self.nrOfDiscs)
            self.towerA.push(self.discs[k])
        self.ts.tracer(True)
        self.HG = self.hanoi(self.nrOfDiscs, self.towerA, self.towerC,
                             self.towerB)

    def run(self):
        self.running = True
        try:
            while self.running:
                result = self.step()
            return result  # True iff done
        except StopIteration:  # game over
            return True

    def step(self):
        try:
            next(self.HG)
            return 2**self.nrOfDiscs - 1 == self.moveCnt
        except TclError:
            return False

    def stop(self):
        self.running = False
Exemplo n.º 6
0
class HanoiEngine:
    """Play the Hanoi-game on a given TurtleScreen."""
    def __init__(self, canvas, nrOfDiscs, speed, moveCntDisplay=None):
        """Sets Canvas to play on as well as default values for
        number of discs and animation-speed.
        moveCntDisplay is a function with 1 parameter, which communicates
        the count of the actual move to the GUI containing the
        Hanoi-engine-canvas."""
        self.ts = canvas
        self.ts.tracer(False)
        # setup scene
        self.designer = RawTurtle(canvas, shape="square")
        self.designer.penup()
        self.designer.shapesize(0.5, 21)
        self.designer.goto(0, -80)
        self.designer.stamp()
        self.designer.shapesize(7, 0.5)
        self.designer.fillcolor('darkgreen')
        for x in -140, 0, 140:
            self.designer.goto(x, -5)
            self.designer.stamp()

        self.nrOfDiscs = nrOfDiscs
        self.speed = speed
        self.moveDisplay = moveCntDisplay
        self.running = False
        self.moveCnt = 0
        self.discs = [Disc(canvas) for i in range(10)]
        self.towerA = Tower(-140)
        self.towerB = Tower(0)
        self.towerC = Tower(140)
        self.ts.tracer(True)

    def setspeed(self):
        for disc in self.discs:
            disc.speed(self.speed)

    def hanoi(self, n, src, dest, temp):
        """The classical recursive Towers-Of-Hanoi algorithm,
        implemented as a recursive generator, yielding always None
        plus an 'important' side effect - the next Hanoi move."""
        if n > 0:
            for x in self.hanoi(n - 1, src, temp, dest):
                yield None
            yield self.move(src, dest)
            for x in self.hanoi(n - 1, temp, dest, src):
                yield None

    def move(self, src_tower, dest_tower):
        """move uppermost disc of source tower to top of destination
        tower."""
        dest_tower.push(src_tower.pop())
        self.moveCnt += 1
        self.moveDisplay(self.moveCnt)

    def reset(self):
        """Setup of (a new) game."""
        self.ts.tracer(False)
        self.moveCnt = 0
        self.moveDisplay(0)
        for t in self.towerA, self.towerB, self.towerC:
            while t != []:
                t.pop(200)
        for k in range(self.nrOfDiscs - 1, -1, -1):
            self.discs[k].config(k, self.nrOfDiscs)
            self.towerA.push(self.discs[k])
        self.ts.tracer(True)
        self.HG = self.hanoi(self.nrOfDiscs, self.towerA, self.towerC,
                             self.towerB)

    def run(self):
        """run game ;-)
        return True if game is over, else False"""
        self.running = True
        try:
            while self.running:
                result = self.step()
            return result  # True iff done
        except StopIteration:  # game over
            return True

    def step(self):
        """perform one single step of the game,
        returns True if finished, else False"""
        try:
            next(self.HG)
            return 2**self.nrOfDiscs - 1 == self.moveCnt
        except TclError:
            return False

    def stop(self):
        """ ;-) """
        self.running = False
Exemplo n.º 7
0
class HanoiEngine:
    def __init__(self, canvas, nrOfDiscs, speed, moveCntDisplay=None):
        self.ts = canvas
        self.ts.tracer(False)
        self.designer = RawTurtle(canvas, shape="square")
        self.designer.penup()
        self.designer.shapesize(0.5, 21)
        self.designer.goto(0,-80); self.designer.stamp()
        self.designer.shapesize(7, 0.5)
        self.designer.fillcolor('black')
        for x in -140, 0, 140:
            self.designer.goto(x,-5); self.designer.stamp()

        self.nrOfDiscs = nrOfDiscs
        self.speed = speed
        self.moveDisplay = moveCntDisplay
        self.running = False
        self.moveCnt = 0
        self.discs = [Disc(canvas) for i in range(10)]
        self.towerA = Tower(-140)
        self.towerB = Tower(0)
        self.towerC = Tower(140)
        self.ts.tracer(True)
        
    def setspeed(self):
        for disc in self.discs: disc.speed(self.speed)
   
    def hanoi(self, n, src, dest, temp):
        if n > 0:
            for x in self.hanoi(n-1, src, temp, dest): yield None
            yield self.move(src, dest)
            for x in self.hanoi(n-1, temp, dest, src): yield None

    def move(self, src_tower, dest_tower):
        dest_tower.push(src_tower.pop())
        self.moveCnt += 1
        self.moveDisplay(self.moveCnt)

    def reset(self):
        self.ts.tracer(False)
        self.moveCnt = 0
        self.moveDisplay(0)
        for t in self.towerA, self.towerB, self.towerC:
            while t != []: t.pop(200)
        for k in range(self.nrOfDiscs-1,-1,-1):
            self.discs[k].config(k, self.nrOfDiscs)
            self.towerA.push(self.discs[k])
        self.ts.tracer(True)
        self.HG = self.hanoi(self.nrOfDiscs,
                             self.towerA, self.towerC, self.towerB)
        
    def run(self):
        self.running = True
        try:
            while self.running:
                result = self.step()
            return result 
        except StopIteration:  
            return True

    def step(self):
        try:
            next(self.HG)
            return 2**self.nrOfDiscs-1 == self.moveCnt
        except TclError: 
            return False
        
    def stop(self):
        self.running = False
class HanoiEngine:
    """Play the Hanoi-game on a given TurtleScreen."""
    def __init__(self, canvas, nrOfDiscs, speed, moveCntDisplay=None):
        """Sets Canvas to play on as well as default values for
        number of discs and animation-speed.
        moveCntDisplay is a function with 1 parameter, which communicates
        the count of the actual move to the GUI containing the
        Hanoi-engine-canvas."""
        self.ts = canvas
        self.ts.tracer(False)
        # setup scene
        self.designer = RawTurtle(canvas, shape="square")
        self.designer.penup()
        self.designer.shapesize(0.5, 21)
        self.designer.goto(0,-80); self.designer.stamp()
        self.designer.shapesize(7, 0.5)
        self.designer.fillcolor('darkgreen')
        for x in -140, 0, 140:
            self.designer.goto(x,-5); self.designer.stamp()

        self.nrOfDiscs = nrOfDiscs
        self.speed = speed
        self.moveDisplay = moveCntDisplay
        self.running = False
        self.moveCnt = 0
        self.discs = [Disc(canvas) for i in range(10)]
        self.towerA = Tower(-140)
        self.towerB = Tower(0)
        self.towerC = Tower(140)
        self.ts.tracer(True)
        
    def setspeed(self):
        for disc in self.discs: disc.speed(self.speed)
   
    def hanoi(self, n, src, dest, temp):
        """The classical recursive Towers-Of-Hanoi algorithm,
        implemented as a recursive generator, yielding always None
        plus an 'important' side effect - the next Hanoi move."""
        if n > 0:
            for x in self.hanoi(n-1, src, temp, dest): yield None
            yield self.move(src, dest)
            for x in self.hanoi(n-1, temp, dest, src): yield None

    def move(self, src_tower, dest_tower):
        """move uppermost disc of source tower to top of destination
        tower."""
        dest_tower.push(src_tower.pop())
        self.moveCnt += 1
        self.moveDisplay(self.moveCnt)

    def reset(self):
        """Setup of (a new) game."""
        self.ts.tracer(False)
        self.moveCnt = 0
        self.moveDisplay(0)
        for t in self.towerA, self.towerB, self.towerC:
            while t != []: t.pop(200)
        for k in range(self.nrOfDiscs-1,-1,-1):
            self.discs[k].config(k, self.nrOfDiscs)
            self.towerA.push(self.discs[k])
        self.ts.tracer(True)
        self.HG = self.hanoi(self.nrOfDiscs,
                             self.towerA, self.towerC, self.towerB)
        
    def run(self):
        """run game ;-)
        return True if game is over, else False"""
        self.running = True
        try:
            while self.running:
                result = self.step()
            return result  # True iff done
        except StopIteration:  # game over
            return True

    def step(self):
        """perform one single step of the game,
        returns True if finished, else False"""
        try:
            next(self.HG)
            return 2**self.nrOfDiscs-1 == self.moveCnt
        except TclError: 
            return False
        
    def stop(self):
        """ ;-) """
        self.running = False
Exemplo n.º 9
0
class HanoiEngine:
    def __init__(self, canvas, nrOfDiscs, speed, moveCntDisplay=None):

        self.ts = canvas
        self.ts.tracer(False)
        # setup scene
        self.designer = RawTurtle(canvas, shape="square")
        self.designer.penup()
        self.designer.shapesize(0.4, 25)
        self.designer.goto(0, -81)
        self.designer.stamp()
        self.designer.shapesize(4, 0.5)
        self.designer.fillcolor('Black')
        for x in -150, 0, 150:
            self.designer.goto(x, -5)
            self.designer.stamp()

        self.nrOfDiscs = nrOfDiscs
        self.speed = speed
        self.moveDisplay = moveCntDisplay
        self.running = False
        self.moveCnt = 0
        self.discs = [Disc(canvas) for i in range(10)]
        self.towerA = Tower(-150)
        self.towerB = Tower(0)
        self.towerC = Tower(150)
        self.ts.tracer(True)

    def setspeed(self):
        for disc in self.discs:
            disc.speed(self.speed)

    def hanoi(self, n, src, dest, temp):
        #use of recurssion for movement
        if n > 0:
            for x in self.hanoi(n - 1, src, temp, dest):
                yield None
            yield self.move(src, dest)
            for x in self.hanoi(n - 1, temp, dest, src):
                yield None

    def move(self, src_tower, dest_tower):
        #movement of upper disks
        dest_tower.push(src_tower.pop())
        self.moveCnt += 1
        self.moveDisplay(self.moveCnt)

    def reset(self):
        # start a new game
        self.ts.tracer(False)
        self.moveCnt = 0
        self.moveDisplay(0)
        for t in self.towerA, self.towerB, self.towerC:
            while t != []:
                t.pop(200)
        for k in range(self.nrOfDiscs - 1, -1, -1):
            self.discs[k].config(k, self.nrOfDiscs)
            self.towerA.push(self.discs[k])
        self.ts.tracer(True)
        self.HG = self.hanoi(self.nrOfDiscs, self.towerA, self.towerC,
                             self.towerB)

    def run(self):
        #true if game is over else false
        self.running = True
        try:
            while self.running:
                result = self.step()
            return result  # True iff done
        except StopIteration:  # game over
            return True

    def step(self):
        """perform one single step of the game,
        returns True if finished, else False"""
        try:
            next(self.HG)
            return 2**self.nrOfDiscs - 1 == self.moveCnt
        except TclError:
            return False

    def stop(self):
        """ ;-) """
        self.running = False
Exemplo n.º 10
0
class HanoiEngine:
    """Play the Hanoi-game on a given TurtleScreen."""
    def __init__(self, canvas, nrOfDiscs, speed, moveCntDisplay=None):
        """Sets Canvas to play on as well as default values for
        number of discs and animation-speed.
        moveCntDisplay is a function with 1 parameter, which communicates
        the count of the actual move to the GUI containing the
        Hanoi-engine-canvas."""
        global gameStatus
        self.highScoreArray = []
        self.combinedArray = []
        self.universalArray = []

        self.setCanvas = canvas
        self.ts = canvas
        self.ts.tracer(False)
        # setup scene
        self.designer = RawTurtle(canvas, shape="square")
        self.designer.penup()
        self.designer.shapesize(0.5, 21)
        self.designer.goto(0, -80)
        self.designer.stamp()
        self.designer.shapesize(7, 0.5)
        self.designer.fillcolor('pink')
        for x in -140, 0, 140:
            self.designer.goto(x, -5)
            self.designer.stamp()

        self.nrOfDiscs = nrOfDiscs
        self.speed = speed
        self.moveDisplay = moveCntDisplay
        self.running = False
        self.moveCnt = 0
        self.winCondition = False
        ''' elson code '''
        gameStatus = "withoutTurtle"
        self.currentStatus = "AI"
        self.samplemoves = []  # The set of move generate by AI
        self.usermoves = []  # The set of move user move
        self.finalmoves = []  # The final set of move

        self.minmoves = 0
        self.totalmoves = 0

        self.startsource = Tower(-140)
        self.starthelper = Tower(0)
        self.starttarget = Tower(140)
        self.goaltarget = Tower(140)

        self.AISource = Tower(-140)
        self.AIHelper = Tower(0)
        self.AITarget = Tower(140)

        self.goalMoves = []
        self.playerMoves = []
        ''' elson code '''

        self.numValue = 0
        self.discs = []

        self.towerA = Tower(-140)
        self.towerB = Tower(0)
        self.towerC = Tower(140)

        print "A:", self.towerA.size(), "value:", self.towerA.peek()
        print "B:", self.towerB.size(), "value:", self.towerB.peek()
        print "C:", self.towerC.size(), "value:", self.towerC.peek()

        self.ts.tracer(True)

    def getGameStatus(self):
        return self.gameStatus

    #elson code
    def savestate(self, stack):
        self.newstack = Tower(0)
        self.newstack.copyFrom(stack)
        return self.newstack

    #elson code
    # Restore the stack to start state
    def startstate(self):
        self.towerA.copyFrom(self.startsource)
        self.towerB.copyFrom(self.starthelper)
        self.towerC.copyFrom(self.starttarget)

    #elson code
    def moveTower(self, disc, Beg, Aux, End):

        global gameStatus

        if disc == 1:
            self.moveDisk(Beg, End)
            if getGameStatus() is "turtle":
                self.moveCnt += 1
                self.moveDisplay(self.moveCnt)
                self.samplemoves.append(self.savestate(self.towerA))
                self.samplemoves.append(self.savestate(self.towerB))
                self.samplemoves.append(self.savestate(self.towerC))
            #print (Beg, Aux, End)

        else:
            self.moveTower(disc - 1, Beg, End, Aux)
            self.moveTower(1, Beg, Aux, End)
            self.moveTower(disc - 1, Aux, Beg, End)

    '''elson code'''

    # Move disk from the src stack to dest stack
    def moveDisk(self, frompole, topole):
        # print("moving disk from",frompole.gettitle(),"to",topole.gettitle())
        #if self.checkvalid(frompole, topole) is True:
        #if getGameStatus() is "turtle":

        if self.currentStatus is "AI":
            self.goalMoves.append(MyMoves(frompole, topole))
        else:
            self.playerMoves.append(MyMoves(frompole, topole))
            self.moveCnt += 1
        self.moveDisplay(self.moveCnt)
        print("moving disk from ", frompole.peek(), " to ", topole.peek())
        topole.push(frompole.pop())
        #self.moveCnt += 1
        #self.moveDisplay(self.moveCnt)

    '''elson code'''

    # generate the sample set of solutions
    def gensamplemove(self, source, helper, target):
        self.moveTower(source.size(), source, helper, target)

    '''elson code'''

    # Check of the rules of Hanoi
    def checkvalid(self, frompole, topole):
        if (frompole.size() == 0 or frompole
                == topole):  # frompole is empty or frompole and topole is same
            return False
        else:
            if (topole.peek() is None or frompole.peek() < topole.peek()
                ):  # topole is empty or from is smaller than to

                self.moveDisk(frompole, topole)
                self.usermoves.append(self.savestate(self.towerA))
                self.usermoves.append(self.savestate(self.towerB))
                self.usermoves.append(self.savestate(self.towerC))

                self.finalmoves.append(self.savestate(self.towerA))
                self.finalmoves.append(self.savestate(self.towerB))
                self.finalmoves.append(self.savestate(self.towerC))
                return True
            elif frompole.peek() > topole.peek():
                return False

    '''elson code'''
    # Conver the string input to the variable of stack
    '''def convert(self, word):
        if(word == "a"):
            return source
        elif(word == "b"):
            return helper
        elif(word == "c"):
            return target'''
    '''elson code'''

    def findmatch(self):
        for i in range(len(self.usermoves) - 1, 0, -3):
            #print (self.usermoves[i-2], self.usermoves[i-1], self.usermoves[i])
            if (i != len(self.usermoves) - 1
                ):  # append the backtrack state, only add after first i loop
                self.finalmoves.append(self.usermoves[i - 2])
                self.finalmoves.append(self.usermoves[i - 1])
                self.finalmoves.append(self.usermoves[i])
            for j in range(0, len(self.samplemoves), 3):
                #print (self.samplemoves[i-2], self.samplemoves[i-1], self.samplemoves[i])
                if (self.usermoves[i - 2].isEqual(self.samplemoves[j]) and
                        self.usermoves[i - 1].isEqual(self.samplemoves[j + 1])
                        and self.usermoves[i].isEqual(
                            self.samplemoves[j + 2])):
                    index = j
                    return j

    '''elson code'''

    def solve(self):
        global gameStatus
        gameStatus = "turtle"
        '''
        index = self.findmatch()
        for j in range(index+3,len(self.samplemoves),3): # append state after the match
            self.finalmoves.append(self.samplemoves[j])
            self.finalmoves.append(self.samplemoves[j+1])
            self.finalmoves.append(self.samplemoves[j+2])
        '''

        newArray = []
        num = len(self.playerMoves) - 1
        for q in range(0, len(self.playerMoves)):
            temp = self.playerMoves[q].srcTower
            self.playerMoves[q].srcTower = self.playerMoves[q].destTower
            self.playerMoves[q].destTower = temp
            newArray.append(self.playerMoves[num])
            num -= 1

        #print len(newArray)

        self.speed = 8 % 10
        self.setspeed()

        for w in range(0, len(newArray)):
            #print newArray[w]
            self.move(newArray[w].srcTower, newArray[w].destTower)

        self.speed = 3 % 10
        self.setspeed()

        for v in range(0, len(self.goalMoves)):
            self.move(self.goalMoves[v].srcTower, self.goalMoves[v].destTower)

        del newArray[:]
        gameStatus = "turtle"
        self.currentStatus = "AI"

        return True

    def getTowerA(self):
        return self.towerA

    def getTowerB(self):
        return self.towerB

    def getTowerC(self):
        return self.towerC

    def setspeed(self):
        for disc in self.discs:
            disc.speed(self.speed)

    def move(self, src_tower, dest_tower):
        """move uppermost disc of source tower to top of destination
        tower."""
        self.winCondition = False
        dest_tower.push(src_tower.pop())
        self.moveCnt += 1
        self.moveDisplay(self.moveCnt)

    def reset(self):
        """Setup of (a new) game."""

        self.ts.tracer(False)
        global gameStatus, currentStatus
        gameStatus = "turtle"
        Hanoi.state = "START"

        del self.playerMoves[:]
        del self.goalMoves[:]
        self.moveCnt = 0
        self.moveDisplay(0)

        self.resetTowers(self.towerA)
        self.resetTowers(self.towerB)
        self.resetTowers(self.towerC)

        self.numValue = 0

        del self.discs[:]

        for x in range(self.nrOfDiscs):
            self.numValue += 1
            self.discs.append(Disc(self.setCanvas, self.numValue))
            print self.numValue

        for k in range(self.nrOfDiscs - 1, -1, -1):
            self.discs[k].config(k, self.nrOfDiscs)  #
            self.towerA.push(self.discs[k])

        gameStatus = "withoutTurtle"
        ''' elson code '''
        self.startsource.copyFrom(self.towerA)  # Save the start state
        self.starthelper.copyFrom(self.towerB)
        self.starttarget.copyFrom(self.towerC)

        # Include the start state in sample moves set
        self.samplemoves.append(self.startsource)
        self.samplemoves.append(self.starthelper)
        self.samplemoves.append(self.starttarget)
        ''' elson code '''
        """ AI attempt to solve """
        self.gensamplemove(self.towerA, self.towerB, self.towerC)

        # Printing for checking sample moves set purpose
        # print "Number of element:",len(samplemoves)
        # print "Number of minimum steps:",minmoves
        # for i in range(0, len(samplemoves), 3):
        #    printprogess(samplemoves[i], samplemoves[i+1], samplemoves[i+2])
        """ Restore start state """
        self.startstate()

        # Include the start state in user moves set
        self.usermoves.append(self.startsource)
        self.usermoves.append(self.starthelper)
        self.usermoves.append(self.starttarget)

        self.finalmoves.append(self.startsource)
        self.finalmoves.append(self.starthelper)
        self.finalmoves.append(self.starttarget)

        gameStatus = "turtle"
        self.currentStatus = "user"

        #for k in range(self.nrOfDiscs - 1, -1, -1):
        #    self.discs[k].config(k, self.nrOfDiscs)
        #    self.towerA.push(self.discs[k])
        #    self.AISource.push(self.discs[k])

        print "A:", self.towerA.size()
        print "B:", self.towerB.size()
        print "C:", self.towerC.size()

        self.ts.tracer(True)

        #self.HG = self.hanoi(self.nrOfDiscs,
        #                     self.towerA, self.towerC, self.towerB)

    def resetTowers(self, tower):
        if tower.size() > 0:
            for x in range(0, tower.size()):
                tower.pop(200)

    def checkWin(self):
        if self.towerC.size() is self.nrOfDiscs:
            self.winCondition = True
            Hanoi.state = "DONE"
            return self.winCondition

    def storeHighScore(self):
        self.highScoreArray.append(WinData(self.nrOfDiscs, self.moveCnt))

        for j in range(1, 11):

            for i in range(0, len(self.highScoreArray)):
                if self.highScoreArray[i].getNumOfDiscs() is j:
                    self.universalArray.append(self.highScoreArray[i])

            if len(self.universalArray) > 0:
                self.doSelectionSort(self.universalArray)
                self.combinedArray = self.combinedArray + self.universalArray
                del self.universalArray[:]

        del self.highScoreArray[:]
        for w in range(0, len(self.combinedArray)):
            self.highScoreArray.append(self.combinedArray[w])
        del self.combinedArray[:]

        return self.highScoreArray

    def doSelectionSort(self, universalArray):
        n = len(universalArray)

        for fillslot in range(n - 1, 0, -1):
            positionOfMax = 0
            for location in range(1, fillslot + 1):
                if universalArray[location].getNumOfMove(
                ) > universalArray[positionOfMax].getNumOfMove():
                    positionOfMax = location

            tmp = universalArray[fillslot]
            universalArray[fillslot] = universalArray[positionOfMax]
            universalArray[positionOfMax] = tmp

    def stop(self):
        """ ;-) """
        self.running = False

    def checkIfMoveValid(self, sourceTower, destTower):
        if sourceTower.peek() < destTower.peek() or destTower.peek() is None:
            #pop from sourceTower and push into destTower
            return True
        elif sourceTower.peek() > destTower.peek():
            #return error message, do not pop from srcTower
            return False
Exemplo n.º 11
0
WIDTH, HEIGHT = 450, 450
canvas = Canvas(master, width=WIDTH, height=HEIGHT, bg="green")
canvas.pack(ipadx=30)
root = TurtleScreen(canvas)
turtle = RawTurtle(root, visible=False)
root.bgcolor("white")

turtle.color('#F09F13')
turtle.pensize(4)
turtle.speed(15)
turtle.hideturtle()

turtle.penup()
turtle.setposition(70, 90)
turtle.pendown()
turtle.fillcolor("#F09F13")
turtle.begin_fill()
turtle.circle(40)
turtle.end_fill()

turtle.hideturtle()

turtle.color('#fe7d96')
turtle.pensize(4)
turtle.speed(15)
turtle.hideturtle()
turtle.penup()
turtle.setposition(15, -20)
turtle.hideturtle()
turtle.pendown()
turtle.fillcolor("#fe7d96")