/*****************************************************************************
** File Name: snake
** Author: MaosiDiaoxian
** Date: 2010/0802
** Copyright: *
** Description: snake game
******************************************************************************
** Important Edit History *
** --------------------------------------------------------------------------*
** DATE NAME DESCRIPTION *
** 2010/08/02 MaosiDiaoxian Create *
******************************************************************************/
/**--------------------------------------------------------------------------*
** Include Files *
**--------------------------------------------------------------------------*/
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <assert.h>
#include "pcc32.h"
/**--------------------------------------------------------------------------*
** MACRO DEFINITION *
**--------------------------------------------------------------------------*/
#define uint8 unsigned char
#define uint16 unsigned int
#define SNAKE_MIN_LEN 5
#define SNAKE_MAX_LEN 600
#define WIDTH 32
#define HEIGHT 24
#define S_TIME 350
#define ESC 0x001B
#define UP 0xE048
#define DOWN 0xE050
#define LEFT 0xE04B
#define RIGHT 0xE04D
#define ENTER 0x000D
#define QUIT 0
#define FALSE 0
#define TRUE 1
#define OVER 2
#define CALTIME(x) (S_TIME-(x)*22)
/**--------------------------------------------------------------------------*
** TYPE AND STRUCT *
**--------------------------------------------------------------------------*/
enum SNAKE_DIR{
U,
D,
L,
R
};//snake direction
struct COORDINATE{
uint8 x;
uint8 y;
};
struct SNAKE{
uint8 length;
struct COORDINATE body[SNAKE_MAX_LEN];
enum SNAKE_DIR direction;
};
/**--------------------------------------------------------------------------*
** EXTERNAL DECLARE *
**--------------------------------------------------------------------------*/
/**--------------------------------------------------------------------------*
** STATIC DEFINITION *
**--------------------------------------------------------------------------*/
/**--------------------------------------------------------------------------*
** GLOBAL DEFINITION *
**--------------------------------------------------------------------------*/
struct COORDINATE food;
/*---------------------------------------------------------------------------*/
/* LOCAL FUNCTION DECLARE */
/*---------------------------------------------------------------------------*/
uint8 Menu();//display menu
uint8 SetDifficulty(uint8 *diff);//set difficulty
void DrawWall();
void DrawSnake(struct SNAKE *snake);
void DrawFood();
uint8 ShowOver(uint16 *score);
void ShowPause ();//show pause interface
void InitSnake(struct SNAKE *snake);//init snake's length
uint8 InitFood (struct SNAKE *snake);
uint8 InSnake (struct SNAKE *snake, uint8 x, uint8 y);
uint8 MoveSnake (struct SNAKE *snake);
uint8 IsOver(struct SNAKE *snake, uint8 x, uint8 y);
/**--------------------------------------------------------------------------*
** FUNCTION DEFINITION *
**--------------------------------------------------------------------------*/
/**--------------------------------------------------------------------------*
Name: Menu
Discribe: menu interface
Return: diff , QUIT
**--------------------------------------------------------------------------*/
uint8 Menu()//这里是菜单选择的界面
{
uint8 choose = 1, ischoose = 1;
uint8 diff = 1,i;
//display menu interface
system("cls");//clear screen首先清屏
printf("************************************************\n");
printf(" Start game.\n");
printf(" Choose Difficulty.\n");
printf(" Quit.\n");
printf(" \n Warning:Please select English input method.");
printf("\n\n");
printf(" Welcome to join QQ group:31066229\n");
printf("************************************************\n");
do
{
for(i=1;i<=3;i++)
{
gotoTextPos(2,i);//光标移到(2,i)处
if(i==choose)
printf("%c",16);//这里显示的是选择的三角
else
printf(" ");
}
//get keydown
switch(jkGetKey())//获取键盘按键,方向键只能通过扫描码获取
{
case UP:
if (choose>1)
choose --;
break;
case DOWN:
if (choose<3)
choose ++;
break;
case ENTER:
ischoose = 0;
break;
default:;
}
}while (ischoose);
switch (choose)
{
case 2:
SetDifficulty(&diff);//选择难度的界面
case 1:
return diff;
case 3:
return QUIT;
}
}
/**--------------------------------------------------------------------------*
Name: SetDifficulty
Discribe: choose difficulty interface
Return: 0
**--------------------------------------------------------------------------*/
uint8 SetDifficulty(uint8 *diff)//显示选择难度的界面
{
assert (NULL != diff);
system("cls");//to show set difficulty level interface
gotoTextPos(0,HEIGHT/2-4);
printf(" %c\n\n",30);//显示正三角
printf(" %c\n",31);//显示倒三角
printf("\nPlease press UP or DOWN to choose difficulty level.");
while (1)
{
gotoTextPos(0,HEIGHT/2-3);
printf("Difficulty level: %d",*diff);
switch(jkGetKey())//获取按键信息并选择难度
{
case UP:
if (*diff > 1)
(*diff) --;
break;
case DOWN:
if (*diff < 9)
(*diff) ++;
break;
case ENTER:
return 0;
default:;
}
}
}
/**--------------------------------------------------------------------------*
Name: InitSnake
Discribe: Initialize length, coordinate and direction;
Return:
**--------------------------------------------------------------------------*/
void InitSnake(struct SNAKE *snake)//初始化蛇的位置长度方向
{
uint8 i = 0;
assert (NULL!=snake);
snake->length = SNAKE_MIN_LEN;//初始化长度
snake->direction = R;//初始化方向
for (;i<SNAKE_MIN_LEN;i++)//初始化蛇身的坐标
{
snake->body[i].x=SNAKE_MIN_LEN-i;
snake->body[i].y=5;
}
}
/**--------------------------------------------------------------------------*
Name:
Discribe: if in the snake
Return: TRUE,FALSE
**--------------------------------------------------------------------------*/
uint8 InSnake(struct SNAKE *snake, uint8 x, uint8 y)//判断某一点是否在蛇身内
{
uint8 i;
for(i=0;i<snake->length;i++)
{//如果某一点与蛇身某一部分相同,即返回1
if((x==snake->body[i].x) && (y==snake->body[i].y))
return 1;
}
return 0;
}
/**--------------------------------------------------------------------------*
Name: DrawFood
Discribe:
Return:
**--------------------------------------------------------------------------*/
uint8 InitFood (struct SNAKE *snake)//初始化食物
{
uint8 i;
srand((unsigned)time(NULL));//初始化随机因子
do
{ //生成随机数,如果食物与蛇身重叠,就重新生成
food.x = rand()%(WIDTH-2)+1;
food.y = rand()%(HEIGHT-4)+1;
}while(InSnake(snake,food.x,food.y));
return 0;//初始化成功后返回
}
/**--------------------------------------------------------------------------*
Name: Display
Discribe:
Return:
**--------------------------------------------------------------------------*/
void ShowPause()//显示暂停的界面
{
int key;
system("cls");
setTextColor(RED_ORANGE);
gotoTextPo