Slither.io bot

Bot for Slither.io

  1. // ==UserScript==
  2. // @name Slither.io bot
  3. // @include http://slither.io/
  4. // @author Creec Winceptor
  5. // @description Bot for Slither.io
  6. // @run-at document-end
  7. // @grant GM_info
  8. // @grant unsafeWindow
  9. // @version 3
  10. // @namespace https://greasyfork.org/users/3167
  11. // ==/UserScript==
  12.  
  13. //CODE STARTS HERE
  14. if (window.top != window.self) //don't run on frames or iframes
  15. return;
  16.  
  17.  
  18. REALSCORE = 10;
  19. REALDNA = [1,1,1,1,1,1,1,1,1,1,1,1];
  20.  
  21. BESTRANK = 1000;
  22. BESTSCORE = 1;
  23.  
  24. printbot = function() {
  25. console.log("Dumping bot data:\nREALDNA = " + JSON.stringify(REALDNA) + ";\nREALSCORE = " + REALSCORE + ";\nBESTRANK = " + BESTRANK + ";\nBESTSCORE = " + BESTSCORE + ";");
  26. }
  27.  
  28. savedna = function() {
  29. if(typeof(Storage) !== "undefined") {
  30. localStorage["REALSCORE"] = REALSCORE;
  31. localStorage["REALDNA"] = JSON.stringify(REALDNA);
  32. localStorage["BESTRANK"] = BESTRANK;
  33. localStorage["BESTSCORE"] = BESTSCORE;
  34. }
  35. }
  36.  
  37. cleardna = function() {
  38. localStorage.removeItem("REALSCORE");
  39. localStorage.removeItem("REALDNA");
  40. localStorage.removeItem("BESTRANK");
  41. localStorage.removeItem("BESTSCORE");
  42. REALSCORE = 30;
  43. BESTRANK = 1000;
  44. var distavoid = 90;
  45. var preykerroin = 5;
  46. var viholliskerroin = 544;
  47. var vaarakerroin = 200;
  48. var chargedistance = 500;
  49. var pakoondistance = 70;
  50. var keskikerroin = 2.0;
  51. var keskihakukerroin = 0.1;
  52.  
  53. REALDNA = [distavoid,preykerroin,viholliskerroin,vaarakerroin,chargedistance,pakoondistance,keskikerroin,keskihakukerroin];
  54. TESTDNA = REALDNA.slice();
  55. TESTSCORE = REALSCORE;
  56. testingdna = 1;
  57. DNA = REALDNA.slice();
  58. savedna();
  59. }
  60.  
  61. if(typeof(Storage) !== "undefined") {
  62. // Code for localStorage/sessionStorage.
  63. if (!localStorage.REALSCORE || !localStorage.REALDNA || !localStorage.BESTRANK || !localStorage.BESTSCORE) {
  64. cleardna();
  65. }
  66. else
  67. {
  68. REALSCORE = localStorage["REALSCORE"]*1;
  69. REALDNA = JSON.parse(localStorage["REALDNA"]);
  70. BESTRANK = localStorage["BESTRANK"]*1;
  71. BESTSCORE = localStorage["BESTSCORE"]*1;
  72. }
  73. } else {
  74. // Sorry! No Web Storage support..
  75. }
  76.  
  77.  
  78. TESTDNA = REALDNA.slice();
  79. TESTSCORE = REALSCORE;
  80.  
  81. testingdna = 1;
  82. DNA = REALDNA.slice();
  83.  
  84. var injected_dead = true;
  85.  
  86. var lastscore = 0;
  87. var bestscore = 0;
  88.  
  89. var lastrank = 0;
  90. var bestrank = 1000;
  91. var uhka = false;
  92.  
  93.  
  94. var ruokakerroin = 1/40;
  95. var ruokapower = 1;
  96. var vihollispower = 2;
  97. var vaarapower = 2;
  98. var preypower = 1;
  99. var keskipower = 1;
  100.  
  101.  
  102. var preychase = true;
  103.  
  104. var learnrate = 0.3;
  105. var precision = 100;
  106.  
  107.  
  108. INJECTED = function() {
  109. var kerroin = 10000;
  110. if (animating) {
  111. if (snake) {
  112. accelerate = false;
  113. injected_dead = false;
  114. //xm = grd-snake.xx;
  115. //ym = grd-snake.yy;
  116. xt = 0;
  117. yt = 0;
  118. mindist = grd;
  119. for (var i = 0; i < preys.length; i++) {
  120. xtd = (preys[i].xx-snake.xx);
  121. ytd = (preys[i].yy-snake.yy);
  122. dist = Math.sqrt(xtd*xtd + ytd*ytd);
  123. xt += xtd/Math.pow(dist,preypower+1)*DNA[1];
  124. yt += ytd/Math.pow(dist,preypower+1)*DNA[1];
  125. if (dist < DNA[4] && preychase)
  126. {
  127. accelerate = true;
  128. }
  129. }
  130.  
  131. uhka = false;
  132. for (var i = 0; i < snakes.length; i++) {
  133. //alert(myStringArray[i]);
  134. target = snakes[i];
  135. if (snake.id!=target.id)
  136. {
  137. xtd = (target.xx-snake.xx);
  138. ytd = (target.yy-snake.yy);
  139. dist = Math.sqrt(xtd*xtd + ytd*ytd)-DNA[0];
  140. dist = Math.max(1, dist);
  141. xt += -xtd/Math.pow(dist,vihollispower+1)*DNA[2];
  142. yt += -ytd/Math.pow(dist,vihollispower+1)*DNA[2];
  143. if (dist < DNA[5])
  144. {
  145. accelerate = true;
  146. }
  147. if (dist<mindist)
  148. {
  149. uhka = target;
  150. mindist = dist;
  151. /*if (mindist<300)
  152. {
  153. accelerate = true;
  154. }*/
  155. }
  156. parts = target.pts;
  157. for (var k = 0; k < parts.length; k++)
  158. {
  159. part = parts[k];
  160. xtd = (part.xx-snake.xx);
  161. ytd = (part.yy-snake.yy);
  162. dist = Math.sqrt(xtd*xtd + ytd*ytd)-DNA[0];
  163. dist = Math.max(1, dist);
  164. xt += -xtd/Math.pow(dist,vaarapower+1)*DNA[3];
  165. yt += -ytd/Math.pow(dist,vaarapower+1)*DNA[3];
  166. }
  167. }
  168. }
  169. if (!(preychase && preys.length>0))
  170. {
  171. for (var i = 0; i < foods_c; i++) {
  172. //alert(myStringArray[i]);
  173. xtd = (foods[i].xx-snake.xx);
  174. ytd = (foods[i].yy-snake.yy);
  175. dist = Math.sqrt(xtd*xtd + ytd*ytd);
  176. //xt += Math.pow(ruokakerroin*foods[i].fw,2)*xtd/Math.pow(dist,ruokapower+1);
  177. //yt += Math.pow(ruokakerroin*foods[i].fw,2)*ytd/Math.pow(dist,ruokapower+1);
  178. xt += Math.pow(foods[i].gr,2)*xtd/Math.pow(dist,ruokapower+1);
  179. yt += Math.pow(foods[i].gr,2)*ytd/Math.pow(dist,ruokapower+1);
  180. }
  181. xtd = (grd-snake.xx);
  182. ytd = (grd-snake.yy);
  183. dist = Math.sqrt(xtd*xtd + ytd*ytd);
  184. xt += xtd/Math.pow(grd-dist,keskipower+1)*DNA[6];
  185. yt += ytd/Math.pow(grd-dist,keskipower+1)*DNA[6];
  186. xt += xtd/grd*DNA[7];
  187. yt += ytd/grd*DNA[7];
  188. }
  189. xm = xt*kerroin;
  190. ym = yt*kerroin;
  191. lsxm = -xm;
  192. lsym = -ym;
  193. if (accelerate)
  194. {
  195. setAcceleration(1);
  196. }
  197. else
  198. {
  199. setAcceleration(0);
  200. }
  201. //console.log("xx:" + view_xx + "yy:" + view_yy);
  202. //console.log("snake.xx:" + snake.xx + "snake.yy:" + snake.yy);
  203. //console.log("snake.fx:" + snake.fx + "snake.fy:" + snake.fy);
  204. //console.log("fvx:" + fvx + "fvy:" + fvy);
  205. //console.log("");
  206. //console.log("foods_c:" + foods_c);
  207. //console.log("snakes.length:" + snakes.length);
  208. //console.log("D:" + Math.sqrt(xm*xm + ym*ym));
  209. lastscore = Math.floor(150 * (fpsls[snake.sct] + snake.fam / fmlts[snake.sct] - 1) - 50) / 10;
  210. if (!lastscore)
  211. {
  212. lastscore = 1;
  213. }
  214. lastrank = rank;
  215. if (!lastrank)
  216. {
  217. lastrank = 500;
  218. }
  219. }
  220. else
  221. {
  222. if (!injected_dead)
  223. {
  224. injected_dead = true;
  225. if (lastscore>bestscore)
  226. {
  227. console.log("Last score: " + lastscore + "(new best)");
  228. bestscore = lastscore;
  229. BESTSCORE = bestscore;
  230. }
  231. else
  232. {
  233. console.log("Last score: " + lastscore + " Best: " + bestscore);
  234. }
  235. if (lastrank<bestrank)
  236. {
  237. console.log("Last rank: " + lastrank + "(new best)");
  238. bestrank = lastrank;
  239. BESTRANK = bestrank;
  240. }
  241. else
  242. {
  243. console.log("Last rank: " + lastrank + " Best: " + bestrank);
  244. }
  245. if (testingdna>0)
  246. {
  247. TESTSCORE = lastscore/(lastrank+1);
  248.  
  249. }
  250. else
  251. {
  252. REALSCORE = (REALSCORE+lastscore/lastrank)/2;
  253. }
  254. lastscore = 0;
  255.  
  256. for (var key in DNA)
  257. {
  258. if (TESTSCORE > REALSCORE)
  259. {
  260. var mul = TESTSCORE/REALSCORE
  261. REALDNA[key] = (REALDNA[key] + TESTDNA[key]*mul)/(1+mul);
  262. REALDNA[key] = Math.round(REALDNA[key]*precision)/precision;
  263. }
  264.  
  265. if (testingdna<0)
  266. {
  267. TESTDNA[key] = REALDNA[key] + REALDNA[key]*(Math.random() - Math.random())*learnrate;
  268. TESTDNA[key] = Math.round(TESTDNA[key]*precision)/precision;
  269. }
  270. }
  271. savedna();
  272.  
  273. testingdna = -testingdna;
  274.  
  275. if (testingdna>0)
  276. {
  277. DNA = TESTDNA.slice();
  278. }
  279. else
  280. {
  281. DNA = REALDNA.slice();
  282. }
  283. //console.log("DNA = [" + DNA + "];");
  284. setTimeout(connect, 3000);
  285. //console.log("Reconnecting");
  286. }
  287. }
  288. }
  289. }
  290.  
  291. var injectbot = function() {
  292. if (typeof(redraw) != "undefined")
  293. {
  294. oldredraw = redraw;
  295.  
  296. redraw = function() {
  297. INJECTED();
  298. oldredraw();
  299. }
  300. console.log("injected")
  301. window.onmousemove = null;
  302. }
  303. else
  304. {
  305. setTimeout(injectbot, 1000);
  306. console.log("retrying")
  307. }
  308. }
  309. injectbot();