您的位置:首页 > 编程语言

贪吃蛇代码

2015-06-16 22:53 302 查看
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
#include<stdlib.h>
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
struct node{
int x,y;
node *next;
};

int Life=1;//是否死亡  0代表死亡;
int x_food,y_food;//食物位置
int x_block[36],y_block[36];//障碍物的位置
char movedir='R';//方向
node* SHead=NULL;//
node* STail=NULL;
node* p=NULL;
int foodnum=0;
int score=0;
int level=0;
int death=0;
int speed=400;

void creatsnakemap();//创建地图
void creatsnake();//创建蛇
void gotoxy(int,int);//光标定位函数*
void SetColor(unsigned short);//设置颜色
void startgame();//开始游戏
void makeblock();//产生障碍物
void isdead();//判断是否死亡;
void nofood(int x,int y);//前方没有食物
void yesfood();//前方有食物
void makefood();//随机产生食物
void drawsnake();//画出蛇
void Snakedelete();//删除蛇的尾巴
void isfood();//判断前方是否有食物
void creatscreen();//打印开始屏幕
void ending();//结束
bool judge();//判断食物是否出现在蛇身体上
int main()
{
system("mode con cols=80 lines=35");
system("color 1f");
creatscreen();
creatsnakemap();
creatsnake();
startgame();
ending();
while(getch()!=27)
continue;
}
void creatscreen()
{
SetColor(7);
gotoxy(31,10);printf("经典贪吃蛇");
gotoxy(28,12);printf("按任意键开始游戏");
gotoxy(28,30);printf("Copyright@_御心飞行");
getch();
system("cls");
}
void creatsnakemap()
{
int i;
SetColor(3);
for(i=4;i<50;i+=2)//横墙
{
gotoxy(i,4);
printf("■");
gotoxy(i,29);
printf("■");
Sleep(30);
}
for(i=4;i<29;i++)//竖墙
{
gotoxy(4,i);
printf("■");
gotoxy(48,i);
printf("■");
Sleep(30);
}
SetColor(7);
gotoxy(58,13);printf("人头:");
gotoxy(58,15);printf("等级:");
gotoxy(58,19);printf("还没有穿墙技能");
makeblock();
}
void creatsnake()
{
node* newsnake;
int i;
SHead=(node *)malloc(sizeof(node));
STail=SHead;
STail->next=NULL;
for(i=0;i<3;i++)
{
newsnake=(node *)malloc(sizeof(node));
newsnake->next=NULL;
STail->next =newsnake;
STail=newsnake;
}
STail->next=NULL;
p=SHead;
SetColor(2);
gotoxy(p->x=16,p->y=10),printf("◆");
p=p->next;
SetColor(3);
gotoxy(p->x=14,p->y=10),printf("□");
p=p->next;
gotoxy(p->x=12,p->y=10),printf("□");
p=p->next;
gotoxy(p->x=10,p->y=10),printf("□");

}
void startgame()
{
while(1)
{
isdead();
if(Life==0)
break;
if(foodnum==0)
{
makefood();
foodnum=1;
}
if(GetAsyncKeyState(VK_UP)&&movedir!='D')
movedir='U';
if(GetAsyncKeyState(VK_DOWN)&&movedir!='U')
movedir='D';
if(GetAsyncKeyState(VK_LEFT)&&movedir!='R')
movedir='L';
if(GetAsyncKeyState(VK_RIGHT)&&movedir!='L')
movedir='R';
isfood();    //判断前方是否有食物,然后移动一格
Sleep(speed);//刷新时间,即速度;
int Olevel=level;
SetColor(7);
gotoxy(68,13);printf("%d",score);
gotoxy(68,15);printf("%d",level=score/7+1);
if(Olevel==level-1)//等级判断
{
if(speed>200)
speed-=60;
else if(speed>100)
speed-=40;
else
speed-=14;
}
SetColor(5);
if(level>=5)
{
gotoxy(58,19);printf("穿墙技能GET.22333");
gotoxy(58,20);printf("你可放心穿过白墙");
}
}
system("cls");
}
void isfood()
{
if(movedir=='U')
{
if(SHead->x==x_food&&SHead->y-1==y_food)//判断
yesfood();    //前方有食物
else
nofood(SHead->x,SHead->y-1);//前方没有食物
}
if(movedir=='D')
{
if(SHead->x==x_food&&SHead->y+1==y_food)
yesfood();
else
nofood(SHead->x,SHead->y+1);
}
if(movedir=='L')
{
if(SHead->x-2==x_food&&SHead->y==y_food)
yesfood();
else
nofood(SHead->x-2,SHead->y);
}
if(movedir=='R')
{
if(SHead->x+2==x_food&&SHead->y==y_food)
yesfood();
else
nofood(SHead->x+2,SHead->y);

}
drawsnake();
}
void nofood(int x,int y)
{
node* Nh;//临时头节点
Nh=(node *)malloc(sizeof(node));//设定新的蛇头
Nh->x=x;
Nh->y=y;
Nh->next=SHead;
SHead=Nh;
Snakedelete();//删除最后一个节点
}
void yesfood()
{
node* food;
food=(node*)malloc(sizeof(node));
food->x=x_food;
food->y=y_food;
food->next=SHead;
SHead=food;
foodnum=0;
makefood();
score++;
}
void Snakedelete()
{
p=SHead;
while((p->next)->next!=NULL)
{
p=p->next;
}
gotoxy(STail->x,STail->y),printf(" ");
free(STail);
STail=p;
STail->next=NULL;
}
void drawsnake()
{
p=SHead->next;
SetColor(2);
gotoxy(SHead->x,SHead->y);
printf("◆");
while(p!=NULL)
{
SetColor(2);
gotoxy(p->x,p->y),printf("□");
p=p->next;
}
}
void isdead()//判断是否死亡
{
node* p;
if(SHead->y==4&&movedir=='U')//预判是否撞到墙
{
Life=0;
return;
}
if(SHead->y==29&&movedir=='D')
{
Life=0;
return;
}
if(SHead->x==4&&movedir=='L')
{
Life=0;
return;
}
if(SHead->x==48&&movedir=='R')
{
Life=0;
return;
}
for(p=SHead->next;p!=NULL;p=p->next)//判断是否撞到自己
{
if(SHead->x==p->x&&SHead->y==p->y)
{
Life=0;
break;
}
}
if(level<5)
{
for(int i=0;i<36;i++)
{
if(SHead->x==x_block[i]&&SHead->y==y_block[i])
{
Life=0;
break;
}
}
}
}
void makefood()//随机产生食物
{
srand(time(NULL));
do
{
x_food=rand()%41+5;
if(x_food%2==1)
x_food++;
y_food=(rand()*rand())%23+5;
}while(judge());//判断食物是否会产生在蛇的身体上
gotoxy(x_food,y_food);
SetColor(4);
printf("●");
foodnum=1;
}
void makeblock()//随机产生障碍物
{
memset(x_block,0,sizeof(x_block));
memset(y_block,0,sizeof(y_block));
int i=0,j=8,k=7,p=2;
for(;i<12;i++)
{
srand(time(NULL));
x_block[i]=(rand()*(++p))%39+8;
if(x_block[i]%2==1)
x_block[i]++;
y_block[i]=(rand()*(++k)*i)%22+5;
if(y_block[i]%3==0)
{
gotoxy(x_block[i],y_block[i]);
printf("■■");
x_block[j]=x_block[i]+2;
y_block[j++]=y_block[i];
}
else if(y_block[i]%3==1)//最坏的情况
{
gotoxy(x_block[i],y_block[i]);
printf("■");
gotoxy(x_block[i],y_block[i]+1);
printf("■");
gotoxy(x_block[i],y_block[i]+2);
printf("■");
x_block[j]=x_block[i];
y_block[j]=y_block[i]+1;
x_block[j+1]=x_block[i];
y_block[j+1]=y_block[i]+2;
j+=2;
}
else
{
gotoxy(x_block[i],y_block[i]);
printf("■■");
x_block[j]=x_block[i]+2;
y_block[j]=y_block[i];
}
}
}
bool judge()
{
node* p=SHead;
int i=0;
for(;p!=NULL;p=p->next)
{
if(p->x==x_food&&p->y==y_food)
return 1;
}
for(;i<36;i++)
{
if(x_food==x_block[i]&&y_food==y_block[i])
return 1;
}
return 0;
}
void ending()
{
SetColor(6);
gotoxy(27,10);printf("game over!   -_-!");
SetColor(7);
gotoxy(30,14);printf("成绩:%d",score);
gotoxy(21,30);printf("我的博客:www.cnblog.com/a1225234/");
}
void gotoxy(int x, int y)//光标定位函数  x列,y行
{
COORD coord = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

void SetColor(unsigned short ForeColor) // ForeColor前景色
{
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //获得缓冲区句柄
SetConsoleTextAttribute(hCon,ForeColor);//设置文本及背景颜色
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: