Linux-贪吃蛇

167 阅读1分钟

Linux下编写贪吃蛇代码

` #include<curses.h> #include<stdio.h> #include<pthread.h> #include<stdlib.h> #define UP 1 #define DOWN -1 #define LEFT 2 #define RIGHT -2

//定义贪吃蛇 struct Snake {

int hang;
int lie;
struct Snake *next;

};

struct Snake *head = NULL; struct Snake *tail = NULL; int key; int dir;

struct Snake food; void initFood() { int x = rand() % 20; int y = rand() % 20; food.hang = x; food.lie = y; x += 2; y += 2; } void initNcurse() {

initscr();
keypad(stdscr, 1);

}

int hasSnakeNode(int i, int j) { struct Snake *p; p = head; while (p != NULL){ if (p->hang == i && p->lie == j){ return 1; } p = p->next; } return 0; } int hasFood(int i, int j) { if (food.hang == i && food.lie == j){ return 1;

}
return 0;

} void gamePic(){ int hang; int lie;

move(0, 0);
for (hang = 0; hang<20; hang++){
	//di0hangdedaying
	if (hang == 0){
		for (lie = 0; lie<20; lie++){
			printw("--");
		}
		printw("\n");
	}
	//bianli lie
	if (hang >= 0 && hang <= 19){
		for (lie = 0; lie <= 20; lie++){
			if (lie == 0 || lie == 20){
				printw("|");
			}
			else if (hasSnakeNode(hang, lie)){
				printw("[]");
			}
			else if (hasFood(hang, lie)){
				printw("##");
			}
			else{
				printw("  ");
			}
		}
		printw("\n");
	}
	if (hang == 19){
		for (lie = 0; lie<20; lie++){
			printw("--");
		}
		printw("\n");
		printw("liu hai sheng food.hand = %d,food.lie = %d\n", food.hang, food.lie);
	}
}

}

void addNode() { struct Snake *new = (struct Snake *)malloc(sizeof(struct Snake)); new->next = NULL; switch (dir){ case UP: new->hang = tail->hang - 1; new->lie = tail->lie; break;

case DOWN:
	new->hang = tail->hang + 1;
	new->lie = tail->lie;
	break;

case LEFT:
	new->hang = tail->hang;
	new->lie = tail->lie - 1;
	break;

case RIGHT:
	new->hang = tail->hang;
	new->lie = tail->lie + 1;
	break;

}
tail->next = new;
tail = new;

} void initSnake(){ struct Snake *p; dir = RIGHT; while (head != NULL){ p = head; head = head->next; free(p); } initFood();

head = (struct Snake *)malloc(sizeof(struct Snake));
head->hang = 1;
head->lie = 1;
head->next = NULL;
tail = head;


addNode();
addNode();

}

void deleNode() {

struct Snake *p;
p = head;
head = head->next;
free(p);

} int ifSnakeDie() { struct Snake *p; p = head; if (tail->hang<0 || tail->lie == 0 || tail->hang == 20 || tail->lie == 20){ return 1; } while (p->next != NULL){ if (p->hang == tail->hang && p->lie == tail->lie){ return 1; } p = p->next; } return 0; } void moveSnake() {

addNode();
if (hasFood(tail->hang, tail->lie)){
	initFood();
}
else{
	deleNode();
}
if (ifSnakeDie()){
	initSnake();
}

}

void* refreshJieMian() {

while (1){

	moveSnake();
	gamePic();
	refresh();
	usleep(100000);
}

}

void turn(int direction) {

if (abs(dir) != abs(direction)){
	dir = direction;
}

}

void* changeDir() { while (1){

	key = getch();
	switch (key){
	case KEY_DOWN:
		turn(DOWN);
		break;
	case KEY_UP:
		turn(UP);
		break;
	case KEY_LEFT:
		turn(LEFT);
		break;
	case KEY_RIGHT:
		turn(RIGHT);
		break;
	}
}

} int main() { pthread_t th1; pthread_t th2; initNcurse(); initSnake(); gamePic();

pthread_create(&th1, NULL, refreshJieMian, NULL);
pthread_create(&th2, NULL, changeDir, NULL);
while (1);
getch();
endwin();
return 0;

} `