1.教程
百度云链接:
链接:https://pan.baidu.com/s/1x6WkRs9L5yuXH8fsz1iMmA
提取码:tp4x
2.代码(亲测DVC++可运行)
#include "stdio.h"
#include "time.h"
#include "windows.h"
#include "stdlib.h"
#include "conio.h"
#define U 1
#define D 2
#define L 3
#define R 4 //蛇的状态,U:上 ;D:下;L:左 R:右
void gotoxy(int x,int y);//设置光标位置
int color(int c); //更改文字颜色
void printfsnake(); //输出字符蛇画
void welcometogame(); //开始界面
void createMap(); //绘制地图
void scoreandtips(); //游戏界面右侧的得分和小提示
void initsnake(); //初始化蛇身,画蛇身
int createfood(); //创造食物
int biteself(); //判断是否咬到了自己
void cantcrosswall(); //蛇是否撞墙
void speedup(); //加速
void speeddown(); //减速
void snakemove(); //控制蛇前进的方向
void keyboardControl(); //控制键盘按键
void Lostdraw(); //游戏结束界面
void endgame(); //游戏结束
void choose(); //游戏失败后的选择
void File_out(); //在文件中读取最高分
void File_in(); //储存最高分进文件
void explation(); //游戏说明
typedef struct snake//结构体
{
int x,y;
struct snake *next;
}snake;
int score=0,add=10;
int HighScore=0;
int status,sleeptime=200;//蛇的状态,运行时间间隔
snake *head,*food,*q;
int endgamestatus=0;//结束时蛇的状态(1撞墙,2咬到自己,3按Ese)
HANDLE h0ut; //控制台句柄
//system("color xx")
int color(int c) //更改文字颜色
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
void gotoxy(int x,int y) //设置光标位置
{
COORD xy;
xy.X=x;
xy.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),xy);
}
void printfsnake() //画蛇
{
gotoxy(35,1);
color(6);
printf("/^\\/^\\"); //蛇眼睛
gotoxy(34,2);
printf("|__| O|"); //蛇眼睛
gotoxy(33,2);
color(2);
printf("_");
gotoxy(25,3);
color(12);
printf("\\/"); //蛇信
gotoxy(31,3);
color(2);
printf("/");
gotoxy(37,3);
color(6);
printf(" \\_/"); //蛇眼睛
gotoxy(41,3);
color(10);
printf(" \\");
gotoxy(26,4);
color(12);
printf("\\____"); //舌头
gotoxy(32,4);
printf("_________/");
gotoxy(31,4);
color(2);
printf("|");
gotoxy(43,4);
color(10);
printf("\\");
gotoxy(32,5);
color(2);
printf("\\_______"); //蛇嘴
gotoxy(44,5);
color(10);
printf("\\");
gotoxy(39,6);
printf("| | \\"); //下面都是画蛇身
gotoxy(38,7);
printf("/ / \\");
gotoxy(37,8);
printf("/ / \\ \\");
gotoxy(35,9);
printf("/ / \\ \\");
gotoxy(34,10);
printf("/ / \\ \\");
gotoxy(33,11);
printf("/ / _----_ \\ \\");
gotoxy(32,12);
printf("/ / _-~ ~-_ | |");
gotoxy(31,13);
printf("( ( _-~ _--_ ~-_ _/ |");
gotoxy(32,14);
printf("\\ ~-____-~ _-~ ~-_ ~-_-~ /");
gotoxy(33,15);
printf("~-_ _-~ ~-_ _-~");
gotoxy(35,16);
printf("~--______-~ ~-___-~");
}
void welcometogame() //开始界面
{
int n;
int i,j = 1;
gotoxy(43,18);
color(11);
printf("贪 吃 蛇 大 作 战");
color(14); //黄色边框
for (i = 20; i <= 26; i++) //输出上下边框┅
{
for (j = 27; j <= 74; j++) //输出左右边框┇
{
gotoxy(j, i);
if (i == 20 || i == 26)
{
printf("-");
}
else if (j == 27 || j == 74)
{
printf("|");
}
}
}
color(12);
gotoxy(35, 22);
printf("1.开始游戏");
gotoxy(55, 22);
printf("2.游戏说明");
gotoxy(35, 24);
printf("3.退出游戏");
gotoxy(29,27);
color(3);
printf("请选择[1 2 3]:[ ]\b\b"); //\b为退格,使得光标处于[]中间
color(14);
scanf("%d", &n); //输入选项
switch(n)
{
case(1):
system("cls");//清屏
createMap();
initsnake();
createfood();break;
case(2):explation();break; //游戏说明
case(3):exit(0);break;//退出游戏
default:
color(12);
gotoxy(40,28);
printf("请输入1~3之间的数!");
getch(); //输入任意键
system("cls");
printfsnake();
welcometogame();
keyboardControl();
endgame();
}
}
void createMap() //绘制地图
{
int i,j;
for(i=0;i<=26;i++)
{
for(j=0;j<58;j+=2)
{
if(j==0||i==0||j==56||i==26)
{
color(5);
gotoxy(j,i);
printf("□");
}
else
{
color(3);
printf("■");
}
}
}
}
void scoreandtips() //游戏界面右侧的得分和小提示
{ //该函数在键盘控制函数中调用
File_out();
color(11);
gotoxy(64,4);
printf("☆最高纪录☆:%d",HighScore);
color(14);
gotoxy(64,8);
printf("得分:%d",score);
color(13);
gotoxy(73,11);
printf("小 提 示");
color(6);
gotoxy(60,13);
printf("卍-----------------------卍");
gotoxy(60,25);
printf("卍-----------------------卍");
color(3);
gotoxy(64,14);
printf("每个食物得分:%d分",add);
gotoxy(64,16);
printf("不能穿墙,不能咬到自己");
gotoxy(64,18);
printf("用↑↓←→分别控制蛇的移动");
gotoxy(64,20);
printf("F1为加速,F2为减速");
gotoxy(64,22);
printf("space:暂停游戏");
gotoxy(64,24);
printf("Esc退出游戏") ;
}
void File_out() //在文件中读取最高分
{
FILE *fp;
fp=fopen("save.txt","a+");
fscanf(fp,"%d",&HighScore);
fclose(fp);
}
void File_in() //写入最高分
{
FILE *fp;
fp=fopen("save.txt","w+");
fprintf(fp,"%d",score);
}
void initsnake() //初始化蛇身
{ //该函数放入welcometogame()和choose()的case 1中
snake *tail;
int i;
tail=(snake*)malloc(sizeof(snake));
tail->x=24;
tail->y=5;
tail->next=NULL;
for(i=1;i<=4;i++)
{
head=(snake*)malloc(sizeof(snake));
head->next=tail;
head->x=24+2*i;
head->y=5;
tail=head;
}
while(tail)
{
gotoxy(tail->x,tail->y);
color(14);
printf("★");
tail=tail->next;
}
}
int createfood()//食物,不能出现在墙上和蛇身上,x坐标要为偶数
{
snake *food_1;
food_1=(snake*)malloc(sizeof(snake));
srand((unsigned)time(NULL));
while((food_1->x= (rand()%53+2) )%2 != 0); //选出2<=x<55中的偶数
food_1->y= (rand()%25+1);
q=head;
while(q)
{
if(q->x==food_1->x && q->y==food_1->y)
{
free(food_1);
createfood();
return 0;
}
q=q->next;
}
gotoxy(food_1->x,food_1->y);
color(12);
printf("●");
food=food_1;
}
int biteself() //判断是否咬到了自己
{
snake *self;
self=head->next;
while(self)
{
if(self->x==head->x && self->y==head->y)
{
endgamestatus=2;
return 1;
}
self=self->next;
}
return 0;
}
void cantcrosswall() //蛇是否撞墙
{
if(head->x==0||head->x==56||head->y==26||head->y==0)
endgamestatus=1;
}
void speedup() //加速
{
if(sleeptime>=50)
{
sleeptime=sleeptime-10;
add=add+2;
}
}
void speeddown() //减速
{
if(sleeptime<350)
{
sleeptime+=30;
add-=2;
if(sleeptime==350)
add=1;
}
}
void snakemove() //不按键时蛇前进的方向UDLR
{
snake *nexthead;
nexthead=(snake*)malloc(sizeof(snake));
if(status==U)
{
nexthead->x=head->x;
nexthead->y=(head->y)-1;
nexthead->next=head;
head=nexthead;
q=head;
if(nexthead->x==food->x && nexthead->y==food->y)
{
while(q)
{
gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next;
}
score+=add;
speedup();
createfood();
}
else
{
while(q->next->next)
{
gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next;
}
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");
free(q->next);
q->next=NULL;
}
}
if(status==D)
{
nexthead->x=head->x;
nexthead->y=(head->y)+1;
nexthead->next=head;
head=nexthead;
q=head;
if(nexthead->x==food->x && nexthead->y==food->y)
{
while(q)
{
gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next;
}
score+=add;
speedup();
createfood();
}
else
{
while(q->next->next)
{
gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next;
}
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");
free(q->next);
q->next=NULL;
}
}
if(status==L)
{
nexthead->x=(head->x)-2;
nexthead->y=(head->y);
nexthead->next=head;
head=nexthead;
q=head;
if(nexthead->x==food->x && nexthead->y==food->y)
{
while(q)
{
gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next;
}
score+=add;
speedup();
createfood();
}
else
{
while(q->next->next)
{
gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next;
}
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");
free(q->next);
q->next=NULL;
}
}
if(status==R)
{
nexthead->x=(head->x)+2;
nexthead->y=(head->y);
nexthead->next=head;
head=nexthead;
q=head;
if(nexthead->x==food->x && nexthead->y==food->y)
{
while(q)
{
gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next;
}
score+=add;
speedup();
createfood();
}
else
{
while(q->next->next) //跳出循环时,q指在链表的倒数第二个位置
{
gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next;
}
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");
free(q->next);
q->next=NULL;
}
}
cantcrosswall(); //判断蛇是否撞墙
biteself(); //是否咬到自己
}
void keyboardControl() //控制键盘按键
{
status=R;
while(1)
{
scoreandtips();
if(GetAsyncKeyState(VK_UP) && status!=D)
{
status=U;
}
else if(GetAsyncKeyState(VK_DOWN) && status!=U)
{
status=D;
}
else if(GetAsyncKeyState(VK_LEFT) && status!=R)
{
status=L;
}
else if(GetAsyncKeyState(VK_RIGHT) && status!=L)
{
status=R;
}
if(GetAsyncKeyState(VK_SPACE)) //空格暂停
{
while(1)
{
Sleep(300);
if(GetAsyncKeyState(VK_SPACE))
break;
}
}
else if(GetAsyncKeyState(VK_ESCAPE))
{
endgamestatus=3;
break;
}
else if(GetAsyncKeyState(VK_F1))
speedup();
else if(GetAsyncKeyState(VK_F2))
speeddown();
Sleep(sleeptime);
snakemove();
if(endgamestatus!=0)
{
break;
}
}
}
void explation()
{
int i,j;
system("cls");
color(13);
gotoxy(44,3);
printf("游戏说明");
color(2);
for (i = 6; i <= 22; i++) //输出上下边框===
{
for (j = 20; j <= 75; j++) //输出左右边框||
{
gotoxy(j, i);
if (i == 6 || i == 22) printf("=");
else if (j == 20 || j == 75) printf("||");
}
}
color(3);
gotoxy(30,8);
printf("tip1: 不能穿墙,不能咬到自己");
color(10);
gotoxy(30,11);
printf("tip2: 用↑.↓.←.→分别控制蛇的移动");
color(14);
gotoxy(30,14);
printf("tip3: F1 为加速,F2 为减速");
color(11);
gotoxy(30,17);
printf("tip4: 按空格键暂停游戏,再按空格键继续");
color(4);
gotoxy(30,20);
printf("tip5: ESC :退出游戏.space:暂停游戏");
getch(); //按任意键返回主界面
system("cls");
printfsnake();
welcometogame();
}
void endgame() //游戏结束 要更新最高分
{
system("cls");
if(endgamestatus==1)
{
Lostdraw();
gotoxy(35,9);
color(12);
printf("对不起,您撞到墙了。游戏结束!");
}
else if(endgamestatus==2)
{
Lostdraw();
gotoxy(35,9);
color(12);
printf("对不起,您咬到自己了。游戏结束!");
}
else if(endgamestatus==3)
{
Lostdraw();
gotoxy(40,9);
color(12);
printf("您已经结束了游戏。");
}
gotoxy(43,12);
color(13);
printf("您的得分是 %d",score);
if(score >= HighScore)
{
color(10);
gotoxy(33,16);
printf("创纪录啦!最高分被你刷新啦,真棒!!!");
File_in(); //把最高分写进文件
}
else
{
color(10);
gotoxy(33,16);
printf("继续努力吧~ 你离最高分还差:%d",HighScore-score);
}
choose();
}
void choose()
{
int n;
gotoxy(25,23);
color(12);
printf("我要重新玩一局-------1");
gotoxy(52,23);
printf("不玩了,退出吧-------2");
gotoxy(46,25);
color(11);
printf("选择:");
scanf("%d", &n);
switch(n)
{
case 1:
system("cls"); //数据重置
add=10;
sleeptime=200;
score=0;
endgamestatus=0;
createMap();
initsnake();
createfood();
keyboardControl();
endgame();
break;
case 2:
exit(0);
break;
default:
gotoxy(35,27);
color(12);
printf("※※您的输入有误,请重新输入※※");
system("pause >nul");
endgame();
break;
}
}
void Lostdraw()
{
system("cls");
int i;
gotoxy(45,2);
color(6);
printf("\\\\\\|///");
gotoxy(43,3);
printf("\\\\");
gotoxy(47,3);
color(15);
printf(".-.-");
gotoxy(54,3);
color(6);
printf("//");
gotoxy(44,4);
color(14);
printf("(");
gotoxy(47,4);
color(15);
printf(".@.@");
gotoxy(54,4);
color(14);
printf(")");
gotoxy(17,5);
color(11);
printf("+------------------------");
gotoxy(35,5);
color(14);
printf("oOOo");
gotoxy(39,5);
color(11);
printf("----------");
gotoxy(48,5);
color(14);
printf("(_)");
gotoxy(51,5);
color(11);
printf("----------");
gotoxy(61,5);
color(14);
printf("oOOo");
gotoxy(65,5);
color(11);
printf("-----------------+");
for(i = 6;i<=19;i++) //竖边框
{
gotoxy(17,i);
printf("|");
gotoxy(82,i);
printf("|");
}
gotoxy(17,20);
printf("+---------------------------------");
gotoxy(52,20);
color(14);
printf("☆☆☆〃");
gotoxy(60,20);
color(11);
printf("----------------------+");
}
int main()
{
system("mode con cols=100 lines=30");
printfsnake();
welcometogame();
keyboardControl();
endgame();
return 0;
}