Snake-joc
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
// Dimensiuni joc
#define WIDTH 30
#define HEIGHT 20
// Direcțiile posibile ale șarpelui
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
// Structura pentru a stoca coordonatele
typedef struct {
int x;
int y;
} Position;
Position snake[100]; // Vector pentru a stoca pozițiile șarpelui
int length = 1; // Lungimea șarpelui
Position fruit; // Poziția fructului
int direction = RIGHT; // Direcția inițială
int gameover = 0; // Flag pentru terminarea jocului
// Functii pentru desenarea jocului
void draw() {
system("cls"); // Șterge ecranul
// Desenează pereții jocului
for (int i = 0; i < WIDTH + 2; i++) {
printf("#");
printf("\n");
// Desenează jocul
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
if (j == 0) {
printf("#"); // Coloană stânga
} else if (j == WIDTH - 1) {
printf("#"); // Coloană dreapta
} else if (i == snake[0].y && j == snake[0].x) {
printf("O"); // Capul șarpelui
} else if (i == fruit.y && j == fruit.x) {
printf("F"); // Fructul
} else {
int print = 0;
for (int k = 1; k < length; k++) {
if (snake[k].x == j && snake[k].y == i) {
printf("o"); // Corpul șarpelui
print = 1;
break;
if (!print) {
printf(" "); // Spațiu gol
printf("\n");
// Desenează baza jocului
for (int i = 0; i < WIDTH + 2; i++) {
printf("#");
printf("\n");
// Functia pentru a mișca șarpele
void input() {
if (_kbhit()) {
switch (_getch()) {
case 'w':
if (direction != DOWN) direction = UP;
break;
case 's':
if (direction != UP) direction = DOWN;
break;
case 'a':
if (direction != RIGHT) direction = LEFT;
break;
case 'd':
if (direction != LEFT) direction = RIGHT;
break;
case 'x':
gameover = 1;
break;
// Functia care mișcă șarpele
void logic() {
Position prevHead = snake[0];
Position prev2Head;
snake[0].x = snake[0].x + (direction == RIGHT) - (direction == LEFT);
snake[0].y = snake[0].y + (direction == DOWN) - (direction == UP);
// Mișcă corpul șarpelui
for (int i = 1; i < length; i++) {
prev2Head = snake[i];
snake[i] = prevHead;
prevHead = prev2Head;
// Dacă șarpele a mâncat fructul
if (snake[0].x == fruit.x && snake[0].y == fruit.y) {
length++; // Crește lungimea șarpelui
fruit.x = rand() % WIDTH;
fruit.y = rand() % HEIGHT;
// Verifică coliziunea cu pereții
if (snake[0].x <= 0 || snake[0].x >= WIDTH - 1 || snake[0].y <= 0 || snake[0].y >= HEIGHT - 1)
{
gameover = 1;
// Verifică coliziunea cu corpul șarpelui
for (int i = 1; i < length; i++) {
if (snake[i].x == snake[0].x && snake[i].y == snake[0].y) {
gameover = 1;
}
}
int main() {
srand(time(0));
snake[0].x = WIDTH / 2;
snake[0].y = HEIGHT / 2;
// Plasăm fructul
fruit.x = rand() % WIDTH;
fruit.y = rand() % HEIGHT;
// Jocul propriu-zis
while (!gameover) {
draw();
input();
logic();
Sleep(100); // Controlează viteza jocului
printf("Game Over!\n");
return 0;