Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/my_turtle.py
blob: b99d3bce1feb9a049413ab6b9be76bf535bfbe06 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# my_turtle.py
import g,pygame,utils

class TurtleClass: # used only for keeping track of the right hand turtle
        
    def setup(self, color):
        steps=0
        for n in self.current: steps=steps+4*n
        self.steps=steps
        self.x1=g.x1+4.0*g.dd; self.y1=g.y1+6.0*g.dd; self.dx=0; self.dy=-g.dd
        self.step_count=0
        self.ms=pygame.time.get_ticks()
        self.running=False; self.crashed=False; self.changed=False
        self.win=False
        self.color=color
        
    def move(self):
        if self.step_count<self.steps:
            d=pygame.time.get_ticks()-self.ms
            if d<0 or d>g.delay: #time to move
                g.redraw=True
                x2=self.x1+self.dx; y2=self.y1+self.dy    
                self.x1=x2; self.y1=y2
                self.step_count+=1
                self.ms=pygame.time.get_ticks()
        else:
            self.running=False
            
    def help1(self):
        x1=g.x1+4*g.dd; y1=g.y1+6*g.dd; dx=0; dy=-g.dd; steps=0; angle=0; n=0
        for j in self.current:
            for k in range(j):
                steps+=1
                x2=x1+dx; y2=y1+dy
                pygame.draw.line(g.screen,self.color,(x1,y1),(x2,y2),4)
                x1=x2; y1=y2
            if dy==-g.dd: dx=g.dd;dy=0;angle=90
            elif dx==g.dd: dx=0;dy=g.dd;angle=180
            elif dy==g.dd: dx=-g.dd;dy=0;angle=270
            else: dx=0;dy=-g.dd;angle=0
            n+=1
            if n==g.help1: break
        utils.centre_blit(g.screen,g.turtle,(x2,y2),angle)
        self.step_count=steps
                
    def draw(self):
        x1=g.x1+4*g.dd; y1=g.y1+6*g.dd; dx=0; dy=-g.dd; steps=0; angle=0
        x2=x1; y2=y1 # in case we haven't moved yet - for turtle image
        done=True; n=0
        for i in range(4):
            for j in self.current:
                for k in range(j):
                    steps+=1
                    if not g.show_help:
                        if steps>self.step_count: done=False; break
                    x2=x1+dx; y2=y1+dy
                    pygame.draw.line(g.screen,self.color,(x1,y1),(x2,y2),4)
                    x1=x2; y1=y2
                if not g.show_help:
                    if steps>self.step_count: break
                if dy==-g.dd: dx=g.dd;dy=0;angle=90
                elif dx==g.dd: dx=0;dy=g.dd;angle=180
                elif dy==g.dd: dx=-g.dd;dy=0;angle=270
                else: dx=0;dy=-g.dd;angle=0
                if g.show_help:
                    n+=1
                    if n==g.help1: self.step_count=steps; break
            if g.show_help:
                if n==g.help1: break
            elif steps>self.step_count: break
        img=g.turtle
        if self.crashed: img=g.crash
        utils.centre_blit(g.screen,img,(x2,y2),angle)
        d8=8*g.dd
        if not g.show_help:
            if abs(x2-g.x1)<.1 or abs(x2-(g.x1+d8))<.1 or abs(y2-g.y1)<.1 or abs(y2-(g.y1+d8))<.1:
                if not self.crashed==True: g.crash_drawn=False
                self.running=False; self.crashed=True
            elif done:
                self.win=correct(self.current)
                if self.win:
                    if g.finale==False:
                        if g.help2>5: g.help2=5
                        g.score=g.score+6-g.help2
                    g.finale=True
               
def correct(current):
    return trace(g.goal)==trace(current)

def trace(l): # returns a list based on the line segments drawn
    hl=[0,0,0,0,0,0,0]; vl=[0,0,0,0,0,0,0]
    x1=3;y1=1;dx=0;dy=1
    for i in range(4):
        for j in l:
            for k in range(j):
                x2=x1+dx; y2=y1+dy;mark(hl,vl,x1,y1,x2,y2); x1=x2; y1=y2
            if dy==-1: dx=-1;dy=0
            elif dx==1: dx=0;dy=-1
            elif dy==1: dx=1;dy=0
            else: dx=0;dy=1
    return hl+vl

def mark(hl,vl,x1,y1,x2,y2):
    twos=[1,2,4,8,16,32]
    if x1==x2: #vertical
        y=min(y1,y2);vl[x1]=vl[x1]|twos[y]
    else:
        x=min(x1,x2);hl[y1]=hl[y1]|twos[x]