From 9031d42ee4e809b1af7ec80fcf44813e99fd7033 Mon Sep 17 00:00:00 2001 From: MerajDerafshi Date: Tue, 23 Sep 2025 02:38:07 +0330 Subject: [PATCH] feat(game): complete full game logic implementation --- snake.cpp | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 3 deletions(-) diff --git a/snake.cpp b/snake.cpp index d8f9f0e..fbd71f6 100644 --- a/snake.cpp +++ b/snake.cpp @@ -1,14 +1,16 @@ #include #include -#include #include +#include using namespace std; bool gameOver; const int width = 40; -const int height = 40; +const int height = 20; int x, y, fruitX, fruitY, score; +int tailX[100], tailY[100]; +int ntail; enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN }; eDirection dir; @@ -29,22 +31,100 @@ void draw() { for(int i = 0; i < height; i++) { for(int j = 0; j < width; j++ ) { if(j == 0) cout << "#"; - cout << " "; + if(i == y && j == x) cout << "O"; + else if(i == fruitY && j == fruitX) cout << "F"; + else { + bool print = false; + for (int k = 0; k < ntail; k++) { + if (tailX[k] == j && tailY[k] == i) { + cout << "o"; + print = true; + } + } + if(!print) cout << " "; + } if(j == width - 1) cout << "#"; } cout << "\n"; } for(int i = 0; i < width + 2; i++) cout << "#"; cout << "\n"; + cout << "score:" << score << "\n"; } void input() { + if(kbhit()) { + char userInput = getch(); + switch(toupper(userInput)) { + case 'A': + case 75: + dir = LEFT; + break; + case 'D': + case 77: + dir = RIGHT; + break; + case 'W': + case 72: + dir = UP; + break; + case 'S': + case 80: + dir = DOWN; + break; + case 27: + break; + } + } } void logic() { + int prevX = tailX[0]; + int prevY = tailY[0]; + int prev2X, prev2Y; + tailX[0] = x; + tailY[0] = y; + for(int i = 1; i < ntail; i++) { + prev2X = tailX[i]; + prev2Y = tailY[i]; + tailX[i] = prevX; + tailY[i] = prevY; + prevX = prev2X; + prevY = prev2Y; + } + + switch(dir){ + case LEFT: + x--; + break; + case RIGHT: + x++; + break; + case UP: + y--; + break; + case DOWN: + y++; + break; + } + + if(x >= width) x = 0; + else if(x < 0) x = width - 1; + if(y >= height) y = 0; + else if(y < 0) y = height - 1; + for(int i = 0; i < ntail; i++) + if(tailX[i] == x && tailY[i] == y) + gameOver = true; + if(x == fruitX && y == fruitY) { + score += 10; + fruitX = rand() % width; + fruitY = rand() % height; + ntail++; + } + } int main() { @@ -53,5 +133,7 @@ int main() { draw(); input(); logic(); + Sleep(100); } + return 0; } \ No newline at end of file