📄 newsnake.c
字号:
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define ESC 27
#define ENTER 13
#define KONG 32
#define NODE 1000
int life=1,node,now[3],snakecolor,speed,speeddesc,speedlost;
int time2,time3,timedesc,rsize,dsize;
char *str[5]={"","easy","normal","hard","quit"};
char key;
int food[6][4],foodwhere[6]={0,0,0,0,0,0};
int foodneed=0,foodtotal;
int snake[NODE][2];
long score;
void drawkuang() //画出方框
{
setcolor(WHITE);
line(20,20,20,dsize);
line(20,20,rsize,20);
line(20,dsize,rsize,dsize);
line(rsize,20,rsize,dsize);
}
void printscore() {gotoxy(60,24);printf("score:%d",score);} //输出成绩
void pan() //判断蛇头是否撞到自己或者撞到墙
{
int i,x,y;
x=snake[1][1]+now[1];y=snake[1][2]+now[2];
for(i=3;i<=node;i++) if((x==snake[i][1])&&(y==snake[i][2])) {life=0;break;}
if((x<20)||(x>rsize)||(y<20)||(y>dsize)) life=0;
}
void shengfood() //随机生成食物
{
int x,i,j;
for(j=1;j<=foodtotal;j++)
{
if(foodwhere[j]!=0) continue;
x=0;
while(x==0)
{
x=1;
food[j][1]=(abs(rand()))%(rsize-40)+30;
food[j][2]=(abs(rand()))%(dsize-40)+30;
while((food[j][1]%10)!=0) food[j][1]++;
while((food[j][2]%10)!=0) food[j][2]++;
for(i=1;i<=node;i++)
if((food[j][1]==snake[i][1])&&(food[j][2]==snake[i][2])) {x=0;break;}
for(i=1;i<=j-1;i++)
if((food[j][1]==food[i][1])&&(food[j][2]==food[i][2])) {x=0;break;}
}
food[j][3]=abs(rand())%15+1;food[j][0]=time2-food[j][3];
setfillstyle(SOLID_FILL,food[j][3]);
bar(food[j][1]-5,food[j][2]-5,food[j][1]+5,food[j][2]+5);
foodwhere[j]=1;
}
foodneed=foodtotal;
}
void drawsnake() //画蛇模块
{
int j,i;int oo;
oo=0;
for(i=1;i<=foodtotal;i++)
if((snake[1][1]+now[1]==food[i][1])&&(snake[1][2]+now[2]==food[i][2]))
{node++;oo=1;
for(j=node;j>=2;j--)
{snake[j][1]=snake[j-1][1];snake[j][2]=snake[j-1][2];}
snake[1][1]+=now[1];snake[1][2]+=now[2];
snakecolor=abs(rand())%15+1;
setfillstyle(SOLID_FILL,snakecolor);
bar(snake[1][1]-5,snake[1][2]-5,snake[1][1]+5,snake[1][2]+5);
foodwhere[i]=0;foodneed--;score+=(food[i][3]*10);printscore();
if(speed>=(speedlost+10)) speed-=speeddesc;
if(time2>=time3) time2-=timedesc;
}
if(oo==0)
{
setfillstyle(SOLID_FILL,BLACK);
bar(snake[node][1]-5,snake[node][2]-5,snake[node][1]+5,snake[node][2]+5);
for(j=node;j>=2;j--) {snake[j][1]=snake[j-1][1];snake[j][2]=snake[j-1][2];}
snake[1][1]+=now[1];snake[1][2]+=now[2];
snakecolor=abs(rand())%15+1;
setfillstyle(SOLID_FILL,snakecolor);
bar(snake[1][1]-5,snake[1][2]-5,snake[1][1]+5,snake[1][2]+5);
}
delay(speed);
}
void gameover() //游戏结束
{
clrscr();
cleardevice();
settextstyle(1,0,2);
outtextxy(250,250,"game over!");
settextstyle(2,0,0);
outtextxy(240,450,"press any key to quit");
}
void play() //玩游戏模块
{
int fang[5][3];char nowfang;int l,speedcache,kongnum=0;
node=3;
randomize();
snake[1][1]=50;snake[1][2]=50;
snake[2][1]=40;snake[2][2]=50;
snake[3][1]=30;snake[3][2]=50;
setfillstyle(SOLID_FILL,BLUE);
bar(snake[1][1]-5,snake[1][2]-5,snake[1][1]+5,snake[1][2]+5);
bar(snake[2][1]-5,snake[2][2]-5,snake[2][1]+5,snake[2][2]+5);
bar(snake[3][1]-5,snake[3][2]-5,snake[3][1]+5,snake[3][2]+5);
fang[1][1]=0;fang[1][2]=-10;
fang[2][1]=0;fang[2][2]=10;
fang[3][1]=-10;fang[3][2]=0;
fang[4][1]=10;fang[4][2]=0;
now[1]=fang[4][1];now[2]=fang[4][2];
nowfang='r';
while(life)
{
while((!kbhit())&&(life))
{
if(life) drawsnake();
pan();
if(foodneed<foodtotal) shengfood();
for(l=1;l<=foodtotal;l++) food[l][0]--;
for(l=1;l<=foodtotal;l++)
if(food[l][0]==0)
{setfillstyle(SOLID_FILL,BLACK);
bar(food[l][1]-5,food[l][2]-5,food[l][1]+5,food[l][2]+5);
foodwhere[l]=0;foodneed--;
}
}
if(life){
key=getch();
switch(key)
{
case UP:{if(nowfang=='u'||nowfang=='d') break;
now[1]=fang[1][1];now[2]=fang[1][2];
nowfang='u';drawsnake();pan();break;}
case DOWN:{if(nowfang=='d'||nowfang=='u') break;
now[1]=fang[2][1];now[2]=fang[2][2];
nowfang='d';drawsnake();pan();break;}
case LEFT:{if(nowfang=='l'||nowfang=='r') break;
now[1]=fang[3][1];now[2]=fang[3][2];
nowfang='l';drawsnake();pan();break;}
case RIGHT:{if(nowfang=='r'||nowfang=='l') break;
now[1]=fang[4][1];now[2]=fang[4][2];
nowfang='r';drawsnake();pan();break;}
case KONG:{speedcache=speed;speed=speedlost;kongnum=1;
drawsnake();pan();speed=speedcache;kongnum=0;break;}
case ESC:exit(0);
default: ;
}
}
}
}
int main() //主模块
{
int gd=DETECT,gm;int gamebegin=0,p=1,i=150;char gamekey;
initgraph(&gd,&gm,"e:\\tc3");
setfillstyle(SOLID_FILL,BLUE);
bar(280,150,350,180);
settextstyle(2,0,0);
outtextxy(300,160,str[1]);
setcolor(WHITE);
rectangle(280,180,350,210);
outtextxy(300,190,str[2]);
rectangle(280,210,350,240);
outtextxy(300,220,str[3]);
rectangle(280,240,350,270);
outtextxy(300,250,str[4]);
while(!gamebegin)
{
while(!kbhit()) ;
gamekey=getch();
switch(gamekey)
{
case UP:setfillstyle(SOLID_FILL,BLACK);bar(280,i+(p-1)*30,350,i+(p-1)*30+30);
setcolor(WHITE);rectangle(280,i+(p-1)*30,350,i+(p-1)*30+30);settextstyle(2,0,0);
outtextxy(300,i+(p-1)*30+10,str[p]);p=(p-1)%5;if(p==0) p=4;
setfillstyle(SOLID_FILL,BLUE);bar(280,i+(p-1)*30,350,i+(p-1)*30+30);settextstyle(2,0,0);
outtextxy(300,i+(p-1)*30+10,str[p]);break;
case DOWN:setfillstyle(SOLID_FILL,BLACK);bar(280,i+(p-1)*30,350,i+(p-1)*30+30);
setcolor(WHITE);rectangle(280,i+(p-1)*30,350,i+(p-1)*30+30);settextstyle(2,0,0);
outtextxy(300,i+(p-1)*30+10,str[p]);p=(p+1)%5;if(p==0) p=1;
setfillstyle(SOLID_FILL,BLUE);bar(280,i+(p-1)*30,350,i+(p-1)*30+30);settextstyle(2,0,0);
outtextxy(300,i+(p-1)*30+10,str[p]);break;
case ENTER:gamebegin=1;
default: ;
}
}
switch(p)
{
case 1:rsize=300;dsize=300;speed=300;speeddesc=3;speedlost=150;
time2=100;time3=80;timedesc=1;foodtotal=1;break;
case 2:rsize=400;dsize=400;speed=250;speeddesc=5;speedlost=100;
time2=80;time3=60;timedesc=1;foodtotal=3;break;
case 3:rsize=450;dsize=450;speed=200;speeddesc=5;speedlost=100;
time2=80;time3=50;timedesc=2;foodtotal=5;break;
case 4:exit(0);
default: ;
}
cleardevice();
gotoxy(60,24);printf("score:%d",0);
gotoxy(60,25);printf("press ESC to exit");
drawkuang();
play();
gameover();
while(!kbhit()) ;
getch();
fflush(stdin);
closegraph();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -