From 08ae8178cfe8a18c35a70545a8daf8da22ed32a7 Mon Sep 17 00:00:00 2001 From: Saturneric Date: Tue, 1 Sep 2020 00:07:49 +0800 Subject: [PATCH] Create main.c --- main.c | 265 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 main.c diff --git a/main.c b/main.c new file mode 100644 index 0000000..190839b --- /dev/null +++ b/main.c @@ -0,0 +1,265 @@ +// +// main.c +// HT +// +// Created by Eric on 15-12-18. +// Copyright (c) 2015年 Bakantu Eric. All rights reserved. +// + +/*include*/ +#include +#include +#include +#include +#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*/