jmft2

Snake

Feb 23rd, 2013
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.39 KB | None | 0 0
  1. to snake
  2. setvars
  3. clearscreen
  4. setscreencolor :bgcolour
  5. run pick [
  6. [maze_1]
  7. ; [maze_2]
  8. ]
  9. repeat :foodcount [makefood]
  10. setturtle 2
  11. penup
  12. hideturtle
  13. setturtle 1
  14. hideturtle
  15. settimer 1 1 [losetail ai turn move pixelcheck]
  16. mouseon [startdrive] [] [stopdrive] [] []
  17. end
  18.  
  19. to revive
  20. ; revives a snake which has hit a wall or tail
  21. settimer 1 1 [losetail ai turn move pixelcheck]
  22. end
  23.  
  24. to pausesnake
  25. cleartimer 1
  26. print [To resume, use revive.]
  27. end
  28.  
  29. to ksnake
  30. ; EXPERIMENTAL!
  31. setvars
  32. clearscreen
  33. run pick [
  34. [maze_1]
  35. ; [maze_2]
  36. ]
  37. repeat :foodcount [makefood]
  38. setturtle 2
  39. penup
  40. hideturtle
  41. setturtle 1
  42. hideturtle
  43. settimer 1 1 [losetail move pixelcheck]
  44. mouseon [startdrive] [] [stopdrive] [] []
  45. keyboardon [kturn]
  46. setfocus [MSWLogo SCREEN]
  47. end
  48.  
  49. to ai
  50. ; Simple AI to follow food
  51.  
  52. if :ai_mode [
  53. ai_main :food_points
  54. ]
  55. end
  56.  
  57. to ai_main :foodpoints
  58. make "lastpos last :foodpoints
  59. make "cx first :lastpos
  60. make "cy last :lastpos
  61. make "tx xcor
  62. make "ty ycor
  63. make "x :cx - :tx
  64. make "y :cy - :ty
  65.  
  66. if :y > 0 [
  67. make "newangle arctan (:x / :y)
  68. ]
  69.  
  70. if (AND (:y < 0) (:x > 0)) [
  71. localmake "temp 0-:y
  72. make "newangle 90+arctan (:temp / :x)
  73. ]
  74.  
  75. if (AND (:y < 0) (:x < 0)) [
  76. localmake "temp 0-:y
  77. make "newangle 270+arctan (:temp / :x)
  78. ]
  79.  
  80. if :newangle < 0 [
  81. make "newangle :newangle + 360
  82. ]
  83.  
  84. if (OR (:newangle > 360) (:newangle = 360)) [
  85. make "newangle :newangle - 360
  86. ]
  87.  
  88. ifelse (ABS (:newangle - heading)) < 160 [
  89. setheading :newangle
  90. ][
  91. ;ifelse (COUNT butlast :food_points) > 0 [
  92. ; ai_main butlast :food_points
  93. ;][
  94. setheading :newangle
  95. ;]
  96. ]
  97. end
  98.  
  99. to maze_1
  100. ; Draw a simple box around the field
  101. penup
  102. setpensize [5 5]
  103. setpencolor :wallcolour
  104. setpos [-300 -300]
  105. pendown
  106. repeat 4 [fd 600 rt 90]
  107. penup
  108. setpencolor :snakecolour
  109. setpensize [1 1]
  110. home
  111. pendown
  112. end
  113.  
  114. to maze_2
  115. local "maze_2
  116. make "maze_2 "maze_2.bmp ; CHANGE THIS!
  117. ifelse (AND ((first (bitloadsize :maze_2)) = 600) ((last (bitloadsize :maze_2)) = 600)) [
  118. penup
  119. setpos [-300 -300]
  120. bitload :maze_2
  121. setpos [0 0]
  122. pendown
  123. print [Maze II loaded.]
  124. ][
  125. print [The map needs to be 600 by 600.]
  126. ]
  127. end
  128.  
  129. to pixelcheck
  130. ; Check whether we have hit our tail
  131. if (pixel = :snakecolour) [
  132. print [You hit your own tail!]
  133. if NOT :god_mode [cleartimer 1]
  134. halt
  135. ]
  136. ; If not yet dead, check whether we have hit a wall
  137. if (pixel = :wallcolour) [
  138. print [You have hit a wall!]
  139. if NOT :god_mode [cleartimer 1]
  140. ]
  141. ; If not yet dead, check whether we are on poison
  142. if (pixel = :poisoncolour) [
  143. make "score :score - :poisonpenalty
  144. print (sentence [You got poisoned! Your score:] :score)
  145. make "size :size - :poisonpenalty
  146. setpensize (list :explodesize :explodesize)
  147. setpencolor :bgcolour
  148. fd 0
  149. setpencolor :snakecolour
  150. setpensize [1 1]
  151. makepoison
  152. ]
  153. ; Check whether we're standing on food
  154. if (pixel = :foodcolour) [
  155. make "score :score + :curspd
  156. print (sentence [You ate the food! Your score:] :score)
  157. make "size :size + (:tailgrowth*:curspd)
  158. setpensize (list :explodesize :explodesize)
  159. penerase
  160. fd 0
  161. penpaint
  162. setpensize [1 1]
  163. makefood
  164. makepoison
  165. ]
  166. end
  167.  
  168. to makefood
  169. ; Puts food onto the field
  170. setturtle 3
  171. penup
  172. make "lastpos (list ((random :worldsize)-(:worldsize/2)) ((random :worldsize)-(:worldsize/2)))
  173. setpos :lastpos
  174. make "food_points lput :lastpos :food_points
  175. setpensize (list :foodsize :foodsize)
  176. setpencolor :foodcolour
  177. pendown
  178. fd 0
  179. setpencolor :snakecolour
  180. setpensize [1 1]
  181. penup
  182. home
  183. pendown
  184. setturtle 1
  185. end
  186.  
  187. to makepoison
  188. ; Puts poison onto the field
  189. if (RANDOM 100) < :poisonchance [
  190. setturtle 3
  191. penup
  192. make "lastpos (list ((random :worldsize)-(:worldsize/2)) ((random :worldsize)-(:worldsize/2)))
  193. setpos :lastpos
  194. setpensize (list :foodsize :foodsize)
  195. setpencolor :poisoncolour
  196. pendown
  197. fd 0
  198. setpencolor :snakecolour
  199. setpensize [1 1]
  200. penup
  201. home
  202. pendown
  203. setturtle 1
  204. ]
  205. end
  206.  
  207. to losetail
  208. if ((count :points) < :size) [
  209. stop
  210. ]
  211. if (AND ((count :points) > :size) ((count :points) > 1)) [
  212. while [(AND ((count :points) > :size) ((count :points) > 1))] [
  213. make "diepoint first :points
  214. setturtle 2
  215. setpos :diepoint
  216. setpixel :bgcolour
  217. setturtle 1
  218. make "points butfirst :points
  219. ]
  220. ]
  221.  
  222. end
  223.  
  224. to move
  225. make "tx xcor
  226. make "ty ycor
  227. make "mx first mousepos
  228. make "my last mousepos
  229. make "xdist abs (:mx - :tx)
  230. make "ydist abs (:my - :ty)
  231. make "dist sqrt (:xdist*:xdist + :ydist*:ydist)
  232. if :dist < :curspd [stop]
  233. repeat :curspd [
  234. fd 1
  235. make "tx xcor
  236. make "ty ycor
  237. make "ax (round (:tx / 1))*1
  238. make "ay (round (:ty / 1))*1
  239. make "ax :tx
  240. make "ay :ty
  241. setxy :ax :ay
  242. make "points lput (list :ax :ay) :points
  243. ]
  244. end
  245.  
  246. to startdrive
  247. make "curspd :curspd + :incspd
  248. end
  249.  
  250. to startrev
  251. make "curspd -:incspd
  252. end
  253.  
  254. to stopdrive
  255. if (OR (:curspd > :incspd) (:curspd = :incspd)) [make "curspd :curspd - :incspd]
  256. end
  257.  
  258. to turn
  259. ; Normal turning procedure, guided by mouse, not by AI
  260. if :ai_mode [stop]
  261. make "cx first mousepos
  262. make "cy last mousepos
  263. make "tx xcor
  264. make "ty ycor
  265. make "x :cx - :tx
  266. make "y :cy - :ty
  267.  
  268. if :y > 0 [
  269. make "newangle arctan (:x / :y)
  270. ]
  271.  
  272. if (AND (:y < 0) (:x > 0)) [
  273. localmake "temp 0-:y
  274. make "newangle 90+arctan (:temp / :x)
  275. ]
  276.  
  277. if (AND (:y < 0) (:x < 0)) [
  278. localmake "temp 0-:y
  279. make "newangle 270+arctan (:temp / :x)
  280. ]
  281.  
  282. if :newangle < 0 [
  283. make "newangle :newangle + 360
  284. ]
  285.  
  286. if (OR (:newangle > 360) (:newangle = 360)) [
  287. make "newangle :newangle - 360
  288. ]
  289.  
  290. setheading :newangle
  291.  
  292. end
  293.  
  294. to kturn
  295. make "oldheading heading
  296. if (char keyboardvalue) = "8 [make "newangle 000]
  297. if (char keyboardvalue) = "6 [make "newangle 090]
  298. if (char keyboardvalue) = "2 [make "newangle 180]
  299. if (char keyboardvalue) = "4 [make "newangle 270]
  300. if (abs (:newangle - :oldheading)) = 180 [
  301. make "newangle :oldheading
  302. ]
  303. if namep "newangle [setheading :newangle]
  304. end
  305.  
  306. to between :number :bound1 :bound2
  307. ifelse (AND (:number > :bound1) (:number < :bound2)) [
  308. output "true
  309. ][
  310. output "false
  311. ]
  312. end
  313.  
  314. to setvars
  315. Make "curspd 0 ; Current speed (begins at 0)
  316. Make "incspd 1 ; Speed increment when mouse is clicked
  317. Make "points [] ; List of points of the snake, DON'T CHANGE THIS!
  318. Make "food_points [] ; List of points of food (used by AI to track food), DON'T CHANGE THIS!
  319. Make "size 10 ; (starting) Size of the snake
  320. Make "tailgrowth 10 ; Growth of the tail per food bit
  321. Make "fadecount 1 ; Speed at which snake tail dies (experimental)
  322. Make "score 0 ; Current score (begins at 0)
  323. Make "worldsize 550 ; Size of the world (i.e. the boundary for food to disperse)
  324. Make "foodcount 4 ; Number of food bits on the field at any one time (not changeable during game)
  325. Make "god_mode "false ; God mode (cannot die whilst in God mode)
  326. Make "foodsize 10 ; Size of food bits
  327. Make "poisonchance 99 ; Chance of poison being created (out of 100)
  328. Make "poisonpenalty 1 ; Penalty when eating poison
  329. Make "explodesize 20 ; DIAMETER of "explosion" around food that is eaten (don't make this too big or too small)
  330. Make "snakecolour [255 255 255] ; Snake colour
  331. Make "foodcolour [253 253 253] ; Food colour
  332. Make "poisoncolour [001 001 001] ; Poison colour
  333. Make "wallcolour [128 128 128] ; Death colour
  334. Make "bgcolour [000 000 000] ; Background colour
  335.  
  336. ; NB: None of these colours should be the same!
  337. ; If you want, say, all black, try 000, 001, 002, 003
  338.  
  339. Make "ai_mode "false ; If TRUE, then autopiloting (works best with a lot of food and high explosions)
  340. end
Advertisement
Add Comment
Please, Sign In to add comment