C语言基于图形库实现双人贪吃蛇_第1页
C语言基于图形库实现双人贪吃蛇_第2页
C语言基于图形库实现双人贪吃蛇_第3页
C语言基于图形库实现双人贪吃蛇_第4页
C语言基于图形库实现双人贪吃蛇_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C语言基于图形库实现双人贪吃蛇本文实例为大家分享了C语言基于图形库实现双人贪吃蛇的具体代码,供大家参考,具体内容如下

/*

蛇蛇大作战

作者:施瑞文

#includeconio.h

#includegraphics.h

#includetime.h

#includestdlib.h

#includestring.h

#includestdio.h

#includemmsystem.h

#pragmacomment(lib,"winmm.lib")

#defineR30

#definefram_width30

//宽度

#definefram_height30

//高度

#defineSIZE16

//方格边长

//玩家1

#defineUP'w'//72

#defineDOWN's'//80

#defineLEFT'a'//75

#defineRIGHT'd'//77

//玩家2

#defineDOWN2'k'

//72,80,75,77是方向键对应的键值

#defineLEFT2'j'

//左

#defineRIGHT2'l'

//右

#defineUP2'i'

//上

charch='a';//用于记录方向,传统模式

charc=LEFT2;

//记录玩家2方向

intm;

//全局变量,用于循环计数

intscore=0;

//玩家1分数和传统模式分数

intscore2=0;

//玩家2分数

charmaxScore[5]="0";

//记录传统模式历史最高分

structFood

//食物结构体

intx;

//食物的横坐标

inty;

//食物的纵坐标

}food;

structSnake{

//玩家1贪吃蛇

intlen;

//蛇的长度

intx[780];

//蛇的每一节的横坐标

inty[780];

//蛇的每一节的纵坐标

intcount;

//蛇吃到的食物数量

intspeed;

//蛇的速度

}snake;

structnewSnake

//玩家2

intlen;

intx[780];

inty[780];

intcount;

intspeed;

}new_snake;

voidinitmap();

//画边框

voidmenu();

//菜单

voidgetfood();

//随机产生食物

voidchushihua();

//初始化蛇

voideatfood();

//判断蛇是否吃到食物

intdie();

//判断蛇是否死亡

voidmove();

//迁移蛇的坐标,移动蛇

voidturn(chart);

//转向

voidprint();

//打印蛇

voidplay();

//开始传统模式游戏

voidstart();

//开始特效

intStringToInt(chara[],intn);

//将字符串转化为整数

voidwall();

//传统模式的障碍物

voidscore_rule();

//显示分数和规则

//双人PK模式

voiddouble_initmap();

//双人PK地图

voidnew_chushihua();

//初始化玩家2的蛇

voiddouble_play();

//开始双人PK模式游戏

voiddouble_eatfood();

//判断是否吃到食物

voiddouble_turn(chart);

//转向

voiddouble_print();

//打印玩家2的蛇

voiddouble_move1();//双人模式玩家1移动

voiddouble_move2();

//双人模式玩家2移动

voiddouble_getfood();//双人模式随机产生食物

voiddouble_score_rule();//双人模式

显示分数和操作规则

intdouble_die();

//双人模式判断玩家1是否死亡

intdouble_die2();

//双人模式判断玩家2是否死亡

intwin(intgrade);

//判断赢家

voidmain()

do

{

initgraph(640,480);

//产生画板

PlaySound("F:\\Snake_bgm\\start.WAV",NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);//播放音乐

menu();

//进入菜单

closegraph();

//关闭画板

}while(1);

system("pause");

intStringToInt(chara[],intn)//将字符串转化为整数

if(n==1)

returna[0]-48;

else

returnStringToInt(a,n-1)*10+a[n-1]-48;

voidstart()//开始特效

intx,y,i;

for(i=0;ii++)

{

x=i;

for(y=x;yR-x;y++)

{

setfillcolor(BROWN);

fillrectangle(x*SIZE,y*SIZE,x*SIZE+SIZE,y*SIZE+SIZE);

}

x=(R-1-i);

for(y=i;yy++)

{

setfillcolor(BROWN);

fillrectangle(x*SIZE,y*SIZE,x*SIZE+SIZE,y*SIZE+SIZE);

}

x=i;

for(y=x;yR-x;y++)

{

setfillcolor(BROWN);

fillrectangle(y*SIZE,x*SIZE,y*SIZE+SIZE,x*SIZE+SIZE);

}

x=(R-1-i);

for(y=i;yy++)

{

setfillcolor(BROWN);

fillrectangle(y*SIZE,x*SIZE,y*SIZE+SIZE,x*SIZE+SIZE);

}

Sleep(50);

}

for(i=0;ii++)

{

x=i;

for(y=x;yR-x;y++)

{

setfillcolor(BLACK);

solidrectangle(x*SIZE,y*SIZE,x*SIZE+SIZE,y*SIZE+SIZE);

}

x=(R-1-i);

for(y=i;yy++)

{

setfillcolor(BLACK);

solidrectangle(x*SIZE,y*SIZE,x*SIZE+SIZE,y*SIZE+SIZE);

}

x=i;

for(y=x;yR-x;y++)

{

setfillcolor(BLACK);

solidrectangle(y*SIZE,x*SIZE,y*SIZE+SIZE,x*SIZE+SIZE);

}

x=(R-1-i);

for(y=i;yy++)

{

setfillcolor(BLACK);

solidrectangle(y*SIZE,x*SIZE,y*SIZE+SIZE,x*SIZE+SIZE);

}

Sleep(50);

}

voiddouble_getfood()//双人模式随机产生食物

intflag;

while(1)

{

flag=1;

food.x=rand()%(fram_width-2)+1;

food.y=rand()%(fram_height-2)+1;

for(m=0;msnake.len;m++)

{

if(food.x==snake.x[m]food.y==snake.y[m])//判断食物是否落到蛇身上

{

flag=0;

break;

}

}

if(flag==0)

continue;

for(m=0;mnew_snake.len;m++)

{

if(food.x==new_snake.x[m]food.y==new_snake.y[m])

{

flag=0;

break;

}

}

if(flag==0)

continue;

if(flag==1)

{

if((new_snake.count+snake.count)%5==0(new_snake.count+snake.count)!=0)//每产生5个小食物后产生1个大食物

{

setfillcolor(WHITE);

fillcircle(food.x*SIZE+SIZE/2,food.y*SIZE+SIZE/2,SIZE/2);

}

else

{

setfillcolor(WHITE);

fillcircle(food.x*SIZE+SIZE/2,food.y*SIZE+SIZE/2,SIZE/4);

}

break;

}

}

voidgetfood()//产生食物

intflag;

while(1)

{

flag=1;

food.x=rand()%(fram_width-2)+1;

food.y=rand()%(fram_height-2)+1;

for(m=1;mfram_width/3;m++)

{

if((food.x==mfood.y==fram_height/4)||(food.x==mfood.y==3*fram_height/4))//判断食物是否落到蛇身上

{

flag=0;

break;

}

}

if(flag==0)

continue;

for(m=2*fram_width/3;mfram_width;m++)

{

if(food.x==mfood.y==fram_height/2)//判断食物是否落到障碍物上

{

flag=0;

break;

}

}

if(flag==0)

continue;

for(m=0;msnake.len;m++)

{

if(food.x==snake.x[m]food.y==snake.y[m])

{

flag=0;

break;

}

}

if(flag==0)

continue;

if(flag==1)

{

if(snake.count%5==0snake.count!=0)

{

setfillcolor(WHITE);

fillcircle(food.x*SIZE+SIZE/2,food.y*SIZE+SIZE/2,SIZE/2);

}

else

{

setfillcolor(WHITE);

fillcircle(food.x*SIZE+SIZE/2,food.y*SIZE+SIZE/2,SIZE/4);

}

break;

}

}

voiddouble_eatfood()//双人模式判断是否吃到食物

if(snake.x[0]==food.xsnake.y[0]==food.y)//如果玩家1吃到食物

{

snake.len++;

if((snake.count+new_snake.count)%5==0(snake.count+new_snake.count)!=0)

{

score+=15;

}

else

score+=5;

snake.count++;

double_getfood();

}

elseif(new_snake.x[0]==food.xnew_snake.y[0]==food.y)//如果玩家2吃到食物

{

new_snake.len++;

if((snake.count+new_snake.count)%5==0(snake.count+new_snake.count)!=0)

{

score2+=15;

}

else

score2+=5;

new_snake.count++;

double_getfood();

}

voideatfood()//传统模式

判断是否吃到食物

if(snake.x[0]==food.xsnake.y[0]==food.y)

{

snake.len++;

if(snake.count%5==0snake.count!=0)

{

score+=20;

if(snake.speed100)

snake.speed-=50;

else

snake.speed=100;

}

else

score+=5;

snake.count++;

getfood();//吃完还有

}

voidnew_chushihua()//初始化玩家2

//产生蛇头

new_snake.x[0]=(fram_width)/3;

new_snake.y[0]=(fram_height)/3;

new_snake.speed=300;

moveto(new_snake.x[0]*SIZE,new_snake.y[0]*SIZE);

setfillcolor(BLUE);

fillcircle(new_snake.x[0]*SIZE+SIZE/2,new_snake.y[0]*SIZE+SIZE/2,SIZE/2);

//产生蛇身

fillcircle(new_snake.x[0]*SIZE+SIZE/2,new_snake.y[0]*SIZE+SIZE/2,SIZE/2);

new_snake.len=4;

for(intk=1;knew_snake.len;k++)//依次给后一节蛇身赋值

{

//将前一节坐标赋给后一节

new_snake.x[k]=new_snake.x[k-1]+1;

new_snake.y[k]=new_snake.y[k-1];

moveto(new_snake.x[k]*SIZE,new_snake.y[k]*SIZE);

setfillcolor(YELLOW);//填充颜色

fillcircle(new_snake.x[k]*SIZE+SIZE/2,new_snake.y[k]*SIZE+SIZE/2,SIZE/2);//画蛇

}

voidchushihua()

//产生蛇头

snake.x[0]=(fram_width)/2;

snake.y[0]=(fram_height)/2;

snake.speed=300;

moveto(snake.x[0]*SIZE,snake.y[0]*SIZE);

setfillcolor(GREEN);

fillcircle(snake.x[0]*SIZE+SIZE/2,snake.y[0]*SIZE+SIZE/2,SIZE/2);

//产生蛇身

//fillcircle(snake.x[0]*SIZE+SIZE/2,snake.y[0]*SIZE+SIZE/2,SIZE/2);

snake.len=4;

for(intk=1;ksnake.len;k++)

{

//将前一节坐标赋给后一节

snake.x[k]=snake.x[k-1]+1;

snake.y[k]=snake.y[k-1];

moveto(snake.x[k]*SIZE,snake.y[k]*SIZE);

setfillcolor(RED);//填充颜色

fillcircle(snake.x[k]*SIZE+SIZE/2,snake.y[k]*SIZE+SIZE/2,SIZE/2);//画蛇

}

voidmove()//迁移坐标,移动蛇

//每次移动将蛇尾巴画为背景色

moveto(snake.x[snake.len-1]*SIZE,snake.y[snake.len-1]*SIZE);

setfillcolor(BLACK);

solidrectangle(snake.x[snake.len-1]*SIZE,snake.y[snake.len-1]*SIZE,snake.x[snake.len-1]*SIZE+SIZE,snake.y[snake.len-1]*SIZE+SIZE);

if(snake.y[0]==0)

//穿墙

snake.y[0]=fram_height-2;

elseif(snake.y[0]==fram_height-1)

snake.y[0]=0;

for(m=snake.len-1;mm--)

{

//将后一节坐标赋值给前一节坐标

snake.x[m]=snake.x[m-1];

snake.y[m]=snake.y[m-1];

}

voiddouble_move1()//双人模式移动玩家1

//每次移动将蛇尾巴画为背景色

moveto(snake.x[snake.len-1]*SIZE,snake.y[snake.len-1]*SIZE);

setfillcolor(BLACK);

solidrectangle(snake.x[snake.len-1]*SIZE,snake.y[snake.len-1]*SIZE,snake.x[snake.len-1]*SIZE+SIZE,snake.y[snake.len-1]*SIZE+SIZE);

if(snake.y[0]==0)

//穿墙

snake.y[0]=fram_height-2;

elseif(snake.y[0]==fram_height-1)

snake.y[0]=0;

elseif(snake.x[0]==0)

snake.x[0]=fram_width-2;

elseif(snake.x[0]==fram_width-1)

snake.x[0]=0;

for(m=snake.len-1;mm--)

{

//将后一节坐标赋值给前一节坐标

snake.x[m]=snake.x[m-1];

snake.y[m]=snake.y[m-1];

}

voiddouble_move2()//双人模式移动玩家2

//intk;

//每次移动将蛇尾巴画为背景色

moveto(new_snake.x[new_snake.len-1]*SIZE,new_snake.y[new_snake.len-1]*SIZE);

setfillcolor(BLACK);

solidrectangle(new_snake.x[new_snake.len-1]*SIZE,new_snake.y[new_snake.len-1]*SIZE,new_snake.x[new_snake.len-1]*SIZE+SIZE,new_snake.y[new_snake.len-1]*SIZE+SIZE);

if(new_snake.y[0]==0)

//穿墙

new_snake.y[0]=fram_height-2;

elseif(new_snake.y[0]==fram_height-1)

new_snake.y[0]=0;

elseif(new_snake.x[0]==0)

new_snake.x[0]=fram_width-2;

elseif(new_snake.x[0]==fram_width-1)

new_snake.x[0]=0;

for(m=new_snake.len-1;mm--)

{

//将后一节坐标赋值给前一节坐标

new_snake.x[m]=new_snake.x[m-1];

new_snake.y[m]=new_snake.y[m-1];

}

voiddouble_turn(chart)

if(t==UP2)

new_snake.y[0]--;

elseif(t==DOWN2)

new_snake.y[0]++;

elseif(t==LEFT2)

new_snake.x[0]--;

elseif(t==RIGHT2)

new_snake.x[0]++;

voidturn(chart)

if(t==UP)

snake.y[0]--;

elseif(t==DOWN)

snake.y[0]++;

elseif(t==LEFT)

snake.x[0]--;

elseif(t==RIGHT)

snake.x[0]++;

voidprint()//打印蛇

//打印蛇头

moveto(snake.x[0]*SIZE,snake.y[0]*SIZE);

setfillcolor(GREEN);

fillcircle(snake.x[0]*SIZE+SIZE/2,snake.y[0]*SIZE+SIZE/2,SIZE/2);

//打印蛇身

for(m=1;msnake.len;m++)

{

setfillcolor(RED);

fillcircle(snake.x[m]*SIZE+SIZE/2,snake.y[m]*SIZE+SIZE/2,SIZE/2);

}

voiddouble_print()//双人模式

同时打印两条蛇

intlen=new_snake.lensnake.lennew_snake.len:snake.len;//len取两者中的较小值

moveto(new_snake.x[0]*SIZE,new_snake.y[0]*SIZE);

setfillcolor(BLUE);

fillcircle(new_snake.x[0]*SIZE+SIZE/2,new_snake.y[0]*SIZE+SIZE/2,SIZE/2);//画玩家2的蛇头

moveto(snake.x[0]*SIZE,snake.y[0]*SIZE);

setfillcolor(GREEN);

fillcircle(snake.x[0]*SIZE+SIZE/2,snake.y[0]*SIZE+SIZE/2,SIZE/2);//画玩家1的蛇头

for(m=1;mm++)//同时画玩家1和玩家2的蛇身

{

setfillcolor(RED);

fillcircle(snake.x[m]*SIZE+SIZE/2,snake.y[m]*SIZE+SIZE/2,SIZE/2);

setfillcolor(YELLOW);

fillcircle(new_snake.x[m]*SIZE+SIZE/2,new_snake.y[m]*SIZE+SIZE/2,SIZE/2);

}

for(m=len;m(new_snake.lensnake.lennew_snake.len:snake.len);m++)

{

if(new_snake.lensnake.len)//如果玩家2的蛇比玩家1的蛇长,则把玩家2比玩家1多处的那部分补全

{

setfillcolor(YELLOW);

fillcircle(new_snake.x[m]*SIZE+SIZE/2,new_snake.y[m]*SIZE+SIZE/2,SIZE/2);

}

else//如果玩家1的蛇比玩家2的蛇长,则把玩家1比玩家2多处的那部分补全

{

setfillcolor(RED);

fillcircle(snake.x[m]*SIZE+SIZE/2,snake.y[m]*SIZE+SIZE/2,SIZE/2);

}

}

intwin(intgrade)//判断输赢

if(score=grade)//如果玩家1率先达到50分,则玩家1胜利

return1;

elseif(score2=grade)//否则玩家2胜利

return2;

voidwall()//画障碍物

for(m=1;mfram_width/3;m++)

{

setfillcolor(BROWN);

fillrectangle(m*SIZE,fram_height/4*SIZE,m*SIZE+SIZE,fram_height/4*SIZE+SIZE);

}

for(m=2*fram_width/3;mfram_width;m++)

{

setfillcolor(BROWN);

fillrectangle(m*SIZE,fram_height/2*SIZE,m*SIZE+SIZE,fram_height/2*SIZE+SIZE);

}

for(m=1;mfram_width/3;m++)

{

setfillcolor(BROWN);

fillrectangle(m*SIZE,3*fram_height/4*SIZE,m*SIZE+SIZE,3*fram_height/4*SIZE+SIZE);

}

voiddouble_score_rule()//分数与规则

settextcolor(WHITE);

outtextxy(31*SIZE,3*SIZE,"玩家1:");

setfillcolor(GREEN);

fillcircle(34*SIZE+SIZE/2,3*SIZE+SIZE/2,SIZE/2);

//产生蛇身

for(intk=35;kk++)

{

setfillcolor(RED);

fillcircle(k*SIZE+SIZE/2,3*SIZE+SIZE/2,SIZE/2);

}

charcount1[5];

itoa(score,count1,10);//将整数转化为字符串

settextcolor(WHITE);

outtextxy(31*SIZE,5*SIZE,"分数:");

setfillcolor(BLACK);

solidrectangle(34*SIZE,5*SIZE,38*SIZE+SIZE,5*SIZE+SIZE);

outtextxy(34*SIZE,5*SIZE,count1);

settextcolor(WHITE);

outtextxy(31*SIZE,7*SIZE,"玩家2:");

setfillcolor(BLUE);

fillcircle(new_snake.x[0]*SIZE+SIZE/2,new_snake.y[0]*SIZE+SIZE/2,SIZE/2);

//产生蛇身

fillcircle(34*SIZE+SIZE/2,7*SIZE+SIZE/2,SIZE/2);

for(intj=35;jj++)

{

setfillcolor(YELLOW);

fillcircle(j*SIZE+SIZE/2,7*SIZE+SIZE/2,SIZE/2);

}

charcount2[5];

itoa(score2,count2,10);

settextcolor(WHITE);

outtextxy(31*SIZE,9*SIZE,"分数:");

setfillcolor(BLACK);

solidrectangle(34*SIZE,9*SIZE,38*SIZE+SIZE,9*SIZE+SIZE);

outtextxy(34*SIZE,9*SIZE,count2);

line(30*SIZE,11*SIZE,40*SIZE,11*SIZE);

settextcolor(RED);

outtextxy(31*SIZE,13*SIZE,"玩家1:");

settextcolor(GREEN);

outtextxy(31*SIZE,14*SIZE,"

w:上

s:下");

outtextxy(31*SIZE,15*SIZE,"

a:左

d:右");

settextcolor(RED);

outtextxy(31*SIZE,17*SIZE,"玩家2:");

settextcolor(GREEN);

outtextxy(31*SIZE,18*SIZE,"

i:上

k:下");

outtextxy(31*SIZE,19*SIZE,"

j:左

l:右");

settextcolor(RED);

outtextxy(31*SIZE,21*SIZE,"规则:");

settextcolor(WHITE);

outtextxy(31*SIZE,23*SIZE,"1.率先达到目标分者");

outtextxy(31*SIZE,24*SIZE,"

胜利。");

outtextxy(31*SIZE,25*SIZE,"2.游戏过程中若碰到");

outtextxy(31*SIZE,26*SIZE,"

对方身体,则减15");

outtextxy(31*SIZE,27*SIZE,"

分,并在初始位置");

outtextxy(31*SIZE,28*SIZE,"

复活");

voidscore_rule()

charcount[5];

FILE*fp;

fp=fopen("maxscore","a+");//读取文件中的内容

if(fp!=NULL)

{

settextcolor(GREEN);

while(fgets(maxScore,5,fp)!=NULL)//将文件中的内容写入maxScore数组中

outtextxy(35*SIZE,5*SIZE,maxScore);//将最高分显示在画板上

fclose(fp);

}

itoa(score,count,10);//将整数转化为字符串

settextcolor(WHITE);

outtextxy(31*SIZE,3*SIZE,"分数:");

setfillcolor(BLACK);

solidrectangle(34*SIZE,3*SIZE,38*SIZE+SIZE,3*SIZE+SIZE);

outtextxy(34*SIZE,3*SIZE,count);

outtextxy(31*SIZE,5*SIZE,"最高分:");

line(30*SIZE,9*SIZE,40*SIZE,9*SIZE);

outtextxy(31*SIZE,11*SIZE,"

w:

上");

outtextxy(31*SIZE,13*SIZE,"

s:

下");

outtextxy(31*SIZE,15*SIZE,"

a:

左");

outtextxy(31*SIZE,17*SIZE,"

d:

右");

voiddouble_initmap()

for(inti=1;ifram_width-1;i++)

{

setfillcolor(BLACK);

fillrectangle(i*SIZE,0,i*SIZE+SIZE,SIZE);

setfillcolor(BLACK);

fillrectangle(i*SIZE,SIZE*(fram_width-1),i*SIZE+SIZE,SIZE*(fram_width-1)+SIZE);

}

for(intj=0;jfram_height;j++)

{

setfillcolor(BLACK);

fillrectangle(0,j*SIZE,SIZE,j*SIZE+SIZE);

setfillcolor(BLACK);

fillrectangle(SIZE*(fram_height-1),j*SIZE,SIZE*(fram_height-1)+SIZE,j*SIZE+SIZE);

}

voidinitmap()

//产生围栏

for(inti=1;ifram_width-1;i++)

{

setfillcolor(BLACK);

fillrectangle(i*SIZE,0,i*SIZE+SIZE,SIZE);

setfillcolor(BLACK);

fillrectangle(i*SIZE,SIZE*(fram_width-1),i*SIZE+SIZE,SIZE*(fram_width-1)+SIZE);

}

for(intj=0;jfram_height;j++)

{

setfillcolor(BROWN);

fillrectangle(0,j*SIZE,SIZE,j*SIZE+SIZE);

setfillcolor(BROWN);

fillrectangle(SIZE*(fram_height-1),j*SIZE,SIZE*(fram_height-1)+SIZE,j*SIZE+SIZE);

}

intdouble_die1()

for(inti=1;inew_snake.len;i++)

{

if(snake.x[0]==new_snake.x[i]snake.y[0]==new_snake.y[i])

{

return1;

}

}

return0;

intdouble_die2()

for(inti=1;isnake.len;i++)

{

if(new_snake.x[0]==snake.x[i]new_snake.y[0]==snake.y[i])

{

return1;

}

}

return0;

intdie()

for(inti=1;isnake.len;i++)

{

if(snake.x[0]==snake.x[i]snake.y[0]==snake.y[i])

{

return1;

}

}

for(m=1;mfram_width/3;m++)

{

if((snake.x[0]==msnake.y[0]==fram_height/4)||(snake.x[0]==msnake.y[0]==3*fram_height/4))

{

return1;

}

}

for(m=2*fram_width/3;mfram_width;m++)

{

if(snake.x[0]==msnake.y[0]==fram_height/2)

{

return1;

}

}

if(snake.x[0]==0||snake.x[0]==fram_width-1)

{

return1;

}

return0;

voidmenu()

charstr[100];

InputBox(str,100,"请选择:\n\n1.传统模式\n\n2.双人PK\n\n3.退出游戏","蛇蛇大作战","",250,100,false);

if(strcmp(str,"1")==0)

{

PlaySound("F:\\Snake_bgm\\bgm1.WAV",NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);

start();

initmap();

wall();

score_rule();

srand(time(NULL));

play();

}

elseif(strcmp(str,"2")==0)

{

PlaySound("F:\\Snake_bgm\\double_play.wav",NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);

start();

double_initmap();

srand(time(NULL));

double_play();

}

elseif(strcmp(str,"3")==0)

{

exit(0);

}

voiddouble_play()//开始双人PK游戏

charstr[5];

intlen;

intgrade;

while(1)

{

intflag=1;

InputBox(str,5,"请输入目标分数(1~1000)\n只能输入数字","蛇蛇大作战","",200,100,false);

len=strlen(str);

str[len]='\0';

if(str[0]==NULL)

continue;

for(inti=0;ii++)

if(str[i]'0'||str[i]'9')

{

flag=0;

break;

}

if(!flag)

continue;

grade=StringToInt(str,len);

if(grade0grade=1000)

break;

}

settextcolor(WHITE);

outtextxy(31*SIZE,1*SIZE,"目标分数:");

settextcolor(BROWN);

outtextxy(36*SIZE,1*SIZE,str);

chark='a';

chart=LEFT2;

//k和t分别记录蛇前一时刻移动的方向

new_snake.count=0;

snake.count=0;

score=0;

score2=0;

new_chushihua();

chushihua();

//初始化

intmove1=0,move2=0;//标记按键的归属

charkey,key1=LEFT,key2=LEFT2;//初始方向

double_getfood();//产生食物

while(1)

{

double_eatfood();//判断是否吃到食物

double_move2();

double_move1();//移动蛇

move1=0;

move2=0;

if(kbhit())//如果有按键

{

key=getch();//获取按键值

switch(key)//判断按键

{

caseUP2:

caseDOWN2:

caseLEFT2:

caseRIGHT2:key2=key;move2=1;break;//如果按键属于玩家2,move2=1;

caseUP:

caseDOWN:

caseLEFT:

caseRIGHT:key1=key;move1=1;break;//如果按键属于玩家1,move1=1;

}

}

if(move1==1)//如果move1=1,即按键属于玩家1

{

if(k==LEFTkey1==RIGHT)

//防止反向咬到自己

key1=LEFT;

elseif(k==UPkey1==DOWN)

key1=UP;

elseif(k==RIGHTkey1==LEFT)

key1=RIGHT;

elseif(k==DOWNkey1==UP)

key1=DOWN;

turn(key1);//转向

}

if(move2==1)//如果move2=1,即按键属于玩家2

{

if(t==UP2key2==DOWN2)

//防止反向咬到自己

key2=UP2;

elseif(t==DOWN2key2==UP2)

key2=DOWN2;

elseif(t==LEFT2key2==RIGHT2)

key2=LEFT2;

elseif(t==RIGHT2key2==LEFT2)

key2=RIGHT2;

double_turn(key2);//转向

}

if(move2==0)//如果按键属于玩家1,则玩家2的蛇继续维持上一时刻的方向

double_turn(t);

if(move1==0)//如果按键属于玩家2,则玩家1的蛇继续维持上一时刻的方向

turn(k);

k=key1;

t=key2;//获取上一时刻的方向

if(double_die1())//判断玩家1是否死亡

{

if(score=15)//如果分数大于15分

score-=15;

else

//如果分数小于15分,则分数清零

score=0;

for(m=0;msnake.len;m++)//死亡后,将遗体用背景色覆盖

{

setfillcolor(BLACK);

solidrectangle(snake.x[m]*SIZE,snake.y[m]*SIZE,snake.x[m]*SIZE+SIZE,snake.y[m]*SIZE+SIZE);

}

k=key1=LEFT;

chushihua();//初始化蛇

}

if(double_die2())//如果玩家2死亡

{

if(score2=15)

score2-=15;

else

score2=0;

for(m=0;mnew_snake.len;m++)

{

setfillcolor(BLACK);

solidrectangle(new_snake.x[m]*SIZE,new_snake.y[m]*SIZE,new_snake.x[m]*SIZE+SIZE,new_snake.y[m]*SIZE+SIZE);

}

t=key2=LEFT2;

new_chushihua();

}

double_print();//画蛇

double_initmap();

double_score_rule();

if(win(grade)==1)//如果玩家1胜利

{

PlaySound("F:\\Snake_bgm\\win.WAV",NULL,SND_FILENAME|SND_ASYNC);

settextcolor(YELLOW);

LOGFONTf;

gettextstyle(

//获取当前字体设置

f.lfHeight=48;

//设米痔甯叨任48

_tcscpy(f.lfFaceName,_T("黑体"));

//设置字体为“黑体”(高版本VC推荐使用_tcscpy_s函数)

f.lfQuality=ANTIALIASED_QUALITY;

//设置输出效果为抗锯齿

settextstyle(

//设置字体样式

outtextxy(8*SIZE,12*SIZE,_T("玩家1胜利!"));

outtextxy(8*SIZE,15*SIZE,_T("按空格键继续!"));

while(getch()!='')

{

;

}

break;

}

elseif(win(grade)==2)//如果玩家2胜利

{

PlaySound("F:\\Snake_bgm\\win.WAV",NULL,SND_FILENAME|SND_ASYNC);

settextcolor(YELLOW);

LOGFONTf;

gettextstyle(

//获取当前字体设置

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论