贪吃蛇代码–c语言版 visual c++6.0打开

贪吃蛇代码–c语言版 visual c++6.0打开#include”stdafx.h”#include<stdio.h>#include<time.h>#include<windows.h>#include<stdlib.h>#include<conio.h>#defineU1#defineD2#defineL3#defineR4//蛇的状态U:上D:下L:左R:右typedefstructsnak

大家好,又见面了,我是你们的朋友全栈君。

#include"stdafx.h"
#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:右 
typedef struct snake               //蛇身的一个节点 
{ 

int x;                        //节点的x坐标 
int y;                        //节点的y坐标
struct snake *next;           //蛇身的下一个节点 
}snake;
int score=0,add=10;              //总得分和每吃一次食物的得分 
int highscore=0;                 //最高分 
int status,sleeptime=200;        //蛇前进状态,每次运行的时间间隔 
snake *head,*food;               //蛇头指针,食物指针 
snake *q;                        //遍历蛇时用的指针 
int endgamestatus=0;             //游戏结束时的状态 
HANDLE hOut;                      //控制台句柄 
void gotoxy(int x,int y);
int color(int c);
void printsnake();
void wlcome();
void createmap();
void scoreandtips();
void initsnake();
void 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();
main()
{ 
 
system("mode con cols=100 lines=30");
printsnake();
wlcome();
file_out();
keyboardcontrol();
endgame();
}
void gotoxy(int x,int y)//设置光标位置 
{ 
COORD c;
c.X=x;
c.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c); //定位光标的位置 
}
int color(int c)//设置颜色 
{ 

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
return 0;
} 
void printsnake()//打印字符蛇 
{ 

gotoxy(2,5);
color(3);
printf("姓名:张小艾");
gotoxy(2,6);
color(3);
printf("学号:1910101099");  
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 wlcome()//欢迎界面 
{ 
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\n");
color(14);
scanf("%d",&n);
switch(n)
{ 

case 1: 
system("cls");//清屏 
createmap();
initsnake();
createfood();
keyboardcontrol();
break;
case 2:
explation();
break;
break;
case 3:
exit(0);
break;
} 
} 
void createmap()//创建地图 
{ 

int i,j;
for(i=0;i<58;i+=2)
{ 

gotoxy(i,0);
color(5);
printf("□");
gotoxy(i,26);
printf("□"); 
}
for(i=0;i<26;i++)
{ 

gotoxy(0,i);
printf("□");
gotoxy(56,i);
printf("□"); 
}
for(i=2;i<56;i+=2)
{ 

for(j=1;j<26;j++)
{ 

gotoxy(i,j);
color(3);
printf("■\n\n"); 
}
}
}
void scoreandtips()//游戏界面右侧的得分和小提示
{ 

file_out();
gotoxy(64,4);
color(11);
printf("*最高纪录*: %d",highscore);
gotoxy(64,8);
color(14);
printf("得分: %d ",score);
color(13);
gotoxy(73,11);
printf("小提示");
gotoxy(60,13);
color(6);
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 initsnake()
{ 

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!=NULL)
{ 
gotoxy(tail->x,tail->y);
color(14);
printf("★");                   //蛇身由★组成
tail=tail->next; 
}
}
void createfood()//随机出现食物 
{ 

snake *food_1;
srand((unsigned)time(NULL));
food_1=(snake*)malloc(sizeof(snake));
while((food_1->x%2!=0))
{ 

food_1->x=rand()%52+2;
}
food_1->y=rand()%24+1;
q=head;
while(q->next==NULL) 
{ 

if(q->x==food_1->x&&q->y==food_1->y)
{ 

free(food_1);
createfood();
}
q=q->next;
}
gotoxy(food_1->x,food_1->y);
food=food_1;
color(12);
printf("@");
}
int biteself()
{ 

snake *self;                //定义self为蛇身上除蛇头以外的节点 
self=head->next;
while(self!=NULL)
{ 

if(self->x==head->x&&self->y==head->y)
{ 

return 1;
}
self=self->next;
}
return 0;
} 
void cantcrosswall()
{ 

if(head->x==0||head->x==56||head->y==0||head->y==26)
{ 

endgamestatus=1;
endgame();
}
} 
void speedup()//加速 
{ 

if(sleeptime>=50)
{ 

sleeptime=sleeptime-10;
add=add+2;
} 
}
void speeddown()//减速 
{ 

if(sleeptime<350)
{ 

sleeptime=sleeptime+30;
add=add-2;
if(sleeptime==350)
{ 

add=1;
}
} 
}
void snakemove()//控制方向 
{ 

snake *nexthead;
cantcrosswall();
nexthead=(snake*)malloc(sizeof(snake));
if(status==U)//上
{ 

nexthead->x=head->x;         //向上前进时,x不变,y-1 
nexthead->y=head->y-1;
nexthead->next=head;
head=nexthead;
q=head;
//如果下一个位置上有食物,下一个位置的坐标和食物坐标相同 
if(nexthead->x==food->x&&nexthead->y==food->y)
{ 

while(q!=NULL)
{ 

gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next; 
}
score=score+add;
speedup();
createfood();
}
else
{ 

while(q->next->next!=NULL)//如果没有遇见食物 
{ 

gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next; 
}
//经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置 
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");//恢复走过的位置 
free(q->next);
q->next=NULL; 
}	 
} 
if(status==D)
{ 

nexthead->x=head->x;         //向下前进时,x不变,y+1 
nexthead->y=head->y+1;
nexthead->next=head;
head=nexthead;
q=head;
//如果下一个位置上有食物,下一个位置的坐标和食物坐标相同 
if(nexthead->x==food->x&&nexthead->y==food->y)
{ 

while(q!=NULL)
{ 

gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next; 
}
score=score+add;
speedup();
createfood();
}
else
{ 

while(q->next->next!=NULL)//如果没有遇见食物 
{ 

gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next; 
}
//经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置 
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");//恢复走过的位置 
free(q->next);
q->next=NULL; 
}
}
if(status==L)//左 
{ 

nexthead->x=head->x-2;         //向左前进时,x不变,y+1 
nexthead->y=head->y;
nexthead->next=head;
head=nexthead;
q=head;
//如果下一个位置上有食物,下一个位置的坐标和食物坐标相同 
if(nexthead->x==food->x&&nexthead->y==food->y)
{ 

while(q!=NULL)
{ 

gotoxy(q->x,q->y);     //食物变成蛇身上的一部分 
color(14);
printf("★");
q=q->next; 
}
score=score+add;
speedup();
createfood();
}
else
{ 

while(q->next->next!=NULL)//如果没有遇见食物 
{ 

gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next; 
}
//经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置 
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");//恢复走过的位置 
free(q->next);
q->next=NULL; 
}	 
}
if(status==R)
{ 

nexthead->x=head->x+2;         //向上前进时,x不变,y-1 
nexthead->y=head->y;
nexthead->next=head;
head=nexthead;
q=head;
//如果下一个位置上有食物,下一个位置的坐标和食物坐标相同 
if(nexthead->x==food->x&&nexthead->y==food->y)
{ 

while(q!=NULL)
{ 

gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next; 
}
score=score+add;
speedup();
createfood();
}
else
{ 

while(q->next->next!=NULL)//如果没有遇见食物 
{ 

gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next; 
}
//经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置 
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");//恢复走过的位置 
free(q->next);
q->next=NULL; 
}	 
}
if(biteself()==1)
{ 

endgamestatus=2;
endgame();
}
}
void keyboardcontrol()
{ 

status=R;
while(1)
{ 

scoreandtips();
//GetAsyncKeyState函数用来判断函数调用指定虚拟键的状态
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函数,令进程停止,直到达到其中设定的参数时间 
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))
{ 

if(sleeptime<350)
{ 

sleeptime=sleeptime+30;
add=add-2;
if(sleeptime==350)
{ 

add=1;
}
}
}
Sleep(sleeptime);
snakemove();
}
}
void lostdraw()
{ 

system("cls");
int i,j;
gotoxy(17,5);
color(11);
printf("+------------------------");
gotoxy(35,5);
color(14);
printf("o00o");
gotoxy(39,5);
color(11);
printf("----------");
gotoxy(48,5);
color(14);
printf("---");
gotoxy(51,5);
color(11);
printf("----------");
gotoxy(61,5);
color(14);
printf("o00o");
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(11);
printf("-----------------------------+");	
} 
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(); 
} 
choose();	   
}
void file_in()//将最高分存储到文件中 
{ 

FILE *fp;
fp=fopen("save.txt","w+");//以读写的方式建立文件 
fprintf(fp,"%d",score);
fclose(fp);
}
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");
score=0;
sleeptime=200;
add=10;
printsnake();
wlcome();
break;
case 2:
exit(0);
break;
default:
gotoxy(35,27);
color(12);
printf("您输入有误,请重新输入");
system("pause >nul");//按任意键 
endgame();
choose();
break;   
}
} 
void explation()
{ 

int i,j=1;
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("1、不能穿墙,不能咬到自己");
color(3);
gotoxy(30,8);
printf("1、不能穿墙,不能咬到自己");
color(10);
gotoxy(30,11);
printf("2、用↑↓←→分别控制蛇的移动");
color(14);
gotoxy(30,14);
printf("3、F1为加速,F2为减速");
color(11);
gotoxy(30,17);
printf("4、按空格键暂停游戏,再按空格键继续");
color(4);
gotoxy(30,20);
printf("5、ESC:退出游戏,space:暂停游戏");
getch();//按任意键返回主界面
system("cls");
printsnake();
wlcome(); 
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141116.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • UDP编程详解[通俗易懂]

    UDP编程详解[通俗易懂]UDP与TCP的不同之处是:他的通信不需要建立连接的过程。中文名称用户数据报协议。时OSI参考模型中一种无连接的传输层协议。提供面向事务的简单不可靠信息传送服务,UDP在IP报文中的协议号是17.与T

  • hi3516dv300芯片手册_hi3518ev300

    hi3516dv300芯片手册_hi3518ev300基于Hi3516DV300的嵌入式入门演练(上)基于Hi3516DV300的嵌入式入门演练(下)文章目录信息5常见外设操作5.1USB无线网卡5.1.1在内核中开启驱动支持5.1.2准备驱动需使用到的固件文件5.1.3使用wpa_supplicant连接到热点5.1.4使用hostapd将网卡作为AP5.2TF卡的挂载5.2.1手动挂载5.2.2使用mdev自动挂载设备5.2.3使用udev自动挂载设备6扩展演练6.1使用Buildroot构建根文件系统6.2理解设备树6.3

  • 3D游戏模型是怎么制作出来的?[通俗易懂]

    现在游戏建模这个行业非常热门,因此有很多小伙伴梦想成为一名游戏模型师,但是很多都对这个工作需要做什么了解不深,这里我简单介绍一下我从事的3D游戏模型制作。1.我们都知道游戏模型制作肯定是需要建模的,建模是游戏设计中最重要的环节,占整个模型制作的70%,建模的方法很多,游戏模型常用的软件有3DMAX(游戏制作中使用的软件很多都是英文版,建议学习从英文软件开始)建模的难度在所有职业中是最高最全面的,从桌椅到星舰,巨型BOSS等等复杂的模型,模型这方面没有什么多说的,练习是最重要的。具体的方法技巧可.

  • 一年成为Emacs高手(像神一样使用编辑器)

    一年成为Emacs高手(像神一样使用编辑器)

    2021年11月14日
  • LinkedHashSet类「建议收藏」

    LinkedHashSet类「建议收藏」概述:LinkedHashSet:元素唯一,元素无索引,元素存取有序由哈希表结构保证元素唯一,由链表保证元素存取有序案例:publicclassDemo1{publicstaticvoidmain(String[]args){//1.创建一个LinkedHashSet集合,指定集合中元素的类型为String类型LinkedHashSet&l…

    2022年10月12日
  • AndroidMainifest标签说明2——&lt;activity&gt;

    AndroidMainifest标签说明2——&lt;activity&gt;

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号