纯c语言版的贪吃蛇,linux终端运行

来源:互联网 发布:剑三大师脸型数据 编辑:程序博客网 时间:2024/05/22 17:28

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();
}









0 0
原创粉丝点击