⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 newsnake.c

📁 双人贪食蛇,C语言实训时编的小游戏,可以两个人同时玩
💻 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 + -