I2luY2x1ZGUgJmx0O2lvc3RyZWFtJmd0OwojaW5jbHVkZSAmbHQ7dmVjdG9yJmd0OwojaW5jbHVkZSAmbHQ7Y3N0ZGxpYiZndDsKI2luY2x1ZGUgJmx0O2N0aW1lJmd0OwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBXSURUSCA9IDIwOwpjb25zdCBpbnQgSEVJR0hUID0gMjA7CgpzdHJ1Y3QgUG9pbnQgewogICAgaW50IHg7CiAgICBpbnQgeTsKfTsKCnZlY3RvciZsdDtQb2ludCZndDsgc25ha2U7ClBvaW50IGZvb2Q7CmludCBkaXJlY3Rpb247IAppbnQgc2NvcmU7Cgp2b2lkIGluaXRHYW1lKCkgewogICAgc25ha2UucHVzaF9iYWNrKHtXSURUSCAvIDIsIEhFSUdIVCAvIDJ9KTsKICAgIGZvb2QgPSB7cmFuZCgpICUgV0lEVEgsIHJhbmQoKSAlIEhFSUdIVH07CiAgICBkaXJlY3Rpb24gPSAxOyAKICAgIHNjb3JlID0gMDsKfQoKdm9pZCBkcmF3R2FtZSgpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgSEVJR0hUOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiAmbHQ7IFdJRFRIOyBqKyspIHsKICAgICAgICAgICAgaWYgKGkgPT0gc25ha2VbMF0ueSAmYW1wOyZhbXA7IGogPT0gc25ha2VbMF0ueCkgewogICAgICAgICAgICAgICAgY291dCAmbHQ7Jmx0OyAmcXVvdDtPJnF1b3Q7OyAKICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IGZvb2QueSAmYW1wOyZhbXA7IGogPT0gZm9vZC54KSB7CiAgICAgICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O0YmcXVvdDs7IAogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYm9vbCBpc1NuYWtlQm9keSA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDE7IGsgJmx0OyBzbmFrZS5zaXplKCk7IGsrKykgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09IHNuYWtlW2tdLnkgJmFtcDsmYW1wOyBqID09IHNuYWtlW2tdLngpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNTbmFrZUJvZHkgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaXNTbmFrZUJvZHkpIHsKICAgICAgICAgICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O28mcXVvdDs7IAogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90OyAmcXVvdDs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY291dCAmbHQ7Jmx0OyBlbmRsOwogICAgfQp9Cgp2b2lkIHVwZGF0ZUdhbWUoKSB7CiAgICBQb2ludCBuZXdIZWFkOwogICAgc3dpdGNoIChkaXJlY3Rpb24pIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIG5ld0hlYWQgPSB7c25ha2VbMF0ueCwgc25ha2VbMF0ueSAtIDF9OwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6IAogICAgICAgICAgICBuZXdIZWFkID0ge3NuYWtlWzBdLnggKyAxLCBzbmFrZVswXS55fTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOiAKICAgICAgICAgICAgbmV3SGVhZCA9IHtzbmFrZVswXS54LCBzbmFrZVswXS55ICsgMX07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgbmV3SGVhZCA9IHtzbmFrZVswXS54IC0gMSwgc25ha2VbMF0ueX07CiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgc25ha2UuaW5zZXJ0KHNuYWtlLmJlZ2luKCksIG5ld0hlYWQpOwogICAgaWYgKHNuYWtlWzBdLnggPT0gZm9vZC54ICZhbXA7JmFtcDsgc25ha2VbMF0ueSA9PSBmb29kLnkpIHsKICAgICAgICBzY29yZSsrOwogICAgICAgIGZvb2QgPSB7cmFuZCgpICUgV0lEVEgsIHJhbmQoKSAlIEhFSUdIVH07CiAgICB9IGVsc2UgewogICAgICAgIHNuYWtlLnBvcF9iYWNrKCk7CiAgICB9Cn0KCnZvaWQgaGFuZGxlSW5wdXQoKSB7CiAgICBjaGFyIGlucHV0OwogICAgY2luICZndDsmZ3Q7IGlucHV0OwogICAgc3dpdGNoIChpbnB1dCkgewogICAgICAgIGNhc2UgJ3cnOgogICAgICAgICAgICBkaXJlY3Rpb24gPSAwOyAvLyB1cAogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgZGlyZWN0aW9uID0gMTsgCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICBkaXJlY3Rpb24gPSAyOyAKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgIGRpcmVjdGlvbiA9IDM7IAogICAgICAgICAgICBicmVhazsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBzcmFuZCh0aW1lKDApKTsKICAgIGluaXRHYW1lKCk7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGRyYXdHYW1lKCk7CiAgICAgICAgaGFuZGxlSW5wdXQoKTsKICAgICAgICB1cGRhdGVHYW1lKCk7CiAgICAgICAgaWYgKHNuYWtlWzBdLnggJmx0OyAwIHx8IHNuYWtlWzBdLnggJmd0Oz0gV0lEVEggfHwgc25ha2VbMF0ueSAmbHQ7IDAgfHwgc25ha2VbMF0ueSAmZ3Q7PSBIRUlHSFQpIHsKICAgICAgICAgICAgY291dCAmbHQ7Jmx0OyAmcXVvdDtHYW1lIG92ZXIhIFlvdXIgc2NvcmUgaXMgJnF1b3Q7ICZsdDsmbHQ7IHNjb3JlICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpID0gMTsgaSAmbHQ7IHNuYWtlLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChzbmFrZVswXS54ID09IHNuYWtlW2ldLnggJmFtcDsmYW1wOyBzbmFrZVswXS55ID09IHNuYWtlW2ldLnkpIHsKICAgICAgICAgICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q7R2FtZSBvdmVyISBZb3VyIHNjb3JlIGlzICZxdW90OyAmbHQ7Jmx0OyBzY29yZSAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQ==
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
const int WIDTH = 20;
const int HEIGHT = 20;
struct Point {
int x;
int y;
};
vector<Point> snake;
Point food;
int direction;
int score;
void initGame() {
snake.push_back({WIDTH / 2, HEIGHT / 2});
food = {rand() % WIDTH, rand() % HEIGHT};
direction = 1;
score = 0;
}
void drawGame() {
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
if (i == snake[0].y && j == snake[0].x) {
cout << "O";
} else if (i == food.y && j == food.x) {
cout << "F";
} else {
bool isSnakeBody = false;
for (int k = 1; k < snake.size(); k++) {
if (i == snake[k].y && j == snake[k].x) {
isSnakeBody = true;
break;
}
}
if (isSnakeBody) {
cout << "o";
} else {
cout << " ";
}
}
}
cout << endl;
}
}
void updateGame() {
Point newHead;
switch (direction) {
case 0:
newHead = {snake[0].x, snake[0].y - 1};
break;
case 1:
newHead = {snake[0].x + 1, snake[0].y};
break;
case 2:
newHead = {snake[0].x, snake[0].y + 1};
break;
case 3:
newHead = {snake[0].x - 1, snake[0].y};
break;
}
snake.insert(snake.begin(), newHead);
if (snake[0].x == food.x && snake[0].y == food.y) {
score++;
food = {rand() % WIDTH, rand() % HEIGHT};
} else {
snake.pop_back();
}
}
void handleInput() {
char input;
cin >> input;
switch (input) {
case 'w':
direction = 0; // up
break;
case 'd':
direction = 1;
break;
case 's':
direction = 2;
break;
case 'a':
direction = 3;
break;
}
}
int main() {
srand(time(0));
initGame();
while (true) {
drawGame();
handleInput();
updateGame();
if (snake[0].x < 0 || snake[0].x >= WIDTH || snake[0].y < 0 || snake[0].y >= HEIGHT) {
cout << "Game over! Your score is " << score << endl;
break;
}
for (int i = 1; i < snake.size(); i++) {
if (snake[0].x == snake[i].x && snake[0].y == snake[i].y) {
cout << "Game over! Your score is " << score << endl;
break;
}
}
}
return 0;
}