fl3kaucicpp/Snakes/snakes.cpp
2024-06-09 12:55:40 +02:00

192 lines
3.5 KiB
C++

#include <chrono>
#include <iostream>
#include <cstdlib>
#include <ncurses.h>
#include <thread>
using namespace std;
const int width = 80;
const int height = 20;
int X = width/2;
int Y = height/2;
int TailY[100];
int TailX[100];
int sLen = 0;
int sDir = 0;
int score = -1;
int count = 0;
bool gameover;
WINDOW * win;
WINDOW * win2;
void start(){
gameover=false;
}
void gover(){
initscr();
noecho();
curs_set(0);
win = newwin(height, width, 0, 0);
box(win, 0, 0);
mvwprintw(win,10,35,"GAME OVER");
wrefresh(win);
this_thread::sleep_for(chrono::milliseconds(100));
wgetch(win);
endwin();
}
void UserInput(int &tmpv) {
nodelay(stdscr, TRUE);
tmpv = getch();
if (tmpv != ERR) {
sDir = tmpv;
}
}
void fruit(int &fX, int &fY){
if (score != -1) {
mvwprintw(win, fY, fX, "F");
}
if (score == -1 || (fX == X && fY == Y)){
score++;
sLen++;
count++;
wrefresh(win2);
fX = 3 + (rand() % 75);
fY = 3 + (rand() % 15);
}
}
void RenderField(){
initscr();
noecho();
curs_set(0);
win = newwin(height, width, 0, 0);
win2 =newwin(3,width,20,0);
box(win2,20,0);
box(win, 0, 0);
wrefresh(win);
wrefresh(win2);
}
void manu(){
initscr();
//noecho();
//curs_set(0);
win = newwin(height, width, 0, 0);
box(win,0,0);
mvwprintw(win, 1,17, ".d8888. d8b db .d8b. db dD d88888b .d8888. ");
mvwprintw(win, 2,17, "88' YP 888o 88 d8' `8b 88 ,8P' 88' 88' YP ");
mvwprintw(win, 3,17, "`8bo. 88V8o 88 88ooo88 88,8P 88ooooo `8bo. ");
mvwprintw(win, 4,17, " `Y8b. 88 V8o88 88~~~88 88`8b 88~~~~~ `Y8b. ");
mvwprintw(win, 5,17, "db 8D 88 V888 88 88 88 `88. 88. db 8D ");
mvwprintw(win, 6,17, "`8888Y' VP V8P YP YP YP YD Y88888P `8888Y' ");
mvwprintw(win,10, 35, "-Start Game-");
mvwprintw(win,12,38,"-Exit-");
int cur = wmove(win,12,38);
int cur2 = cur;
if (cur2 == cur){
while(true){
nodelay(stdscr,TRUE);
int inp;
int tinp = wgetch(win);
if (tinp != ERR){
inp = tinp;}
if(inp == 10){
gameover=true;
break;}
}
}
wrefresh(win);
wgetch(win);
endwin();
}
void GameUpdate(int &diff, int &fX, int &fY){
int prevX=TailX[0];
int prevY=TailY[0];
int prev2X,prev2Y;
TailX[0]=X;
TailY[0]=Y;
for(int i=1; i<sLen; i++){
prev2X=TailX[i];
prev2Y=TailY[i];
TailX[i]=prevX;
TailY[i]=prevY;
prevX=prev2X;
prevY=prev2Y;
}
switch(sDir){
case 97:
case 68:
X--;
if (X <= 0)
gameover=true;
break;
case 100:
case 67:
X++;
if (X >= 80)
gameover=true;
break;
case 119:
case 65:
Y--;
if (Y <= 0)
gameover=true;
break;
case 115:
case 66:
Y++;
if (Y >= 20)
gameover=true;
break;
}
mvwprintw(win, Y, X, "o");
for(int i=0;i<sLen;i++){
mvwprintw(win, TailY[i], TailX[i],"o");
}
for(int i=1; i<sLen; i++){
if (TailY[i]==Y && TailX[i]==X)
gameover=true;
}
mvwprintw(win2, 1, 3, "Score: %d", score);
fruit(fX, fY);
wrefresh(win2);
wrefresh(win);
if (count >= 5 && diff != 50){
count = 0;
diff -= 50;}
this_thread::sleep_for(chrono::milliseconds(diff));
}
int main(){
int tmpv;
int fX;
int fY;
int diff = 400;
start();
manu();
while(!gameover){
UserInput(tmpv);
RenderField();
GameUpdate(diff,fX,fY);
//cout<<sDir<<endl;
}
gover();
return 0;
}