Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <list>
- #include <Windows.h>
- #include <algorithm>
- #include <time.h>
- using namespace std;
- int grandseed = 0; // so you dont have to wait a second for new random
- const int bwidth = 20;
- const int bheight = 20;
- int board[bwidth][bheight] = {}; // 0-null, 1-snake, 2-point
- char symbols[] = ".@#";
- void addPoint(){
- while (1){
- srand(time(0) + grandseed);
- grandseed++;
- int x = rand() % bwidth;
- int y = rand() % bheight;
- if (board[x][y] == 0){
- board[x][y] = 2;
- break;
- grandseed += 2;
- }
- }
- }
- struct Tile{
- int x, y, value;
- Tile(int _x, int _y, int _value){
- x = _x;
- y = _y;
- value = _value;
- }
- Tile(int _x, int _y){
- value = 0;
- x = _x;
- y = _y;
- }
- };
- struct Snake{
- int score = 0;
- bool lost = 0;
- short int direction = 0; // 0 left 1 up 2 right 3 down
- short int length = 1;
- list<Tile> tiles;
- Snake(int x, int y){
- tiles.push_front(Tile(x,y,1));
- board[x][y] = 1;
- }
- void Move(){
- int movetile;
- switch (direction){
- case 0:
- movetile = tiles.front().x - 1 == -1 ? bwidth - 1 : tiles.front().x - 1;
- if (board[movetile][tiles.front().y] == 1){
- lost = 1;
- }
- tiles.push_front(Tile(movetile, tiles.front().y, 1)); break;
- //xtiles.push_front(xtiles.front() - 1 == -1 ? bwidth - 1 : xtiles.front() - 1); break; OBSOLETE
- case 1:
- movetile = tiles.front().y - 1 == -1 ? bheight - 1 : tiles.front().y - 1;
- if (board[tiles.front().x][movetile] == 1){
- lost = 1;
- }
- tiles.push_front(Tile(tiles.front().x, movetile, 1)); break;
- //ytiles.push_front(ytiles.front() - 1 == -1 ? bheight - 1 : ytiles.front() - 1); break;
- case 2:
- movetile = tiles.front().x + 1 == bwidth ? 0 : tiles.front().x + 1;
- if (board[movetile][tiles.front().y] == 1){
- lost = 1;
- }
- tiles.push_front(Tile(movetile, tiles.front().y, 1)); break;
- //xtiles.push_front(xtiles.front() + 1 == bwidth ? 0 : xtiles.front() + 1); break;
- case 3:
- movetile = tiles.front().y + 1 == bheight ? 0 : tiles.front().y + 1;
- if (board[tiles.front().x][movetile] == 1){
- lost = 1;
- }
- tiles.push_front(Tile(tiles.front().x, movetile, 1)); break;
- //ytiles.push_front(ytiles.front() + 1 == bheight ? 0 : ytiles.front() + 1); break;
- }
- if (board[tiles.front().x][tiles.front().y] == 2){
- length += 1;
- addPoint();
- score++;
- }
- board[tiles.front().x][tiles.front().y] = 1;
- if (tiles.size() > length){
- board[tiles.back().x][tiles.back().y] = 0;
- tiles.pop_back();
- }
- }
- };
- void drawBoard(int score, int direction){
- system("cls");
- cout << "Score: " << score << " Direction: ";
- switch (direction){
- case 0:
- cout << "left"; break;
- case 1:
- cout << "up"; break;
- case 2:
- cout << "right"; break;
- case 3:
- cout << "down"; break;
- }
- cout << endl;
- for (int i = 0; i < bheight; i++){
- for (int j = 0; j < bwidth; j++){
- cout << symbols[board[j][i]];
- }
- cout << endl;
- }
- }
- void GameLoop(){
- memset(board, 0, sizeof(board));
- Snake snake1(10, 10);
- drawBoard(snake1.score, snake1.direction);
- int loopi = 0;
- addPoint();
- while (1){
- if (GetAsyncKeyState(VK_UP)){
- snake1.direction = 1;
- }
- if (GetAsyncKeyState(VK_DOWN)){
- snake1.direction = 3;
- }
- if (GetAsyncKeyState(VK_LEFT)){
- snake1.direction = 0;
- }
- if (GetAsyncKeyState(VK_RIGHT)){
- snake1.direction = 2;
- }
- loopi++;
- if (loopi == 20){
- snake1.Move();
- if (snake1.lost){
- cout << "You lost. ";
- break;
- }
- drawBoard(snake1.score, snake1.direction);
- loopi = 0;
- }
- Sleep(15);
- }
- }
- int main()
- {
- cout << "\n\t\t\t\t SNAKE\n\nPress any key to continue.";
- getchar();
- while (1){
- GameLoop();
- cout << "Game over. Enter 0 to exit the game. Any other key to retry.";
- int a;
- cin >> a;
- if (a == 0) {
- break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement