Skip to content

Instantly share code, notes, and snippets.

@poseidon4o
Last active July 2, 2024 14:02
Show Gist options
  • Save poseidon4o/f2da3d30af9abf84f56e to your computer and use it in GitHub Desktop.
Save poseidon4o/f2da3d30af9abf84f56e to your computer and use it in GitHub Desktop.
C++ lame snake game written in class
#include <iostream>
#include <windows.h>
using namespace std;
struct position {
int x,y;
};
class field_cls {
static const int height;
static const int width;
char ** field;
field_cls(const field_cls &);
field_cls operator=(const field_cls &);
public:
field_cls() {
field = new char*[field_cls::height];
for(int c = 0; c < field_cls::height; ++c) {
field[c] = new char[field_cls::width];
}
}
~field_cls() {
for(int c = 0; c < field_cls::height; ++c) {
delete[] field[c];
}
delete[] field;
}
void print() {
for(int c = 0; c < height; ++c) {
for(int r = 0; r < width; ++r) {
cout << field[c][r];
}
cout << endl;
}
}
void clear() {
for(int c = 0; c < height; ++c) {
for(int r = 0; r < width; ++r) {
field[c][r] = ' ';
}
}
}
int get_width() const {return width;}
int get_height() const {return height;}
void draw(int y, int x, char what) {
//y = (y < 0) ? 0 : (y >= height ? height - 1 : y);
//x = (x < 0) ? 0 : (x >= width ? width - 1 : x);
field[y][x] = what;
}
} field;
class food_cls {
position pos;
char symbol;
public:
food_cls(): symbol('X'), pos() {
pos.x = pos.y = -1;
}
void set_pos(int x, int y) {
pos.x = x;
pos.y = y;
}
void reposition(const field_cls & field) {
pos.x = rand() % field.get_width();
pos.y = rand() % field.get_height();
}
int get_x() const {return pos.x;}
int get_y() const {return pos.y;}
char get_symbol() const {return symbol;}
} food;
class snake_cls {
enum {UP, DOWN, LEFT, RIGHT} dir;
char symbol, head_symbol;
position pos[100];
position & head;
int speed;
int size;
bool can_turn;
public:
snake_cls(int x, int y):
symbol('#'), head_symbol('@'), pos(),
speed(1), size(1), dir(RIGHT),
head(pos[0]), can_turn(true)
{
pos[0].x = x;
pos[0].y = y;
}
bool check_food(const food_cls & food) {
if(food.get_x() == head.x && food.get_y() == head.y) {
size += 1;
return true;
}
return false;
}
void get_input(const field_cls & field) {
if(GetAsyncKeyState(VK_UP) && dir != DOWN) {
dir = UP;
}
if(GetAsyncKeyState(VK_DOWN) && dir != UP) {
dir = DOWN;
}
if(GetAsyncKeyState(VK_LEFT) && dir != RIGHT) {
dir = LEFT;
}
if(GetAsyncKeyState(VK_RIGHT) && dir != LEFT) {
dir = RIGHT;
}
}
void move(const field_cls & field) {
position next = {0, 0};
switch(dir) {
case UP:
next.y = -speed;
break;
case DOWN:
next.y = speed;
break;
case LEFT:
next.x = -speed;
break;
case RIGHT:
next.x = speed;
}
for(int c = size - 1; c > 0; --c) {
pos[c] = pos[c-1];
}
head.x += next.x;
head.y += next.y;
if(head.x < 0 || head.y < 0 || head.x >= field.get_width() || head.y >= field.get_height()) {
throw "DEADD!!!!";
}
}
void draw(field_cls & field) {
for(int c = 0; c < size; ++c) {
if(c == 0) {
field.draw(pos[c].y, pos[c].x, head_symbol);
} else {
field.draw(pos[c].y, pos[c].x, symbol);
}
}
}
int get_x() const { return head.x; }
int get_y() const { return head.y; }
char get_symbol() const { return symbol; }
} snake(1, 1);
const int field_cls::height = 24;
const int field_cls::width = 79;
int main() {
field.clear();
food.set_pos(5, 5);
while(1) {
field.clear();
snake.get_input(field);
try {
snake.move(field);
} catch (const char * er) {
field.clear();
cerr << er << endl;
system("pause");
return -1;
}
snake.draw(field);
field.draw(food.get_y(), food.get_x(), food.get_symbol());
if(snake.check_food(food)) {
food.reposition(field);
}
field.print();
Sleep(1000/30);
system("cls");
}
return 0;
}
@mindfulme
Copy link

gj, works perfectly

@martinlinggajaya
Copy link

Awesome, but how do you get rid of the random cursors moving around the field?

@yoloyussuf
Copy link

it says no such file or directory as <windows.h>

@naasirlamela
Copy link

nice code works so good

@ignatiousv
Copy link

awesome bro!!!!!!!!!!!!!!!!!!!!!!!!!

@kele1997
Copy link

nice code ! By the way,if you can't stand the cursor random moving ,you can refer this code and use the setcursor function to hide the cursor

@haxxsoc
Copy link

haxxsoc commented Mar 25, 2019

Nice code, but there are some drawings that are missing.. the "borders".. and gameOver modules

@MJBx
Copy link

MJBx commented May 30, 2019

interesting.

@hosen1216
Copy link

very goooooooooooooooooooooooooood

@theratcoder
Copy link

it says no such file or directory as <windows.h>

What OS does your computer run?

Copy link

ghost commented Aug 29, 2020

nice!

@Dabora9
Copy link

Dabora9 commented Nov 12, 2020

You can fix the curser problem by right clicking the console after you run the program then properties > terminal > curser color
and make the curser color the same with the background color, not very efficient but if you just want to hide it there you go

@ChrisCodes-tech
Copy link

I like the way you think bruh, this is awesome :)

@Inishpy
Copy link

Inishpy commented Feb 18, 2021

perfectly fine, im just starting with c++

@abdulx01
Copy link

It's not working !

@krishpranav
Copy link

nice

@Tatrah
Copy link

Tatrah commented Apr 27, 2022

Very lame nice

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment