[代碼運行效果截圖]
[c]代碼庫
#include
#include
#include
#include
#include
#include
#define N 21
//●★
intapple[3];
charscore[3];
chartail[3];
voidgotoxy(intx,?inty)????//輸出坐標
{
????????COORD pos;//WINDOWS API中定義的一個結(jié)構(gòu)表示一個字符在控制臺屏幕上的坐標
????????pos.X = x;
????????pos.Y = y;
????????SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
????????//使光標 到(x沙绝,y)這個位置的函數(shù).
}
voidcolor(intb)?????????//顏色函數(shù)
{
????HANDLEhConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;//用來修改命令行窗口的顏色
????SetConsoleTextAttribute(hConsole,b) ;
}
intBlock(charhead[2])???//判斷出界
{
????????if((head[0] < 1) || (head[0] > N) || (head[1] < 1) || (head[1] > N))
????????????return1;
????????return0;
}
intEat(charsnake[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);
????????????????return1;
???????????}
????????return0;
}
voidDraw(char**snake,?intlen)????//蛇移動
{
????????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,?chardirx,?int*len)???//控制方向
{
????????inti, 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;
????????????????returnsnake;
}
voidinit(charplate[N+2][N+2],?char***snake_x,?int*len)??//初始化
{
????????inti, 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])
????????????????????????????????{
?????????????????????????????case0:
?????????????????????????????????color(12);printf("□");color(11);?continue;
????????????????????????case1:?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;
}
voidManual()
{
????????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("你現(xiàn)在得分為: 0");????????
}
intFile_in()?????//取記錄的分數(shù)
{
???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;
???return0;
}
intFile_out()????//存數(shù)據(jù)
{
????????FILE*fp;
????????if(score[1] > score[0])
????????{gotoxy(10,10);
????????color(12);
????????puts("Demi 加油哦");
????????gotoxy(0,N+2);
????????return0;
????????}
????????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);
????????return0;
}
voidFree(char**snake,?intlen)????//釋放空間
{
????????inti;
????????for(i = 0; i < len; ++i)
????????????????free(snake[i]);
????????free(snake);
}
intmain(void)
{
????????intlen;
????????charch =?'g';
????????chara[N+2][N+2] = {{0}};
????????char**snake;
????????srand((unsigned)time(NULL));
????????color(11);
????????File_in();
????????init(a, &snake, &len);
????????Manual();
????????while(ch != 0x1B)???// 按 ESC 結(jié)束
?????????{
????????????????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);
}
感覺大家一直以來的支持,謝謝(#^.^#)