/**************************************************
vc++ 6.0 贪吃蛇
需要安装easyX
说明:鄙人还是个新手 游戏尚存在不少bug(比如加速后计时就不准了)
游戏内置等级制和分数 升级后蛇会加速
**************************************************/
参考代码:
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<windows.h>
#define UP 'w' //define operate key
#define DOWN 's'
#define LEFT 'a'
#define RIGHT 'd'
void initial_interface();
void game_interface();
void during_game();
void gameover();
void draw_time(int);//显示时间
void draw_score(int);//显示分数
void draw_level(int);//显示等级
void random_fruit();//随机果子
void move_snake();//移动蛇
int death_judgment();//判断死亡条件
void eat_fruit();//吃到水果
struct position//定义坐标位置
{
int x;
int y;
}pos1,pos2,snake[323],tail;//定义绘图坐标(2个),蛇身,蛇尾
int time=0,score=0,level=1,length=2,seed1,seed2,count=0,speed=0,countlevel=0;
//定义时间,分数,等级,蛇的长度,随机种子,计时的数,速度,等级计数
void main()
{
initial_interface();
game_interface();
during_game();
gameover();
}
void initial_interface()//初始界面
{
initgraph(640,480);//创建窗口
char ch1[] = "经典贪吃蛇";
char ch2[] = "Start Game";
char ch3[] = "纪念蛇院院长";
char ch4[] = "西弗勒斯·斯内普";
settextstyle(50, 0, _T("宋体"));//设置字体风格
settextcolor(GREEN);//设置字体颜色
outtextxy(200, 150, ch1);
outtextxy(200, 240, ch2);
settextstyle(16, 0, _T("宋体"));//设置字体风格
outtextxy(465, 370, ch3);
outtextxy(450, 410, ch4);
}
void game_interface()//游戏界面
{
while(1)//按回车或空格进入游戏
{
char c = getch();
if(c==32||c==13)
{
break;
}
}
cleardevice();//清除屏幕内容
setlinestyle(PS_SOLID);//画线风格
setlinecolor(RGB(255,255,255));//画线颜色
setfillstyle(BS_SOLID);//填充风格
setfillcolor(RGB(255,0,0));//填充颜色(多余的一条 放一起好复制)
pos1.x=0;pos1.y=0;pos2.x=24;pos2.y=24;//初始化坐标位置
for(int i=0;i<20;i++)//画填充矩形
{
for(int j=0;j<20;j++)
{
if(i==0||j==0||i==19||j==19)
{
setfillcolor(RGB(102,102,153));//填充颜色
}
else
{
setfillcolor(RGB(255,255,255));//填充颜色
}
fillrectangle(pos1.x,pos1.y,pos2.x,pos2.y);
pos1.x+=24;
pos2.x+=24;
}
pos1.x=0;//重置点位
pos2.x=24; //重置点位
pos1.y+=24;
pos2.y+=24;
}
//显示时间
draw_time(time);
//显示分数
draw_score(score);
//显示等级
draw_level(level);
}
//游戏过程
void during_game()
{
//出现蛇
snake[0].x=240;snake[0].y=216;//蛇的初始坐标
snake[1].x=240;snake[1].y=240;
setfillcolor(GREEN);//蛇院之绿
fillrectangle(snake[0].x,snake[0].y,snake[0].x+24,snake[0].y+24);
fillrectangle(snake[1].x,snake[1].y,snake[1].x+24,snake[1].y+24);
//随机果子
random_fruit();
//移动蛇
move_snake();
}
void gameover()//游戏结束
{
cleardevice();//清除屏幕内容
char ch5[] = "Game Over";
settextstyle(100, 0, _T("宋体"));//设置字体风格
settextcolor(GREEN);//设置字体颜色
outtextxy(80, 160, ch5);
draw_time(time);//显示时间
draw_score(score);//显示分数
draw_level(level);//显示等级
getchar();
closegraph();
}
void draw_time(int a)//显示时间
{
char s1[10];
sprintf(s1, "Time : %d", a);
settextstyle(20, 0, _T("宋体"));
settextcolor(GREEN);
outtextxy(520, 100, s1);
}
void draw_score(int b)//显示分数
{
char s2[10];
sprintf(s2, "Score: %d", b);
settextstyle(20, 0, _T("宋体"));
settextcolor(GREEN);
outtextxy(520, 380, s2);
}
void draw_level(int c)//显示等级
{
char s3[10];
sprintf(s3, "Level: %d", c);
settextstyle(20, 0, _T("宋体"));
settextcolor(GREEN);
outtextxy(520, 130, s3);
}
void random_fruit()//随机果子
{
loop1:seed1=1+rand()%18;
seed2=1+rand()%18;
for(int i=0;i<length;i++)//防止果实一出生就在蛇体内
{
if(24*seed1==snake[i].x && 24*seed2==snake[i].y)
{
goto loop1;//goto语句待改进
}
}
setfillcolor(RED);
fillrectangle(24*seed1,24*seed2,24*(seed1+1),24*(seed2+1));
}
void move_snake()//移动蛇
{
char ch;
while(death_judgment())
{
if(kbhit())
{
ch=getch();
}
if(ch=='w'||ch=='s'||ch=='a'||ch=='d')
{
tail.x=snake[length-1].x;//存放蛇尾
tail.y=snake[length-1].y;
setfillcolor(RGB(255,255,255));//背景颜色(障眼法)
fillrectangle(snake[length-1].x,snake[length-1].y,snake[length-1].x+24,snake[length-1].y+24);
for(int k=length-1;k>0;k--)
{
snake[k].x=snake[k-1].x;
snake[k].y=snake[k-1].y;
}
/*绘制0,0点的蛇头*/
switch(ch)
{
case UP: snake[0].y -= 24;break;
case DOWN: snake[0].y += 24;break;
case LEFT: snake[0].x -= 24;break;
case RIGHT: snake[0].x += 24;break;
default: break;
}
eat_fruit();//吃到水果
setfillcolor(GREEN);//蛇院之绿
fillrectangle(snake[0].x,snake[0].y,snake[0].x+24,snake[0].y+24);
draw_score(score);//刷新分数
count++;//实现计时
if(count%2==0)
{
time++;
}
draw_time(time);//刷新时间
draw_level(level);//刷新等级
Sleep(500-speed);//控制速度
}
}
}
int death_judgment()//判断死亡条件
{
if(snake[0].x==0||snake[0].x==456||snake[0].y==0||snake[0].y==456)
{
return 0;
}
for(int i=1;i<length;i++)
{
if(snake[0].x==snake[i].x && snake[0].y==snake[i].y)
{
return 0;
}
}
return 1;
}
void eat_fruit()//吃到水果
{
if(24*seed1==snake[0].x && 24*seed2==snake[0].y)//判断是否吃到果子
{
length++;//蛇长度+1
score += 10*level;//分数增加(以等级为基数)
countlevel++;//等级计数
if(countlevel%10==0)//吃到10个升级
{
level++;
speed += 50*(level-1);//实现加速(基于等级)
}
setfillcolor(GREEN);
fillrectangle(tail.x,tail.y,tail.x+24,tail.y+24);//将消失的最后一块填上
snake[length-1].x=tail.x;//重新定义最后一块
snake[length-1].y=tail.y;
random_fruit();//诞生新的水果
}
}