贪吃蛇c加加代码_C语言/C加加编程学习之贪吃蛇小游戏源代码

这是一个使用C++编写的贪吃蛇小游戏源代码,包括移动、吃食物、边界判断等功能。通过控制台显示游戏画面,并实现了分数系统和游戏结束条件。玩家可以使用WASD键控制蛇的移动,ESC键退出游戏。
摘要由CSDN通过智能技术生成

[代码运行效果截图]

[c]代码库

#include

#include

#include

#include

#include

#include

#define N 21

//●★

intapple[3];

charscore[3];

chartail[3];

voidgotoxy(intx, inty)    //输出坐标

{

COORD pos;//WINDOWS API中定义的一个结构表示一个字符在控制台屏幕上的坐标

pos.X = x;

pos.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);

//使光标 到(x,y)这个位置的函数.

}

voidcolor(intb)         //颜色函数

{

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("你现在得分为: 0");

}

intFile_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;

return0;

}

intFile_out()    //存数据

{

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 结束

{

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);

}

感觉大家一直以来的支持,谢谢(#^.^#)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值