#include #include #include #include #include #include #include #include using namespace std; #define termMaxX 145 #define termMaxY 36 #define paMaxX 100 #define paMaxY 30 #define upArrow 65 #define downArrow 66 #define rightArrow 67 #define leftArrow 68 #define clear() printf("\033[H\033[J") void drawVoid(){ printf("\033[1;32m\033[40m \033[0m"); } void drawSnake(){ printf("\033[1;32m\033[40m*\033[0m"); } void SetCursorPosition(int XPos, int YPos) { printf("\033[%d;%dH",YPos+1,XPos+1); } void moveSnake(int deltaX, int deltaY, int posX[100], int posY[100], int tempX[2], int tempY[2]){ tempX[0]=posX[0]+deltaX; tempY[0]=posY[0]+deltaY; bool sw=0; for(int i=0;(posX[i]!=-1)&&(posY[i]!=-1);i++){ if((posX[i+1]==-1)&&(posY[i+1]==-1)){ SetCursorPosition(posX[i],posY[i]); drawVoid(); } if(sw==0){ tempX[1]=posX[i]; tempY[1]=posY[i]; posX[i]=tempX[0]; posY[i]=tempY[0]; SetCursorPosition(posX[i],posY[i]); drawSnake(); sw=1; } else if(sw==1){ tempX[0]=posX[i]; tempY[0]=posY[i]; posX[i]=tempX[1]; posY[i]=tempY[1]; SetCursorPosition(posX[i],posY[i]); drawSnake(); sw=0; } } } void drawFrame(){ for(int i=0;i=10){ scoreShift++; temp=temp/10; } SetCursorPosition(((paMaxX/2)-5)-(scoreShift/2),(paMaxY/2)+3); printf("Score: %d", score); SetCursorPosition(2,paMaxY-2); printf("Input your name (without spaces!) and press ENTER to return to main menu."); SetCursorPosition((paMaxX/2)-19,(paMaxY/2)+6); printf("Enter you name: "); //Save player scores at $HOME/.local/share/cursedSnakeGameScores FILE *cmd=popen("echo -n $HOME", "r"); char result[100]={0x0}; fgets(result, sizeof(result), cmd); pclose(cmd); string fullpath=result; fullpath+="/.local/share/cursedSnakeGameScores"; FILE *fptr = fopen(fullpath.c_str(),"a"); if (fptr == NULL) { printf("Could not open file"); return; } string playerName; //Asks for player name scanf("%s",playerName.c_str()); fprintf(fptr,"%d %s\n",score , playerName.c_str()); fclose(fptr); } int mainMenu() { int currentButtonState=0,menuStarted=0; printf("\e[?25l");//ปิดcursor cbreak(); noecho(); scrollok(stdscr, TRUE); nodelay(stdscr, TRUE); char input; while(1){ usleep(50000); //ShowGameLogoOnFirstTime SetCursorPosition((paMaxX/2)-44,(paMaxY/2)-12); printf("\033[45m \033[107m#####\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m######\033[45m \033[107m#####\033[45m \033[107m#######\033[45m \033[107m######\033[45m \033[107m#####\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m########"); SetCursorPosition((paMaxX/2)-44,(paMaxY/2)-11); printf("\033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m####\033[41m \033[107m##\033[45m \033[107m##\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m "); SetCursorPosition((paMaxX/2)-44,(paMaxY/2)-10); printf("\033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#######\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m "); SetCursorPosition((paMaxX/2)-44,(paMaxY/2)-9); printf("\033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m######\033[45m \033[107m#####\033[45m \033[107m#####\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m###\033[45m \033[107m######\033[45m "); SetCursorPosition((paMaxX/2)-44,(paMaxY/2)-8); printf("\033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#####\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#######\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m "); SetCursorPosition((paMaxX/2)-44,(paMaxY/2)-7); printf("\033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m##\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m "); SetCursorPosition((paMaxX/2)-44,(paMaxY/2)-6); printf("\033[45m \033[107m#####\033[45m \033[107m#####\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#####\033[45m \033[107m#######\033[45m \033[107m######\033[45m \033[107m#####\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m#\033[45m \033[107m########"); SetCursorPosition((paMaxX/2)-44,(paMaxY/2)-5); printf("\033[45m GAME\033[0m"); //Author info SetCursorPosition(paMaxX-8,paMaxY-3); printf("\033[45mMade by\033[0m"); SetCursorPosition(paMaxX-39,paMaxY-2); printf("\033[45mPongpeera Wongprasitthiporn (64010543)\033[0m"); //Instructions SetCursorPosition(2,paMaxY-3); printf("\033[45mUse ARROW KEYS to navigate\033[0m"); SetCursorPosition(2,paMaxY-2); printf("\033[45mENTER to select\033[0m"); if(menuStarted<=3){ for(int i=0;i2){ currentButtonState=2; } } if(input=='\n'){ return currentButtonState; } //PlayButtonHighlighted if(currentButtonState==0){ SetCursorPosition((paMaxX/2)-7,(paMaxY/2)-1); printf("\033[107m "); SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+0); printf("\033[107;31m Play \033[0m"); SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+1); printf("\033[107m "); } //PlayButton else{ SetCursorPosition((paMaxX/2)-7,(paMaxY/2)-1); printf("\033[45m "); SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+0); printf("\033[45m Play "); SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+1); printf("\033[45m "); } //LeaderboardsHighlighted if(currentButtonState==1){ SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+3); printf("\033[107m "); SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+4); printf("\033[107;31m Scores \033[0m"); SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+5); printf("\033[107m "); } //LeaderboardsButton else{ SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+3); printf("\033[45m "); SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+4); printf("\033[45m Scores "); SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+5); printf("\033[45m "); } //ExitHighlighted if(currentButtonState==2){ SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+6); printf("\033[107m "); SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+7); printf("\033[107;31m Exit \033[0m"); SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+8); printf("\033[107m "); } //ExitButton else{ SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+6); printf("\033[45m "); SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+7); printf("\033[45m Exit "); SetCursorPosition((paMaxX/2)-7,(paMaxY/2)+8); printf("\033[45m "); } } } void showScores() { endwin(); system("if [[ ! -f $HOME/.local/share/cursedSnakeGameScores ]]; then touch $HOME/.local/share/cursedSnakeGameScores; fi"); system("sort $HOME/.local/share/cursedSnakeGameScores -nr > $HOME/.local/share/cursedSnakeGameScores.tmp && mv $HOME/.local/share/cursedSnakeGameScores.tmp $HOME/.local/share/cursedSnakeGameScores"); int line=0,currentLine=0; char c; //UserInputCharacter FILE *cmd=popen("echo -n $HOME", "r"); char result[100]={0x0}; fgets(result, sizeof(result), cmd); pclose(cmd); string fullpath=result; fullpath+="/.local/share/cursedSnakeGameScores"; FILE *fptr = fopen(fullpath.c_str(),"r"); if(fptr == NULL) { perror("Error in opening file, creating data file."); system("touch $HOME/.local/share/cursedSnakeGameScores"); sleep(3); return; } do { c = fgetc(fptr); if( feof(fptr) ) { break ; } if(c=='\n'){ line++; } } while(1); for(int i=0;i=1)&&(lastInput!='d')){ moveSnake(-1,0,posX,posY,tempX,tempY); lastInput='a'; } } else if(input=='d'||input==rightArrow){ if((posX[0]<=98)&&(lastInput!='a')){ moveSnake(1,0,posX,posY,tempX,tempY); lastInput='d'; } } else if(input=='w'||input==upArrow){ if((posY[0]>=1)&&(lastInput!='s')){ moveSnake(0,-1,posX,posY,tempX,tempY); lastInput='w'; } } else if(input=='s'||input==downArrow){ if((posY[0]<=28)&&(lastInput!='w')){ moveSnake(0,1,posX,posY,tempX,tempY); lastInput='s'; } } else if(input=='b'){ lastInput='0'; } thistimeMillisec=(double)(this_t-start_t)/(double)CLOCKS_PER_SEC*10; if(((int)thistimeMillisec%10)==1){ if(lastInput=='a'){ if(posX[0]>=1){ moveSnake(-1,0,posX,posY,tempX,tempY); lastInput='a'; } } else if(lastInput=='d'){ if(posX[0]<=98){ moveSnake(1,0,posX,posY,tempX,tempY); lastInput='d'; } } if(crashWall(posX[0],posY[0])||crashSnake(posX,posY)){ system("((speaker-test -t sine -f 700)& pid=$!; sleep 1s; kill -9 $pid) > /dev/null"); break; } start_t=this_t; } thistimeMillisec=(double)(this_t-start)/(double)CLOCKS_PER_SEC*7; if(((int)thistimeMillisec%10)==1){ if(lastInput=='w'){ if(posY[0]>=1){ moveSnake(0,-1,posX,posY,tempX,tempY); lastInput='w'; } } else if(lastInput=='s'){ if(posY[0]<=28){ moveSnake(0,1,posX,posY,tempX,tempY); lastInput='s'; } } start=this_t; } if(crashBomb(posX[0],posY[0],bombX,bombY,bombShown)){ system("((speaker-test -t sine -f 700)& pid=$!; sleep 1s; kill -9 $pid) > /dev/null"); break; } if(eatFruit(posX[0],posY[0],fruitX,fruitY)==1){ snakeLength++; fruitX=rand()%96+2; fruitY=rand()%26+2; for(int k=0;bombShown[k]==1;k++){ while(1){ if(fruitX!=bombX[k]){ if(fruitY!=bombY[k]){ break; } } fruitX=rand()%96+2; fruitY=rand()%26+2; } } if(snakeLength<=100){ posX[snakeLength-1]=0; posY[snakeLength-1]=0; } system("((speaker-test -t sine -f 700)& pid=$!; sleep 0.1s; kill -9 $pid) > /dev/null"); } SetCursorPosition(fruitX,fruitY); printf("0"); if(snakeLength-2>=bombAmount){ bombLoop++; bombShown[bombLoop-2]=1; bombAmount=bombLoop*3; } for(int i=0;i<100;i++){ if(bombShown[i]==1){ SetCursorPosition(bombX[i],bombY[i]); printf("\033[1;97m\033[41m \033[0m"); } } } return snakeLength-2; } int main () { int mainMenuSelected,score; initscr(); while(1){ mainMenuSelected=mainMenu(); if(mainMenuSelected==0){ score=game(); gameOver(score); getchar(); } if(mainMenuSelected==1){ showScores(); } if(mainMenuSelected==2){ return 0; } } }