#include <windows.h> |
#include <stdlib.h> |
#include <time.h> |
#include <stdio.h> |
#include <string.h> |
#include <conio.h> |
#define N 21 |
//●★ |
int apple[3]; |
char score[3]; |
char tail[3]; |
void gotoxy( int x, int y) //输出坐标 |
{ |
COORD pos; //WINDOWS API中定义的一个结构表示一个字符在控制台屏幕上的坐标 |
pos.X = x; |
pos.Y = y; |
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); |
//使光标 到(x,y)这个位置的函数. |
} |
void color( int b) //颜色函数 |
{ |
HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ; //用来修改命令行窗口的颜色 |
SetConsoleTextAttribute(hConsole,b) ; |
} |
int Block( char head[2]) //判断出界 |
{ |
if ((head[0] < 1) || (head[0] > N) || (head[1] < 1) || (head[1] > N)) |
return 1; |
return 0; |
} |
int Eat( char snake[2]) //吃了苹果 |
{ |
if ((snake[0] == apple[0]) && (snake[1] == apple[1])) |
{ |
apple[0] = apple[1] = apple[2] = 0; |
gotoxy(N+44,10); |
color(13); |
printf ( "%d" ,score[0]*10); |
color(11); |
return 1; |
} |
return 0; |
} |
void Draw( char **snake, int len) //蛇移动 |
{ |
if (apple[2]) |
{ |
gotoxy(apple[1] * 2, apple[0]); |
color(12); |
printf ( "●" ); |
color(18); //轨迹颜色 |
} |
gotoxy(tail[1] * 2, tail[0]); |
if (tail[2]) |
{ |
color(14); |
printf ( "★" ); |
color(11); |
} |
else |
printf ( "■" ); |
gotoxy(snake[0][1] * 2, snake[0][0]); |
color(14); |
printf ( "★" ); |
color(11); |
putchar ( '\n' ); |
} |
char ** Move( char **snake, char dirx, int *len) //控制方向 |
{ |
int i, full = Eat(snake[0]); |
memcpy (tail, snake[(*len)-1], 2); |
for (i = (*len) - 1; i > 0; --i) |
memcpy (snake[i], snake[i-1], 2); |
switch (dirx) |
{ |
case 'w' : case 'W' : --snake[0][0]; break ; |
case 's' : case 'S' : ++snake[0][0]; break ; |
case 'a' : case 'A' : --snake[0][1]; break ; |
case 'd' : case 'D' : ++snake[0][1]; break ; |
default : ; |
} |
if (full) |
{ |
snake = ( char **) realloc (snake, sizeof ( char *) * ((*len) + 1)); |
snake[(*len)] = ( char *) malloc ( sizeof ( char ) * 2); |
memcpy (snake[(*len)], tail, 2); |
++(*len); |
++score[0]; |
if (score[3] < 16) |
++score[3]; |
tail[2] = 1; |
} |
else |
tail[2] = 0; |
return snake; |
} |
void init( char plate[N+2][N+2], char ***snake_x, int *len) //初始化 |
{ |
int i, j; |
char **snake = NULL; |
*len = 3; |
score[0] = score[3] =3; |
snake = ( char **) realloc (snake, sizeof ( char *) * (*len)); |
for (i = 0; i < *len; ++i) |
snake[i] = ( char *) malloc ( sizeof ( char ) * 2); |
|
for (i = 0; i < 3; ++i) |
{ |
snake[i][0] = N/2 + 1; |
snake[i][1] = N/2 + 1 + i; |
} |
|
for (i = 1; i <= N; ++i) |
for (j = 1; j <= N; ++j) |
plate[i][j] = 1; |
|
apple[0] = rand ()%N + 1; apple[1] = rand ()%N + 1; |
apple[2] = 1; |
for (i = 0; i < N + 2; ++i) |
{ |
gotoxy(0, i); |
for (j = 0; j < N + 2; ++j) |
{ |
switch (plate[i][j]) |
{ |
case 0: |
color(12); printf ( "□" );color(11); continue ; |
case 1: printf ( "■" ); continue ; |
default : ; |
} |
} |
putchar ( '\n' ); |
} |
for (i = 0; i < (*len); ++i) |
{ |
gotoxy(snake[i][1] * 2, snake[i][0]); |
printf ( "★" ); |
} |
putchar ( '\n' ); |
*snake_x = snake; |
} |
void Manual() |
{ |
gotoxy(N+30,2); |
color(10); |
printf ( "按 W S A D 移动方向" ); |
gotoxy(N+30,4); |
printf ( "按 space 键暂停" ); |
gotoxy(N+30,8); |
color(11); |
printf ( "历史最高分为: " ); |
color(12); |
gotoxy(N+44,8); |
printf ( "%d" ,score[1]*10); |
color(11); |
gotoxy(N+30,12); |
printf ( "你现在得分为: 0" ); |
} |
int File_in() //取记录的分数 |
{ |
FILE *fp; |
if ((fp = fopen ( "C:\\tcs.txt" , "a+" )) == NULL) |
{ |
gotoxy(N+18, N+2); |
printf ( "文件不能打开\n" ); |
exit (0); |
} |
if ((score[1] = fgetc (fp)) != EOF); |
else |
score[1] = 0; |
return 0; |
} |
int File_out() //存数据 |
{ |
|
FILE *fp; |
if (score[1] > score[0]) |
{gotoxy(10,10); |
color(12); |
puts ( "Demi 加油哦" ); |
gotoxy(0,N+2); |
return 0; |
} |
if ((fp = fopen ( "C:\\tcs.txt" , "w+" )) == NULL) |
{ |
printf ( "文件不能打开\n" ); |
exit (0); |
} |
if ( fputc (--score[0],fp)==EOF) |
printf ( "输出失败\n" ); |
gotoxy(10,10); |
color(12); |
puts ( "恭喜Demi打破记录" ); |
gotoxy(0,N+2); |
return 0; |
} |
void Free( char **snake, int len) //释放空间 |
{ |
int i; |
for (i = 0; i < len; ++i) |
free (snake[i]); |
free (snake); |
} |
int main( void ) |
{ |
int len; |
char ch = 'g' ; |
char a[N+2][N+2] = {{0}}; |
char **snake; |
srand ((unsigned) time (NULL)); |
color(11); |
File_in(); |
init(a, &snake, &len); |
Manual(); |
while (ch != 0x1B) // 按 ESC 结束 |
{ |
Draw(snake, len); |
if (!apple[2]) { |
apple[0] = rand ()%N + 1; |
apple[1] = rand ()%N + 1; |
apple[2] = 1; |
} |
Sleep(200-score[3]*10); |
setbuf (stdin, NULL); |
if (kbhit()) |
{ |
gotoxy(0, N+2); |
ch = getche(); |
} |
snake = Move(snake, ch, &len); |
if (Block(snake[0])==1) |
{ |
gotoxy(N+2, N+2); |
puts ( "你输了" ); |
File_out(); |
Free(snake, len); |
getche(); |
exit (0); |
} |
} |
Free(snake, len); |
exit (0); |
} |