play.h:
#ifndef PLAY_H__
#define PLAY_H__
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
#define MAP_ROW 30
#define MAP_COL 50
#define SNAKE_TOU '#'
#define SNAKE_SHEN '+'
#define SNAKE_WEI ' '
#define SNAKE_FOOD '@'
typedef enum direction{
UP = 1, DOWN, LEFT, RIGHT
}Direction;
typedef struct Snake{
int row;
int col;
}Snake;
void show();
void init_map();
void move();
void food();
void* turn(void*);
#endif
play.c:
#include "play.h"
Snake snake_head;
Snake snake[100];
Snake snake_food;
char map[MAP_ROW][MAP_COL];
Direction snake_dir;
int snake_length = 0;
pthread_mutex_t snake_dir_mutex = PTHREAD_MUTEX_INITIALIZER;
void init_map(){
int row, col;
for(row = 0;row < MAP_ROW;row++){
for(col = 0;col < MAP_COL;col++){
if(0 == row || 0 == col || MAP_COL-1 == col || MAP_ROW-1 == row){
map[row][col] = '#';
}
else{
map[row][col] = ' ';
}
}
}
map[snake_food.row][snake_food.col] = SNAKE_FOOD;
int loop;
for(loop = 0;loop < snake_length;loop++){
if(loop == 0){
map[snake[loop].row][snake[loop].col] = SNAKE_TOU;
}
else{
map[snake[loop].row][snake[loop].col] = SNAKE_SHEN;
}
}
}
void init(){
srand(time(NULL));
Snake *head = (Snake *)malloc(sizeof(Snake));
snake[snake_length].row = rand() % (MAP_ROW - 2) + 1;
snake[snake_length].col = rand() % (MAP_COL - 2) + 1;
snake_head = snake[snake_length];
snake_length++;
snake_dir = rand() % 4 + 1;
food();
while(1){
system("clear");
init_map();
show();
usleep(400000);
move();
}
}
void show(){
int row, col;
for(row = 0;row < MAP_ROW;row++){
for(col = 0;col < MAP_COL;col++){
printf("%2c", map[row][col]);
}
printf("\n");
}
printf("当前移动方向:");
switch(snake_dir){
case UP:
printf("上\n");
break;
case DOWN:
printf("下\n");
break;
case LEFT:
printf("左\n");
break;
case RIGHT:
printf("右\n");
break;
}
printf("请输入移动方向(w.上 s.下 a.左 d.右):\n");
}
void move(){
Snake snake_move;
snake_move = snake_head;
switch(snake_dir){
case UP:
snake_move.row--;
break;
case DOWN:
snake_move.row++;
break;
case LEFT:
snake_move.col--;
break;
case RIGHT:
snake_move.col++;
break;
}
int loop;
if(snake_move.row < 0 || snake_move.col < 0 || snake_move.row > MAP_ROW - 1 || snake_move.col > MAP_COL - 1){
system("clear");
show();
pthread_mutex_destroy(&snake_dir_mutex);
printf("GAME OVER!\n");
exit(0);
}
for(loop = 0;loop < snake_length - 1;loop++){
if(snake_move.row == snake[loop].row && snake_move.col == snake[loop].col){
system("clear");
show();
pthread_mutex_destroy(&snake_dir_mutex);
printf("GAME OVER!\n");
exit(0);
}
}
if(snake_move.row == snake_food.row && snake_move.col == snake_food.col)
{
snake_length++;
food();
}
for(loop = snake_length - 1;loop > 0;loop--){
snake[loop] = snake[loop - 1];
}
snake[0] = snake_move;
snake_head = snake_move;
}
void* turn(void* p){
char c_dir;
while(1){
scanf("%c", &c_dir);
getchar();
pthread_mutex_lock(&snake_dir_mutex);
if('a' <= c_dir && c_dir <= 'z'){
c_dir = c_dir - 'a' + 'A';
}
switch(c_dir){
case 'W':
if(snake_dir == DOWN){
break;
}
snake_dir = UP;
break;
case 'S':
if(snake_dir == UP){
break;
}
snake_dir = DOWN;
break;
case 'A':
if(snake_dir == RIGHT){
break;
}
snake_dir = LEFT;
break;
case 'D':
if(snake_dir == LEFT){
break;
}
snake_dir = RIGHT;
break;
}
pthread_mutex_unlock(&snake_dir_mutex);
}
}
void food(){
int flag = 1;
while(flag){
flag = 0;
snake_food.row = rand() % (MAP_ROW - 2) + 1;
snake_food.col = rand() % (MAP_COL - 2) + 1;
int loop;
for(loop = 0;loop < snake_length - 1;loop++){
if(snake_food.row == snake[loop].row && snake_food.col == snake[loop].col){
flag = 1;
}
}
}
}
int main(){
pthread_t id;
pthread_create(&id, NULL, turn, NULL);
init();
}