Advertisement
Guest User

snake

a guest
Nov 1st, 2014
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.84 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <list>
  4. #include <Windows.h>
  5. #include <algorithm>
  6. #include <time.h>
  7. using namespace std;
  8.  
  9.  
  10. int grandseed = 0; // so you dont have to wait a second for new random
  11. const int bwidth = 20;
  12. const int bheight = 20;
  13. int board[bwidth][bheight] = {}; // 0-null, 1-snake, 2-point
  14. char symbols[] = ".@#";
  15.  
  16. void addPoint(){
  17.     while (1){
  18.         srand(time(0) + grandseed);
  19.         grandseed++;
  20.         int x = rand() % bwidth;
  21.         int y = rand() % bheight;
  22.         if (board[x][y] == 0){
  23.             board[x][y] = 2;
  24.             break;
  25.             grandseed += 2;
  26.         }
  27.  
  28.     }
  29. }
  30.  
  31. struct Tile{
  32.     int x, y, value;
  33.     Tile(int _x, int _y, int _value){
  34.         x = _x;
  35.         y = _y;
  36.         value = _value;
  37.     }
  38.     Tile(int _x, int _y){
  39.         value = 0;
  40.         x = _x;
  41.         y = _y;
  42.     }
  43. };
  44.  
  45. struct Snake{
  46.     int score = 0;
  47.     bool lost = 0;
  48.     short int direction = 0; // 0 left 1 up 2 right 3 down
  49.     short int length = 1;
  50.     list<Tile> tiles;
  51.     Snake(int x, int y){
  52.         tiles.push_front(Tile(x,y,1));
  53.         board[x][y] = 1;
  54.     }
  55.    
  56.     void Move(){
  57.         int movetile;
  58.         switch (direction){
  59.         case 0:
  60.             movetile = tiles.front().x - 1 == -1 ? bwidth - 1 : tiles.front().x - 1;
  61.             if (board[movetile][tiles.front().y] == 1){
  62.                 lost = 1;
  63.             }
  64.             tiles.push_front(Tile(movetile, tiles.front().y, 1)); break;
  65.             //xtiles.push_front(xtiles.front() - 1 == -1 ? bwidth - 1 : xtiles.front() - 1); break; OBSOLETE
  66.         case 1:
  67.             movetile = tiles.front().y - 1 == -1 ? bheight - 1 : tiles.front().y - 1;
  68.             if (board[tiles.front().x][movetile] == 1){
  69.                 lost = 1;
  70.             }
  71.             tiles.push_front(Tile(tiles.front().x, movetile, 1)); break;
  72.             //ytiles.push_front(ytiles.front() - 1 == -1 ? bheight - 1 : ytiles.front() - 1); break;
  73.         case 2:
  74.             movetile = tiles.front().x + 1 == bwidth ? 0 : tiles.front().x + 1;
  75.             if (board[movetile][tiles.front().y] == 1){
  76.                 lost = 1;
  77.             }
  78.             tiles.push_front(Tile(movetile, tiles.front().y, 1)); break;
  79.             //xtiles.push_front(xtiles.front() + 1 == bwidth ? 0 : xtiles.front() + 1); break;
  80.         case 3:
  81.             movetile = tiles.front().y + 1 == bheight ? 0 : tiles.front().y + 1;
  82.             if (board[tiles.front().x][movetile] == 1){
  83.                 lost = 1;
  84.             }
  85.             tiles.push_front(Tile(tiles.front().x, movetile, 1)); break;
  86.             //ytiles.push_front(ytiles.front() + 1 == bheight ? 0 : ytiles.front() + 1); break;
  87.         }
  88.         if (board[tiles.front().x][tiles.front().y] == 2){
  89.             length += 1;
  90.             addPoint();
  91.             score++;
  92.         }
  93.         board[tiles.front().x][tiles.front().y] = 1;
  94.         if (tiles.size() > length){
  95.             board[tiles.back().x][tiles.back().y] = 0;
  96.             tiles.pop_back();
  97.         }
  98.     }
  99. };
  100.  
  101. void drawBoard(int score, int direction){
  102.     system("cls");
  103.    
  104.     cout << "Score: " << score << "  Direction: ";
  105.     switch (direction){
  106.     case 0:
  107.         cout << "left"; break;
  108.     case 1:
  109.         cout << "up"; break;
  110.     case 2:
  111.         cout << "right"; break;
  112.     case 3:
  113.         cout << "down"; break;
  114.     }
  115.     cout << endl;
  116.     for (int i = 0; i < bheight; i++){
  117.         for (int j = 0; j < bwidth; j++){
  118.             cout << symbols[board[j][i]];
  119.         }
  120.         cout << endl;
  121.     }
  122. }
  123. void GameLoop(){
  124.     memset(board, 0, sizeof(board));
  125.     Snake snake1(10, 10);
  126.     drawBoard(snake1.score, snake1.direction);
  127.     int loopi = 0;
  128.     addPoint();
  129.     while (1){
  130.         if (GetAsyncKeyState(VK_UP)){
  131.             snake1.direction = 1;
  132.         }
  133.         if (GetAsyncKeyState(VK_DOWN)){
  134.             snake1.direction = 3;
  135.         }
  136.         if (GetAsyncKeyState(VK_LEFT)){
  137.             snake1.direction = 0;
  138.         }
  139.         if (GetAsyncKeyState(VK_RIGHT)){
  140.             snake1.direction = 2;
  141.         }
  142.         loopi++;
  143.         if (loopi == 20){
  144.             snake1.Move();
  145.             if (snake1.lost){
  146.                 cout << "You lost. ";
  147.                 break;
  148.             }
  149.             drawBoard(snake1.score, snake1.direction);
  150.  
  151.             loopi = 0;
  152.         }
  153.         Sleep(15);
  154.     }
  155. }
  156.  
  157. int main()
  158. {
  159.     cout << "\n\t\t\t\t  SNAKE\n\nPress any key to continue.";
  160.     getchar();
  161.     while (1){
  162.         GameLoop();
  163.         cout << "Game over. Enter 0 to exit the game. Any other key to retry.";
  164.         int a;
  165.         cin >> a;
  166.         if (a == 0) {
  167.             break;
  168.         }
  169.     }
  170.    
  171.     return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement