228 lines
5.8 KiB
C++
228 lines
5.8 KiB
C++
#include <time.h>
|
|
#include <iostream>
|
|
#include <stdio.h>
|
|
#include <curses.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
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
|
|
|
|
|
|
void drawVoid(){
|
|
|
|
printf("\033[1;32m\033[40m \033[0m"); //\033[1;32m green text,\033[40m black bg, display " ",\033[0m set default
|
|
}
|
|
void drawSnake(){
|
|
printf("\033[1;32m\033[40m*\033[0m"); //\033[1;32m green text,\033[40m black bg, display *,\033[0m set default
|
|
}
|
|
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<paMaxY;i++){
|
|
for(int j=0;j<paMaxX;j++){
|
|
if(i==0||i==(paMaxY-1)){
|
|
SetCursorPosition(j,i);
|
|
printf("\033[45m \033[0m");
|
|
}
|
|
else if(j==0||j==(paMaxX-1)){
|
|
SetCursorPosition(j,i);
|
|
printf("\033[45m \033[0m");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int crashWall(int posX, int posY){
|
|
if(posX==(paMaxX-1)||posX==0){
|
|
return 1;
|
|
}
|
|
if(posY==(paMaxX-1)||posY==0){
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int eatFruit(int posX, int posY, int fruitX, int fruitY){
|
|
if(posX==fruitX&&posY==fruitY){
|
|
return 1;
|
|
}
|
|
else{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void game(){
|
|
|
|
clock_t start_t,this_t;
|
|
start_t=clock();
|
|
int posX[100],posY[100],fruitX,fruitY,snakeLength=2,ft=0;
|
|
int tempX[2],tempY[2];
|
|
double thistimeMillisec;
|
|
srand(time(NULL));
|
|
/*for(int j=0;j<20;j++){
|
|
star[0][j]=rand()%4+2;//2-5
|
|
}*/
|
|
|
|
char input,lastInput;
|
|
initscr();
|
|
cbreak();
|
|
noecho();
|
|
scrollok(stdscr, TRUE);
|
|
nodelay(stdscr, TRUE);
|
|
//sleep(1);//รอโปรแกรมเปิด
|
|
start_color();
|
|
init_pair(1,COLOR_WHITE, COLOR_BLACK);
|
|
wbkgd(stdscr, COLOR_PAIR(1));
|
|
printf("\e[?25l");//ปิดcursor
|
|
for(int i=0;i<100;i++){
|
|
posX[i]=-1;
|
|
posY[i]=-1;
|
|
}
|
|
posX[0]=95;
|
|
posY[0]=25;
|
|
posX[1]=95;
|
|
posY[1]=25;
|
|
srand(time(NULL));
|
|
fruitX=rand()%98+1;
|
|
fruitY=rand()%28+1;
|
|
while(1){ //เริ่มเกม
|
|
this_t=clock();
|
|
SetCursorPosition(posX[0],posY[0]);
|
|
if(ft<5){//สร้างงูรอบแรกสุด
|
|
drawSnake();
|
|
drawFrame();
|
|
ft++;
|
|
}
|
|
if(eatFruit(posX[0],posY[0],fruitX,fruitY)==1){
|
|
snakeLength++;
|
|
fruitX=rand()%98+1;
|
|
fruitY=rand()%28+1;
|
|
posX[snakeLength-1]=posX[0];
|
|
posY[snakeLength-1]=posY[0];
|
|
|
|
}
|
|
SetCursorPosition(0,0);
|
|
printf("\033[1;97\033[45mScore: %d\033[0m", snakeLength-2);
|
|
input=getch();//รับจากแป้นพิมพ์
|
|
if(input=='x'){
|
|
break;
|
|
}
|
|
if(input=='a'||input==leftArrow){
|
|
if((posX[0]>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*15;
|
|
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';
|
|
}
|
|
}
|
|
else 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_t=this_t;
|
|
}
|
|
SetCursorPosition(fruitX,fruitY);
|
|
printf("0");
|
|
//system("((speaker-test -t sine -f 700)& pid=$!; sleep 0.1s; kill -9 $pid) > /dev/null");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*int mainmenu(){
|
|
for(int i=0;i<paMaxY;i++){
|
|
for(int j=0;j<paMaxX;j++){
|
|
SetCursorPosition(j,i);
|
|
printf("\033[100m \033[0m");
|
|
}
|
|
}
|
|
|
|
}*/
|
|
int main () {
|
|
game();
|
|
return(0);
|
|
}
|