266 lines
6.2 KiB
C
266 lines
6.2 KiB
C
|
//
|
||
|
// main.c
|
||
|
// HT
|
||
|
//
|
||
|
// Created by Eric on 15-12-18.
|
||
|
// Copyright (c) 2015年 Bakantu Eric. All rights reserved.
|
||
|
//
|
||
|
|
||
|
/*include*/
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <unistd.h>
|
||
|
#include <time.h>
|
||
|
#include "Keyboard.h"
|
||
|
/*define*/
|
||
|
|
||
|
//basic define
|
||
|
#define YMAX 16
|
||
|
#define XMAX 35
|
||
|
#define SNACK_MAX 1200
|
||
|
#define SLEEPTIME 500000
|
||
|
#define INITSNACK 3
|
||
|
|
||
|
#define NONE 0
|
||
|
#define WALL 1
|
||
|
#define SNACK 2
|
||
|
#define FOOD 3
|
||
|
|
||
|
#define UP 0
|
||
|
#define DOWN 1
|
||
|
#define LEFT 2
|
||
|
#define RIGHT 3
|
||
|
|
||
|
/*function*/
|
||
|
void init(void);
|
||
|
void game_engine(void);
|
||
|
void print_table(void);
|
||
|
void snack_food(void);
|
||
|
void snack_move(void);
|
||
|
void ifinput(void);
|
||
|
void if_eat(void);
|
||
|
int if_lose(void);
|
||
|
int if_win(void);
|
||
|
int safe_snack(int x, int y);
|
||
|
|
||
|
/*resource*/
|
||
|
int table[XMAX][YMAX];
|
||
|
struct p_snack{
|
||
|
int x;
|
||
|
int y;
|
||
|
int dir;
|
||
|
};
|
||
|
struct s_food{
|
||
|
int x;
|
||
|
int y;
|
||
|
};
|
||
|
struct p_snack snacks[SNACK_MAX];
|
||
|
struct s_food s_foods;
|
||
|
int n_snacks = 0;
|
||
|
int w_ifnot = 1;
|
||
|
int food = 0;
|
||
|
char user_control = '\0';
|
||
|
int score = 0;
|
||
|
int s_add = 0;
|
||
|
|
||
|
|
||
|
/*detail_function*/
|
||
|
int main(void){
|
||
|
init();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void init(void){
|
||
|
int x = 0,y = 0,i = 0;;
|
||
|
/*init table*/
|
||
|
for (x = 0; x < XMAX; x++)
|
||
|
for (y = 0; y < YMAX; y++){
|
||
|
table[x][y] = NONE;
|
||
|
}
|
||
|
/*print wall*/
|
||
|
for (x = 0; x < XMAX; x++) {
|
||
|
table[x][0] = WALL;
|
||
|
table[x][YMAX-1] = WALL;
|
||
|
}
|
||
|
for (y = 0; y < YMAX; y++){
|
||
|
table[0][y] = WALL;
|
||
|
table[XMAX-1][y] = WALL;
|
||
|
}
|
||
|
/*init snack*/
|
||
|
n_snacks = INITSNACK;
|
||
|
srand((unsigned int)time(0));
|
||
|
snacks[0].x = (rand()%(XMAX-10))+5;
|
||
|
snacks[0].y = (rand()%(YMAX-10))+5;
|
||
|
snacks[0].dir = rand()%4;
|
||
|
for (i = 1; i <= n_snacks; i++){
|
||
|
if (snacks[0].dir == UP){
|
||
|
snacks[i].x = snacks[0].x;
|
||
|
snacks[i].y = snacks[0].y+i;
|
||
|
}
|
||
|
else if (snacks[0].dir == DOWN){
|
||
|
snacks[i].x = snacks[0].x;
|
||
|
snacks[i].y = snacks[0].y-i;
|
||
|
}
|
||
|
else if (snacks[0].dir == LEFT){
|
||
|
snacks[i].x = snacks[0].x+i;
|
||
|
snacks[i].y = snacks[0].y;
|
||
|
}
|
||
|
else{
|
||
|
snacks[i].x = snacks[0].x-i;
|
||
|
snacks[i].y = snacks[0].y;
|
||
|
}
|
||
|
}
|
||
|
system("clear");
|
||
|
game_engine();
|
||
|
|
||
|
}
|
||
|
|
||
|
void game_engine(void){
|
||
|
while (w_ifnot){
|
||
|
snack_food();
|
||
|
ifinput();
|
||
|
switch (user_control) {
|
||
|
case 'w':
|
||
|
if (safe_snack(snacks[0].x, snacks[0].y-1))
|
||
|
snacks[0].dir = UP;
|
||
|
user_control = '\0';
|
||
|
break;
|
||
|
case 's':
|
||
|
if (safe_snack(snacks[0].x, snacks[0].y+1))
|
||
|
snacks[0].dir = DOWN;
|
||
|
user_control = '\0';
|
||
|
break;
|
||
|
case 'a':
|
||
|
if (safe_snack(snacks[0].x-1, snacks[0].y))
|
||
|
snacks[0].dir = LEFT;
|
||
|
user_control = '\0';
|
||
|
break;
|
||
|
case 'd':
|
||
|
if (safe_snack(snacks[0].x+1, snacks[0].y))
|
||
|
snacks[0].dir = RIGHT;
|
||
|
user_control = '\0';
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
snack_move();
|
||
|
if_eat();
|
||
|
/*refresh_print*/
|
||
|
print_table();
|
||
|
usleep(SLEEPTIME);
|
||
|
/*win or lose*/
|
||
|
if (if_lose()){
|
||
|
printf("YOU LOSE!");
|
||
|
w_ifnot = 0;
|
||
|
}
|
||
|
if (if_win()){
|
||
|
printf("YOU WIN!");
|
||
|
w_ifnot = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void print_table(void){
|
||
|
system("clear");
|
||
|
int x = 0,y = 0,i = 0,s_ifnot = 0;
|
||
|
for (y = 0; y < YMAX; y++){
|
||
|
for (x = 0; x < XMAX; x++){
|
||
|
/*print snack*/
|
||
|
s_ifnot = 0;
|
||
|
for (i = 0; i < n_snacks; i++)
|
||
|
if ((snacks[i].x == x)&&(snacks[i].y == y)){
|
||
|
printf("●");
|
||
|
s_ifnot = 1;
|
||
|
break;
|
||
|
}
|
||
|
if (s_ifnot) continue;
|
||
|
if (table[x][y] == NONE) printf(" ");
|
||
|
else if (table[x][y] == WALL) printf("*");
|
||
|
else if (table[x][y] == FOOD) printf("◆");
|
||
|
else{
|
||
|
}
|
||
|
}
|
||
|
printf("\n");
|
||
|
}
|
||
|
//printf("SNACK[0].dir = %d \n",snacks[0].dir);
|
||
|
//printf("SNACK[0] = (%d,%d) \n",snacks[0].x,snacks[0].y);
|
||
|
//printf("FOOD = (%d,%d) \n",s_foods.x,s_foods.y);
|
||
|
printf("SCORE %d\n",score);
|
||
|
}
|
||
|
|
||
|
void snack_food(void){
|
||
|
if (food == 0){
|
||
|
s_foods.x = rand()%(XMAX-3)+1;
|
||
|
s_foods.y = rand()%(YMAX-3)+1;
|
||
|
table[s_foods.x][s_foods.y] = FOOD;
|
||
|
food = 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void snack_move(void){
|
||
|
int i = 0;
|
||
|
if (s_add){
|
||
|
snacks[n_snacks].x = snacks[n_snacks-1].x;
|
||
|
snacks[n_snacks].y = snacks[n_snacks-1].y;
|
||
|
snacks[n_snacks].dir = snacks[n_snacks-1].dir;
|
||
|
|
||
|
}
|
||
|
for (i = n_snacks-1; i > 0; i--){
|
||
|
snacks[i].x= snacks[i-1].x;
|
||
|
snacks[i].y= snacks[i-1].y;
|
||
|
snacks[i].dir= snacks[i-1].dir;
|
||
|
}
|
||
|
if (s_add){
|
||
|
n_snacks += 1;
|
||
|
s_add = 0;
|
||
|
}
|
||
|
|
||
|
if ((snacks[0].dir == UP)&&(snacks[0].y > 1)) snacks[0].y -= 1;
|
||
|
else if((snacks[0].dir == UP)&&(snacks[0].y <= 1)) snacks[0].y = YMAX-2;
|
||
|
|
||
|
if ((snacks[0].dir == DOWN)&&(snacks[0].y < (YMAX-2))) snacks[0].y +=1;
|
||
|
else if((snacks[0].dir == DOWN)&&(snacks[0].y >= (YMAX-2))) snacks[0].y = 1;
|
||
|
|
||
|
if ((snacks[0].dir == LEFT)&&(snacks[0].x > 1)) snacks[0].x -= 1;
|
||
|
else if((snacks[0].dir == LEFT)&&(snacks[0].x <= 1)) snacks[0].x = XMAX-2;
|
||
|
|
||
|
if ((snacks[0].dir == RIGHT)&&(snacks[0].x < (XMAX-2))) snacks[0].x += 1;
|
||
|
else if((snacks[0].dir == RIGHT)&&(snacks[0].x >= (XMAX-2))) snacks[0].x = 1;
|
||
|
|
||
|
}
|
||
|
|
||
|
void ifinput(void){
|
||
|
if ( kbhit() ) user_control = readch();
|
||
|
}
|
||
|
|
||
|
int safe_snack(int x, int y){
|
||
|
int i = 0;
|
||
|
for (i = 0; i < n_snacks; i++){
|
||
|
if ((snacks[i].x == x)&&(snacks[i].y == y)) return 0;
|
||
|
}
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
void if_eat(void){
|
||
|
if ((snacks[0].x == s_foods.x)&&(snacks[0].y == s_foods.y)){
|
||
|
food = 0;
|
||
|
table[s_foods.x][s_foods.y] = NONE;
|
||
|
score += 100;
|
||
|
s_add = 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int if_lose(void){
|
||
|
int i = 0;
|
||
|
for (i = 1; i < n_snacks; i++)
|
||
|
if ((snacks[0].x == snacks[i].x)&&(snacks[0].y == snacks[i].y)) return 1;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int if_win(void){
|
||
|
if (n_snacks == SNACK_MAX) return 1;
|
||
|
return 0;
|
||
|
}
|
||
|
/*END*/
|