Advertisement
Guest User

Untitled

a guest
Jan 21st, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.12 KB | None | 0 0
  1. int snakeLength = 2, rectWidth = 20, generatePickupFrequency = 120, snakeSpeed=30,snakeSpeedJump=5;
  2. int startPosX, startPosY;
  3. int speedX, speedY;
  4. int pickupPosX, pickupPosY;
  5. boolean pickedBlock = false;
  6. int lastLeftPosX, lastLeftPosY; // Use these to remember which cell you where last on to re-use it to grow
  7. int []snakeRectPosXArr = new int[2];
  8. int []snakeRectPosYArr = new int[2];
  9.  
  10. void setup()
  11. {
  12. size(400, 400);
  13. background(0);
  14. startPosX = width/2;
  15. startPosY = height/2;
  16. snakeRectPosXArr[0]=startPosX;
  17. snakeRectPosYArr[0]=startPosY;
  18. snakeRectPosXArr[1]=startPosX;
  19. snakeRectPosYArr[1]=startPosY+rectWidth;
  20. speedY = -1; // start with the snake moving upwards
  21. speedX = 0;
  22. generatePickupPos();
  23. }
  24.  
  25. void draw()
  26. {
  27. clear();
  28. background(0);
  29. // ReDraw pickup every 2 seconds
  30. if ( frameCount % generatePickupFrequency == 0 ) {
  31. generatePickupPos();
  32. }
  33. drawPickup();
  34. drawSnake();
  35. if ( checkIfLost() ) {
  36. // LOST !!
  37. noLoop();
  38. background(255, 0, 0);
  39. textSize(32);
  40. fill(255);
  41. text("LOST! - SCORE: "+ (snakeRectPosYArr.length - 2), 60, height/2);
  42. }
  43. // Move snake every x seconds depending on length of snake
  44. // The longer the snake, the faster moveSnake will be called
  45. if ( frameCount % floor(snakeSpeed/(floor((snakeRectPosYArr.length - 2)/snakeSpeedJump)+1)) == 0 ) {
  46. moveSnake();
  47. }
  48. }
  49.  
  50. void drawSnake() {
  51. fill(255); // Fill the snake with white
  52. for (int i = 0; i < snakeRectPosXArr.length; i++) {
  53. rect(snakeRectPosXArr[i], snakeRectPosYArr[i], rectWidth, rectWidth);
  54. }
  55. // Draw a dot in the first element (head) with a slightly different color
  56. fill(0, 0, 255); // Blue for the head
  57. ellipse(snakeRectPosXArr[0]+rectWidth/2, snakeRectPosYArr[0]+rectWidth/2, rectWidth/2, rectWidth/2);
  58. }
  59.  
  60. void moveSnake() {
  61. // Shift the array backwards, so the new position
  62. // can be added to the array on index position 0
  63.  
  64. // Remember which cell you where last on to re-use it to grow in case you eat a pickup
  65. lastLeftPosX = snakeRectPosXArr[snakeRectPosXArr.length-1];
  66. lastLeftPosY = snakeRectPosYArr[snakeRectPosYArr.length-1];
  67.  
  68. // Shift cells
  69. for (int i = snakeRectPosXArr.length-1; i > 0; i--) {
  70. snakeRectPosXArr[i] = snakeRectPosXArr[i-1];
  71. snakeRectPosYArr[i] = snakeRectPosYArr[i-1];
  72. }
  73.  
  74. // Add new position as per pressed keys
  75. snakeRectPosXArr[0] = snakeRectPosXArr[1]+(speedX*rectWidth);
  76. snakeRectPosYArr[0] = snakeRectPosYArr[1]+(speedY*rectWidth);
  77.  
  78. // Check if you hit the Pickup
  79. if (pickupPosX == snakeRectPosXArr[0] && pickupPosY == snakeRectPosYArr[0] ) {
  80. // You hit the pickup
  81. addPosition();
  82. }
  83. }
  84.  
  85. void generatePickupPos() {
  86. boolean spotTaken = true;
  87. // Avoid adding a Pickup on a location used by the snake
  88. while (spotTaken) {
  89. // generate a random number that is a multiple of rectWidth
  90. pickupPosX = (int) random(width/rectWidth) * rectWidth ; // random between 0 and 19
  91. pickupPosY = (int) random(height/rectWidth) * rectWidth ;
  92. // Check if that point is not already taken by the snake
  93. for (int i = 0; i < snakeRectPosXArr.length; i++) {
  94. if (pickupPosX != snakeRectPosXArr[i] && pickupPosY != snakeRectPosYArr[i]) {
  95. spotTaken = false; // free spot found! We can stop here.
  96. }
  97. }
  98. }
  99. ;
  100. }
  101.  
  102. void drawPickup() {
  103. fill(0, 255, 0); // Fill the pickup with green
  104. rect(pickupPosX, pickupPosY, rectWidth, rectWidth);
  105. }
  106.  
  107. void addPosition() {
  108. // Use the cell you left last to grow
  109. // as this spot is free and within the screen borders
  110. snakeRectPosXArr = append(snakeRectPosXArr, lastLeftPosX);
  111. snakeRectPosYArr = append(snakeRectPosYArr, lastLeftPosY);
  112. }
  113.  
  114. boolean checkIfLost() {
  115. // Check if the first element of the snake hits the walls or itself
  116. // Check for walls
  117. if ( snakeRectPosXArr[0] >= width ||
  118. snakeRectPosXArr[0] < 0 ||
  119. snakeRectPosYArr[0] >= height ||
  120. snakeRectPosYArr[0] < 0 ) {
  121. return true;
  122. }
  123.  
  124. // Check for the snake itself by checking
  125. // if the X Y position of one of the elements matches the first element
  126. for (int i = 1; i < snakeRectPosXArr.length; i++) {
  127. if ( snakeRectPosXArr[0] == snakeRectPosXArr[i] && snakeRectPosYArr[0] == snakeRectPosYArr[i]) {
  128. return true;
  129. }
  130. }
  131. // You are not lost if you got this far
  132. return false;
  133. }
  134.  
  135. void keyPressed() { // Controls new Snake direction
  136. if (key==CODED) {
  137. // Note: Ignore accidental direction changes of 180 degrees or you would be eating yourself immediately
  138. if (keyCode==RIGHT) {
  139. if ( speedX == -1 && speedY == 0 ) return ; // ignore if we try to turn 180 degrees
  140. speedX=1;
  141. speedY=0;
  142. }
  143. if (keyCode==LEFT) {
  144. if ( speedX == 1 && speedY == 0 ) return ; // ignore if we try to turn 180 degrees
  145. speedX=-1;
  146. speedY=0;
  147. }
  148. if (keyCode==UP) {
  149. if ( speedX == 0 && speedY == 1 ) return ; // ignore if we try to turn 180 degrees
  150. speedX=0;
  151. speedY=-1;
  152. }
  153. if (keyCode==DOWN) {
  154. if ( speedX == 0 && speedY == -1 ) return ; // ignore if we try to turn 180 degrees
  155. speedX=0;
  156. speedY=1;
  157. }
  158. moveSnake();
  159. }
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement