crobs/robbie.r
001 | /* robbie the robot */ |
002 | /* */ |
003 | /* Programmer: Bob Guerin */ |
004 | /* 4935 Niagara Ave, No. 13 */ |
005 | /* San Diego, CA 92107 */ |
006 | /* */ |
007 | /* Strategy: */ |
008 | /* 1. Robot moves in clockwise square pattern and */ |
009 | /* moves diagonally when nearing walls. */ |
010 | /* 2. Robot speed is 100, except when turning, when */ |
011 | /* speed is reduced to 49. */ |
012 | /* 3. Robot scans in 20 degree increments until a */ |
013 | /* target is located. */ |
014 | /* 4. When target is located, a second scan is done */ |
015 | /* to narrow the target bearing to +/- 5 degrees. */ |
016 | /* 5. Robot calculates firing range based on the */ |
017 | /* range difference of the two scans and (range */ |
018 | /* at last scan / 256). */ |
019 | /* 6. When target is found, the robot will "lock" on */ |
020 | /* to it by constantly changing its scan angle. */ |
021 | /* 7. When target lost during scan, robot checks 180 */ |
022 | /* degrees behind direction of movement. */ |
023 |
024 | /* external variables (can be used by any function) */ |
025 |
026 | int x, y; /* current x,y position of robot */ |
027 | int range; /* range to target */ |
028 | int dir; /* direction of movement */ |
029 | int quadrant; /* quadrant robot is located */ |
030 | int scandir; /* scan direction */ |
031 | int vel; /* velocity */ |
032 |
033 |
034 | /* main */ |
035 | main() |
036 | { |
037 |
038 | /* set initial course */ |
039 | new_course(); |
040 |
041 | while (1) /* loop is executed forever */ |
042 | { |
043 | check_pos(); |
044 | range = scan(scandir,10); |
045 | if (range > 0) |
046 | { |
047 | shoot(); |
048 | } |
049 | scandir = (scandir + 20) % 360; |
050 | } |
051 | } /* end of main */ |
052 |
053 | /* check for side wall */ |
054 | check_pos() |
055 | { |
056 | if (speed() == 0) |
057 | drive(dir,vel); |
058 | if (quadrant == 0) |
059 | { |
060 | x = loc_x(); |
061 | if (x > 850) |
062 | if (x > 900 || speed() < 50) |
063 | { |
064 | drive(90,100); |
065 | quadrant = 1; |
066 | dir = 90; |
067 | vel = 100; |
068 | } |
069 | else |
070 | { |
071 | drive(45,49); |
072 | dir = 45; |
073 | vel = 49; |
074 | } |
075 | } |
076 | else |
077 | if (quadrant == 1) |
078 | { |
079 | y = loc_y(); |
080 | if (y > 850) |
081 | if (y > 900 || speed() < 50) |
082 | { |
083 | drive(180,100); |
084 | quadrant = 2; |
085 | dir = 180; |
086 | vel = 100; |
087 | } |
088 | else |
089 | { |
090 | drive(135,49); |
091 | dir = 135; |
092 | vel = 49; |
093 | } |
094 | } |
095 | else |
096 | if (quadrant == 2) |
097 | { |
098 | x = loc_x(); |
099 | if (x < 150) |
100 | if (x < 100 || speed() < 50) |
101 | { |
102 | drive(270,100); |
103 | quadrant = 3; |
104 | dir = 270; |
105 | vel = 100; |
106 | } |
107 | else |
108 | { |
109 | drive(225,49); |
110 | dir = 225; |
111 | vel = 49; |
112 | } |
113 | } |
114 | else |
115 | { |
116 | y = loc_y(); |
117 | if (y < 150) |
118 | if (y < 100 || speed() < 50) |
119 | { |
120 | drive(0,100); |
121 | quadrant = 0; |
122 | dir = 0; |
123 | vel = 100; |
124 | } |
125 | else |
126 | { |
127 | drive(315,49); |
128 | dir = 315; |
129 | vel = 49; |
130 | } |
131 | } |
132 | } |
133 |
134 | /* new course function to find direction to move */ |
135 | new_course() |
136 | { |
137 |
138 | x = loc_x(); |
139 | y = loc_y(); |
140 | if (x > 500) |
141 | if (y > 500) |
142 | dir = 180; |
143 | else |
144 | dir = 90; |
145 | else |
146 | if (y > 500) |
147 | dir = 270; |
148 | else |
149 | dir = 0; |
150 | drive(dir,100); |
151 |
152 | /* initialize variables */ |
153 | scandir = dir; |
154 | quadrant = dir / 90; |
155 | vel = 100; |
156 |
157 | } /* end of new_course */ |
158 |
159 | /* shoot at target while in range */ |
160 | shoot() |
161 | { |
162 | int angle; /* fire angle */ |
163 | int dif; /* range difference */ |
164 | int range1; /* range for second shot */ |
165 | int range2; /* range at second scan */ |
166 | while (range > 0) /* keep firing while in range */ |
167 | { |
168 | angle = scandir+5; |
169 | range2 = scan(angle,5); |
170 | if (range2 == 0) |
171 | { |
172 | angle = scandir-5; |
173 | range2 = scan(angle,5); |
174 | } |
175 | if (range2 > 0) |
176 | { |
177 | dif = range - range2; |
178 | range = range2 - ((range2 * dif) / 256); |
179 | range1 = range - dif; |
180 | if (range <= 700) |
181 | { |
182 | if (range < 41) range = 41; |
183 | cannon(angle,range); /* fire */ |
184 | } |
185 | if (range1 <= 700) |
186 | { |
187 | if (range1 < 41) range1 = 41; |
188 | cannon(angle,range1); /* fire */ |
189 | } |
190 | } |
191 | range = scan(scandir,10); |
192 | check_pos(); |
193 | if (range == 0) |
194 | { |
195 | scandir = (dir + 180) % 360; |
196 | range = scan(scandir,10); |
197 | if (range == 0) |
198 | scandir = angle; |
199 | } |
200 | else |
201 | scandir = angle; |
202 | } |
203 | } |