本文主要介绍了基于图形库的双人吃蛇者的C语言实现。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。
本文分享基于图形库实现双人贪吃蛇的C语言具体代码,供大家参考。具体内容如下
/*
蛇战
作者:石
*/
#包含conio.h
#包含图形. h
#包含时间. h
#包含stdlib.h
#包含字符串. h
#包含stdio.h
#包含mmsystem.h
#pragma注释(lib,' winmm.lib ')
#定义R 30
#define fram_width 30 //宽度
#define fram_height 30 //高度
#定义尺寸16 //正方形边长
//玩家1
#向上定义“w”//72
#定义唐氏'//80
#定义左“a”//75左
#定义右' d' //77右
//玩家2
#define DOWN2 'k' //72,80,75,77是箭头键对应的键值。
#定义LEFT2 'j' //left
# define right 2 ' l '//right
#定义UP2 'i' //
char ch=' a//用于记录方向,传统模式
char c=LEFT2//记录播放器2的方向
int m;//全局变量,用于循环计数
int得分=0;//玩家1得分和传统模式得分
int score 2=0;//玩家2得分
char max score[5]=' 0 ';//创下传统模式历史最高分
结构食物//食物结构
{
int x;//食物的横坐标
int y;//食物的纵坐标
}食物;
结构蛇{//玩家1蛇
int len//蛇的长度
int x[780];//蛇的每一节的横坐标
int y[780];//蛇的每一段的纵坐标
int计数;//蛇吃掉的食物量
int速度;//蛇的速度
}蛇;
结构新闻//播放器2
{
int len
int x[780];
int y[780];
int计数;
int速度;
} new _ snake
void init map();//绘制边框
void menu();//菜单
void get food();//随机生成食物
void褚时华();//初始化蛇
void eat food();//确定蛇是否吃过食物
int die();//确定蛇是否已经死亡
void move();//移动蛇的坐标,移动蛇
无效转弯(char t);//转弯
void打印();//打印蛇
void play();//开始传统模式游戏
void start();//开始特效
int string point(char a[],int n);//将字符串转换为整数
虚空墙();//传统模式中的障碍
void score _ rule();//显示分数和规则
//双PK模式
void double _ init map();//两个人的PK图
void new _ Chu Shihua();//初始化玩家2的蛇
void double _ play();//开始双人PK模式游戏
void double _ eat food();//判断你是否吃食物
void double _ turn(char t);//转弯
void double _ print();//打印玩家2的蛇
void double _ move 1();//玩家1以双人模式移动
void double _ move 2();//玩家2以双人模式移动
void double _ get food();//双人模式随机生成食物
void double _ score _ rule();//双重模式显示分数和运算规则
int double _ die();//双人模式决定1号玩家是否死亡。
int double _ die 2();//双人模式决定2号玩家是否死亡。
int win(int grade);//评判获胜者
void main()
{
做
{
initgraph(640,480);//生成一个画板
PlaySound(' F:\ \ Snake _ bgm \ \ start。WAV ',NULL,SND _ FILENAME | SND _ ASYNC | SND _ LOOP);//播放音乐
menu();//进入菜单
closegraph();//关闭画板
} while(1);
系统(“暂停”);
}
int string point(char a[],int n)//将字符串转换为整数
{
如果(n==1)
返回一个[0]-48;
其他
return string point(a,n-1)* 10 a[n-1]-48;
}
Void start()//启动特殊效果
{
int x,y,I;
for(I=0;i30我)
{
x=I;
for(y=x;yR-x;y)
{
setfillcolor(棕色);
fillrectangle(x*SIZE,y*SIZE,x*SIZE SIZE,y * SIZE SIZE);
}
x=(R-1-I);
for(y=I;y=x;y)
{
setfillcolor(棕色);
fillrectangle(x*SIZE,y*SIZE,x*SIZE SIZE,y * SIZE SIZE);
}
x=I;
for(y=x;yR-x;y)
{
setfillcolor(棕色);
fillrectangle(y*SIZE,x*SIZE,y*SIZE SIZE,x * SIZE SIZE);
}
x=(R-1-I);
for(y=I;y=x;y)
{
setfillcolor(棕色);
fillrectangle(y*SIZE,x*SIZE,y*SIZE SIZE,x * SIZE SIZE);
}
睡眠(50);
}
for(I=0;i30我)
{
x=I;
for(y=x;yR-x;y)
{
setfillcolor(黑色);
solidrectangle(x*SIZE,y*SIZE,x*SIZE SIZE,y * SIZE SIZE);
}
x=(R-1-I);
for(y=I;y=x;y)
{
setfillcolor(黑色);
solidrectangle(x*SIZE,y*SIZE,x*SIZE SIZE,y * SIZE SIZE);
}
x=I;
for(y=x;yR-x;y)
{
setfillcolor(黑色);
solidrectangle(y*SIZE,x*SIZE,y*SIZE SIZE,x * SIZE SIZE);
}
x=(R-1-I);
for(y=I;y=x;y)
{
setfillcolor(黑色);
solidrectangle(y*SIZE,x*SIZE,y*SIZE SIZE,x * SIZE SIZE);
}
睡眠(50);
}
}
void double_getfood()//双人模式随机产生食物
{
(同Internationalorganizations)国际组织标志;
while (1)
{
flag=1;
食物。x=rand()%(fram _ width-2)1;
食物。y=rand()%(fram _ height-2)1;
for(m=0;msnake.lenm)
{
如果(食物。x==蛇。x[m]食物。y==蛇。y[m])//判断食物是否落到蛇身上
{
flag=0;
打破;
}
}
如果(标志==0)
继续;
for(m=0;mnew _ snake.lenm)
{
如果(食物。x==new _ snake。x[m]食物。y==new _ snake。y[m])
{
flag=0;
打破;
}
}
如果(标志==0)
继续;
if (flag==1)
{
如果((new _ snake。数数蛇。count)% 5==0(new _ snake。数数蛇。数数)!=0)//每产生5个小食物后产生一个大食物
{
setfillcolor(白色);
fillcircle(food.x*SIZE SIZE/2,food.y*SIZE SIZE/2,SIZE/2);
}
其他
{
setfillcolor(白色);
fillcircle(food.x*SIZE SIZE/2,food.y*SIZE SIZE/2,SIZE/4);
}
打破;
}
}
}
void getfood()//产生食物
{
(同Internationalorganizations)国际组织标志;
while (1)
{
flag=1;
食物。x=rand()%(fram _ width-2)1;
食物。y=rand()%(fram _ height-2)1;
for(m=1;制造商am _ width/3;m)
{
如果((食物。x==m食物。y==fram _ height/4)| |(食物。x==m食物。y==3 * fram _ height/4))//判断食物是否落到蛇身上
{
flag=0;
打破;
}
}
如果(标志==0)
继续;
for(m=2 * fram _ width/3;mfram _ widthm)
{
如果(食物。x==m食物。y==fram _ height/2)//判断食物是否落到障碍物上
{
flag=0;
打破;
}
}
如果(标志==0)
继续;
for(m=0;msnake.lenm)
{
如果(食物。x==蛇。x[m]食物。y==蛇。y[m])
{
flag=0;
打破;
}
}
如果(标志==0)
继续;
if (flag==1)
{
if (snake.count % 5==0 snake.count!=0)
{
setfillcolor(白色);
fillcircle(food.x*SIZE SIZE/2,food.y*SIZE SIZE/2,SIZE/2);
}
其他
{
setfillcolor(白色);
fillcircle(food.x*SIZE SIZE/2,food.y*SIZE SIZE/2,SIZE/4);
}
打破;
}
}
}
void double_eatfood()//双人模式判断是否吃到食物
{
如果(蛇。x[0]==食物。xsnake。y[0]==食物。y)//如果玩家一吃到食物
{
snake.len
如果((蛇。数new _ snake。count)% 5==0(snake。数new _ snake。数数)!=0)
{
得分=15;
}
其他
得分=5;
蛇,数数
double _ get food();
}
else if(new _ snake。x[0]==食物。xnew _ snake。y[0]==食物。y)//如果玩家2吃到食物
{
新_蛇. len
如果((蛇。数new _ snake。count)% 5==0(snake。数new _ snake。数数)!=0)
{
得分2=15
}
其他
分数2=5;
新_蛇.计数
double _ get food();
}
}
void eatfood()//传统模式判断是否吃到食物
{
如果(蛇。x[0]==食物。xsnake。y[0]==食物。y)
{
snake.len
if (snake.count % 5==0 snake.count!=0)
{
得分=20;
if (snake.speed100)
蛇。速度-=50;
其他
蛇.速度=100
}
其他
得分=5;
蛇,数数
获取食物();//吃完还有
}
}
作废新建_褚时华()//初始化玩家2
{
//产生蛇头
new _ snake。x[0]=(fram _ width)/3;
new _ snake。y[0]=(fram _ height)/3;
新_蛇.速=300
moveto(new_snake.x[0] * SIZE,new_snake。y[0]*大小);
setfillcolor(蓝色);
填充圆(new _ snake。x[0]* SIZE SIZE/2,new_snake.y[0] * SIZE SIZE/2,SIZE/2);
//产生蛇身
填充圆(new _ snake。x[0]* SIZE SIZE/2,new_snake.y[0] * SIZE SIZE/2,SIZE/2);
new _ snake。len=4;
for(int k=1;k new _ snake.lenk )//依次给后一节蛇身赋值
{
//将前一节坐标赋给后一节
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(黄色);//填充颜色
填充圆(new _ snake。x[k]* SIZE SIZE/2,new_snake.y[k]*SIZE SIZE/2,SIZE/2);//画蛇
}
}
虚空初石华()
{
//产生蛇头
蛇。x[0]=(fram _ width)/2;
蛇。y[0]=(fram _ height)/2;
蛇.速度=300
moveto(snake.x[0] * SIZE,snake。y[0]*大小);
setfillcolor(绿色);
填充圆圈(蛇。x[0]* SIZE SIZE/2,snake.y[0] * SIZE SIZE/2,SIZE/2);
//产生蛇身
//填充圆(蛇。x[0]* SIZE SIZE/2,snake.y[0] * SIZE SIZE/2,SIZE/2);
蛇。len=4;
for(int k=1;k snake.lenk)
{
//将前一节坐标赋给后一节
蛇。x[k]=蛇。x[k-1]1;
蛇。蛇。y[k-1];
moveto(snake.x[k] * SIZE,snake。y[k]* SIZE);
setfillcolor(红色);//填充颜色
填充圆圈(蛇。x[k]* SIZE SIZE/2,snake.y[k]*SIZE SIZE/2,SIZE/2);//画蛇
}
}
void move()//迁移坐标,移动蛇
{
//每次移动将蛇尾巴画为背景色
移到(蛇。x【蛇。len-1]*大小,蛇形。y【蛇。len-1]*大小);
setfillcolor(黑色);
实心矩形(蛇形。x【蛇。len-1]* SIZE,snake.y[snake.len - 1] * SIZE,snake.x[snake.len - 1] * SIZE SIZE,snake。y【蛇。len-1]* SIZE SIZE);
if (snake.y[0]==0) //穿墙
蛇。y[0]=fram _ height-2;
else if(蛇。y[0]==fram _ height-1)
蛇。y[0]=0;
for(m=蛇。len-1;m 0;m -)
{
//将后一节坐标赋值给前一节坐标
蛇。x[m]=蛇。x[m-1];
蛇。蛇。y[m-1];
}
}
void double_move1()//双人模式移动玩家一
{
//每次移动将蛇尾巴画为背景色
移到(蛇。x【蛇。len-1]*大小,蛇形。y【蛇。len-1]*大小);
setfillcolor(黑色);
实心矩形(蛇形。x【蛇。len-1]* SIZE,snake.y[snake.len - 1] * SIZE,snake.x[snake.len - 1] * SIZE SIZE,snake。y【蛇。len-1]* SIZE SIZE);
if (snake.y[0]==0) //穿墙
蛇。y[0]=fram _ height-2;
else if(蛇。y[0]==fram _ height-1)
蛇。y[0]=0;
else if (snake.x[0]==0)
蛇。x[0]=fram _ width-2;
else if(蛇。x[0]==fram _ width-1)
蛇。x[0]=0;
for(m=蛇。len-1;m 0;m -)
{
//将后一节坐标赋值给前一节坐标
蛇。x[m]=蛇。x[m-1];
蛇。蛇。y[m-1];
}
}
void double_move2()//双人模式移动玩家2
{
//int k;
//每次移动将蛇尾巴画为背景色
移到(new _ snake。x【新_蛇。len-1]*大小,new _ snake。y【新_蛇。len-1]*大小);
setfillcolor(黑色);
实心矩形(new _ snake。x【新_蛇。len-1]*大小,new _ snake。y[new_snake.len - 1] * SIZE SIZE,new_snake。len-1]* SIZE SIZE,new _ snake。y【新_蛇。len-1]* SIZE SIZE);
if (new_snake.y[0]==0) //穿墙
new _ snake。y[0]=fram _ height-2;
else if(new _ snake。y[0]==fram _ height-1)
new _ snake。y[0]=0;
else if (new_snake.x[0]==0)
new _ snake。x[0]=fram _ width-2;
else if(new _ snake。x[0]==fram _ width-1)
new _ snake。x[0]=0;
for(m=new _ snake。len-1;m 0;m -)
{
//将后一节坐标赋值给前一节坐标
new _ snake。x[m]=new _ snake。x[m-1];
new _ snake。y[m]=new _ snake。y[m-1];
}
}
无效双转弯(字符t)
{
如果(t==UP2)
new _ snake。y[0]-;
else if (t==DOWN2)
new _ snake。y[0];
else if (t==LEFT2)
new _ snake。x[0]-;
else if (t==RIGHT2)
new _ snake。x[0];
}
无效转弯(字符t)
{
if (t==UP)
蛇。y[0]-;
else if (t==DOWN)
蛇。y[0];
else if (t==LEFT)
蛇。x[0]-;
else if (t==RIGHT)
蛇。x[0];
}
void print()//打印蛇
{
//打印蛇头
moveto(snake.x[0] * SIZE,snake。y[0]*大小);
setfillcolor(绿色);
填充圆圈(蛇。x[0]* SIZE SIZE/2,snake.y[0] * SIZE SIZE/2,SIZE/2);
//打印蛇身
for(m=1;msnake.lenm)
{
setfillcolor(红色);
填充圆圈(蛇。x[m]* SIZE SIZE/2,snake.y[m] * SIZE SIZE/2,SIZE/2);
}
}
void double_print()//双人模式同时打印两条蛇
{
int len=new_snake.lensnake.len?new _ snake。莱恩:蛇。len//len取两者中的较小值
moveto(new_snake.x[0] * SIZE,new_snake。y[0]*大小);
setfillcolor(蓝色);
填充圆(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]*大小);
setfillcolor(绿色);
填充圆圈(蛇。x[0]* SIZE SIZE/2,snake.y[0] * SIZE SIZE/2,SIZE/2);//画玩家一的蛇头
for(m=1;mlenm )//同时画玩家一和玩家2的蛇身
{
setfillcolor(红色);
填充圆圈(蛇。x[m]* SIZE SIZE/2,snake.y[m] * SIZE SIZE/2,SIZE/2);
setfillcolor(黄色);
填充圆(new _ snake。x[m]* SIZE SIZE/2,new_snake.y[m] * SIZE SIZE/2,SIZE/2);
}
for(m=len;m(new_snake.lensnake.len?new _ snake。莱恩:蛇。len);m)
{
if (new_snake.lensnake.len)//如果玩家2的蛇比玩家一的蛇长,则把玩家2比玩家一多处的那部分补全
{
setfillcolor(黄色);
填充圆(new _ snake。x[m]* SIZE SIZE/2,new_snake.y[m] * SIZE SIZE/2,SIZE/2);
}
else//如果玩家一的蛇比玩家2的蛇长,则把玩家一比玩家2多处的那部分补全
{
setfillcolor(红色);
填充圆圈(蛇。x[m]* SIZE SIZE/2,snake.y[m] * SIZE SIZE/2,SIZE/2);
}
}
}
int win(int grade)//判断输赢
{
如果(分数=年级)//如果玩家一率先达到50分,则玩家一胜利
返回1;
else if (score2=grade)//否则玩家2胜利
return 2;
}
空心墙()//画障碍物
{
for(m=1;制造商am _ width/3;m)
{
setfillcolor(棕色);
fillrectangle(m*SIZE,fram_height/4 * SIZE,m*SIZE SIZE,fram _ height/4 * SIZE SIZE);
}
for(m=2 * fram _ width/3;mfram _ widthm)
{
setfillcolor(棕色);
fillrectangle(m*SIZE,fram_height/2 * SIZE,m*SIZE SIZE,fram _ height/2 * SIZE SIZE);
}
for(m=1;制造商am _ width/3;m)
{
setfillcolor(棕色);
fillrectangle(m*SIZE,3 * fram_height/4 * SIZE,m*SIZE SIZE,3 * fram _ height/4 * SIZE SIZE);
}
}
void double_score_rule()//分数与规则
{
settextcolor(白色);
outtextxy(31 *尺寸,3 *尺寸,'玩家1:');
setfillcolor(绿色);
fillcircle(34 * SIZE SIZE/2,3 * SIZE SIZE/2,SIZE/2);
//产生蛇身
for(int k=35;k 38k)
{
setfillcolor(红色);
fillcircle(k * SIZE SIZE/2,3 * SIZE SIZE/2,SIZE/2);
}
字符计数1[5];
itoa(分数,count1,10);//将整数转化为字符串
settextcolor(白色);
outtextxy(31 *尺寸,5 *尺寸,'分数:');
setfillcolor(黑色);
实心矩形(34 *尺寸,5 *尺寸,38 *尺寸大小,5 *尺寸大小);
outtextxy(34 *大小,5 *大小,计数1);
settextcolor(白色);
outtextxy(31 *尺寸,7 *尺寸,'玩家2:');
setfillcolor(蓝色);
填充圆(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(int j=35;j 38j)
{
setfillcolor(黄色);
fillcircle(j * SIZE SIZE/2,7 * SIZE SIZE/2,SIZE/2);
}
字符计数2[5];
itoa(score2,count2,10);
settextcolor(白色);
outtextxy(31 *尺寸,9 *尺寸,'分数:');
setfillcolor(黑色);
实心矩形(34 *尺寸,9 *尺寸,38 *尺寸大小,9 *尺寸大小);
outtextxy(34 *大小,9 *大小,计数2);
线(30 *尺寸,11 *尺寸,40 *尺寸,11 *尺寸);
settextcolor(红色);
outtextxy(31 *尺寸,13 *尺寸,'玩家1:');
settextcolor(绿色);
outtextxy(31 *尺寸,14 *尺寸,'宽:上学生:下');
outtextxy(31 *尺寸,15 *尺寸,‘答:左d:右');
settextcolor(红色);
outtextxy(31 *尺寸,17 *尺寸,'玩家2:');
settextcolor(绿色);
outtextxy(31 *尺寸,18 *尺寸,‘我:上k:下');
outtextxy(31 *尺寸,19 *尺寸,' j:左l:右');
settextcolor(红色);
outtextxy(31 *尺寸,21 *尺寸,'规则:');
settextcolor(白色);
outtextxy(31 *尺寸,23 *尺寸,' 1。率先达到目标分者');
outtextxy(31 *尺寸,24 *尺寸,'胜利。');
outtextxy(31 *尺寸,25 *尺寸,' 2。游戏过程中若碰到');
outtextxy(31 *尺寸,26 *尺寸,'对方身体,则减15');
outtextxy(31 *尺寸,27 *尺寸,'分,并在初始位置');
outtextxy(31 *尺寸,28 *尺寸,'复活');
}
作废分数_规则()
{
字符计数[5];
文件* fp
fp=fopen('maxscore ',' a ');//读取文件中的内容
if (fp!=空)
{
settextcolor(绿色);
while (fgets(maxScore,5,fp)!=NULL)//将文件中的内容写入maxScore数组中
outtextxy(35 *大小,5 *大小,最高分);//将最高分显示在画板上
fclose(FP);
}
伊托阿(分数,计数,10);//将整数转化为字符串
settextcolor(白色);
outtextxy(31 *尺寸,3 *尺寸,'分数:');
setfillcolor(黑色);
实心矩形(34 *尺寸,3 *尺寸,38 *尺寸大小,3 *尺寸大小);
outtextxy(34 *尺寸,3 *尺寸,计数);
outtextxy(31 *尺寸,5 *尺寸,'最高分:');
线(30 *尺寸,9 *尺寸,40 *尺寸,9 *尺寸);
outtextxy(31 *尺寸,11 *尺寸,'宽:上');
outtextxy(31 *尺寸,13 *尺寸,s:下');
outtextxy(31 *尺寸,15 *尺寸,‘答:左');
outtextxy(31 *尺寸,17 *尺寸,' d:右');
}
void double_initmap()
{
for(int I=1;I fram _ width-1;我)
{
setfillcolor(黑色);
fillrectangle(i*SIZE,0,i*SIZE SIZE,SIZE);
setfillcolor(黑色);
fillrectangle(i*SIZE,SIZE*(fram_width - 1),i*SIZE SIZE,SIZE *(fram _ width-1)SIZE);
}
for(int j=0;j fram _ heightj)
{
setfillcolor(黑色);
fillrectangle(0,j*SIZE,SIZE,j * SIZE SIZE);
setfillcolor(黑色);
填充矩形(SIZE *(fram _ height-1),j*SIZE,SIZE*(fram_height - 1) SIZE,j * SIZE SIZE);
}
}
void initmap()
{
//产生围栏
for(int I=1;I fram _ width-1;我)
{
setfillcolor(黑色);
fillrectangle(i*SIZE,0,i*SIZE SIZE,SIZE);
setfillcolor(黑色);
fillrectangle(i*SIZE,SIZE*(fram_width - 1),i*SIZE SIZE,SIZE *(fram _ width-1)SIZE);
}
for(int j=0;j fram _ heightj)
{
setfillcolor(棕色);
fillrectangle(0,j*SIZE,SIZE,j * SIZE SIZE);
setfillcolor(棕色);
填充矩形(SIZE *(fram _ height-1),j*SIZE,SIZE*(fram_height - 1) SIZE,j * SIZE SIZE);
}
}
int double_die1()
{
for(int I=1;inew _ snake.len我)
{
如果(蛇。x[0]==new _ snake。x[I]蛇。y[0]==new _ snake。y[I])
{
返回1;
}
}
返回0;
}
int double_die2()
{
for(int I=1;是制造。len我)
{
如果(new _ snake。x[0]==蛇。x[I]new _ snake。y[0]==蛇。y[I])
{
返回1;
}
}
返回0;
}
int die()
{
for(int I=1;是制造。len我)
{
如果(蛇。x[0]==蛇。x[I]蛇。y[0]==蛇。y[I])
{
返回1;
}
}
for(m=1;制造商am _ width/3;m)
{
如果((蛇。x[0]==m蛇。y[0]==fram _ height/4)| |(蛇。x[0]==m蛇。y[0]==3 * fram _ height/4))
{
返回1;
}
}
for(m=2 * fram _ width/3;mfram _ widthm)
{
if (snake.x[0]==m
& snake.y[0] == fram_height / 2) ?? ??? ?{ ?? ??? ??? ?return 1; ?? ??? ?} ?? ?} ?? ?if (snake.x[0] == 0 || snake.x[0] == fram_width - 1) ?? ?{ ?? ??? ?return 1; ?? ?} ?? ?return 0; } ? void menu() { ?? ?char str[100]; ?? ?InputBox(str, 100, "请选择:\n\n 1.传统模式\n\n 2.双人PK\n\n 3.退出游戏", "蛇蛇大作战", "", 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(); ?? ?} ?? ?else if (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(); ?? ?} ?? ?else if (strcmp(str, "3") == 0) ?? ?{ ?? ??? ?exit(0); ?? ?} } ? void double_play()//开始双人PK游戏 { ?? ?char str[5]; ?? ?int len; ?? ?int grade; ?? ?while(1) ?? ?{ ?? ??? ?int flag=1; ?? ??? ?InputBox(str, 5, "请输入目标分数(1~1000)\n只能输入数字", "蛇蛇大作战", "", 200, 100, false); ?? ??? ?len=strlen(str); ?? ??? ?str[len]='\0'; ?? ??? ?if(str[0]==NULL) ?? ??? ??? ?continue; ?? ??? ?for(int i=0;i<len;i++) ?? ??? ??? ?if(str[i]<'0'||str[i]>'9') ?? ??? ??? ?{ ?? ??? ??? ??? ?flag=0; ?? ??? ??? ??? ?break; ?? ??? ??? ?} ?? ??? ?if(!flag) ?? ??? ??? ?continue; ?? ??? ?grade=StringToInt(str,len); ?? ??? ?if(grade>0&&grade<=1000) ?? ??? ??? ?break; ?? ?} ?? ?settextcolor(WHITE); ?? ?outtextxy(31 * SIZE, 1 * SIZE, "目标分数:"); ?? ?settextcolor(BROWN); ?? ?outtextxy(36 * SIZE, 1 * SIZE, str); ?? ?char k = 'a'; ?? ?char t = LEFT2; ?//k和t分别记录蛇前一时刻移动的方向 ?? ?new_snake.count = 0; ?? ?snake.count = 0; ?? ?score = 0; ?? ?score2 = 0; ?? ?new_chushihua(); ?? ?chushihua(); ?//初始化 ?? ?int move1 = 0, move2 = 0;//标记按键的归属 ?? ?char key, key1 = LEFT, key2 = LEFT2;//初始方向 ?? ?double_getfood();//产生食物 ?? ?while (1) ?? ?{ ?? ??? ?double_eatfood();//判断是否吃到食物 ?? ??? ?double_move2(); ?? ??? ?double_move1();//移动蛇 ?? ??? ?move1 = 0; ?? ??? ?move2 = 0; ?? ??? ?if (kbhit())//如果有按键 ?? ??? ?{ ?? ??? ??? ?key = getch();//获取按键值 ?? ??? ??? ?switch (key)//判断按键 ?? ??? ??? ?{ ? ?? ??? ??? ?case UP2: ?? ??? ??? ?case DOWN2: ?? ??? ??? ?case LEFT2: ?? ??? ??? ?case RIGHT2:key2 = key; move2 = 1; break;//如果按键属于玩家2,move2=1; ?? ??? ??? ?case UP: ?? ??? ??? ?case DOWN: ?? ??? ??? ?case LEFT: ?? ??? ??? ?case RIGHT:key1 = key; move1 = 1; break;//如果按键属于玩家1,move1=1; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?if (move1 == 1)//如果move1=1,即按键属于玩家1 ?? ??? ?{ ?? ??? ??? ?if (k == LEFT && key1 == RIGHT) ? ?//防止反向咬到自己 ?? ??? ??? ??? ?key1 = LEFT; ?? ??? ??? ?else if (k == UP && key1 == DOWN) ?? ??? ??? ??? ?key1 = UP; ?? ??? ??? ?else if (k == RIGHT && key1 == LEFT) ?? ??? ??? ??? ?key1 = RIGHT; ?? ??? ??? ?else if (k == DOWN && key1 == UP) ?? ??? ??? ??? ?key1 = DOWN; ?? ??? ??? ?turn(key1);//转向 ?? ??? ?} ?? ??? ?if (move2 == 1)//如果move2=1,即按键属于玩家2 ?? ??? ?{ ?? ??? ??? ?if (t == UP2 && key2 == DOWN2) ? ?//防止反向咬到自己 ?? ??? ??? ??? ?key2 = UP2; ?? ??? ??? ?else if (t == DOWN2 && key2 == UP2) ?? ??? ??? ??? ?key2 = DOWN2; ?? ??? ??? ?else if (t == LEFT2 && key2 == RIGHT2) ?? ??? ??? ??? ?key2 = LEFT2; ?? ??? ??? ?else if (t == RIGHT2 && key2 == 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; m<snake.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; m<new_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); ?? ??? ??? ?LOGFONT f; ?? ??? ??? ?gettextstyle(&f); ? ? ? ? ? ? ? ? ? ? // 获取当前字体设置 ?? ??? ??? ?f.lfHeight = 48; ? ? ? ? ? ? ? ? ? ? ?// 设?米痔甯叨任? 48 ?? ??? ??? ?_tcscpy(f.lfFaceName, _T("黑体")); ? ?// 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数) ?? ??? ??? ?f.lfQuality = ANTIALIASED_QUALITY; ? ?// 设置输出效果为抗锯齿 ? ?? ??? ??? ?settextstyle(&f); ? ? ? ? ? ? ? ? ? ? // 设置字体样式 ?? ??? ??? ?outtextxy(8 * SIZE, 12 * SIZE, _T("玩家1胜利!")); ?? ??? ??? ?outtextxy(8 * SIZE, 15 * SIZE, _T("按空格键继续!")); ?? ??? ??? ?while (getch() != ' ') ?? ??? ??? ?{ ?? ??? ??? ??? ?; ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?else if (win(grade) == 2)//如果玩家2胜利 ?? ??? ?{ ?? ??? ??? ?PlaySound("F:\\Snake_bgm\\win.WAV", NULL, SND_FILENAME | SND_ASYNC); ?? ??? ??? ?settextcolor(YELLOW); ?? ??? ??? ?LOGFONT f; ?? ??? ??? ?gettextstyle(&f); ? ? ? ? ? ? ? ? ? ? // 获取当前字体设置 ?? ??? ??? ?f.lfHeight = 48; ? ? ? ? ? ? ? ? ? ? ?// 设?米痔甯叨任? 48 ?? ??? ??? ?_tcscpy(f.lfFaceName, _T("黑体")); ? ?// 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数) ?? ??? ??? ?f.lfQuality = ANTIALIASED_QUALITY; ? ?// 设置输出效果为抗锯齿 ? ?? ??? ??? ?settextstyle(&f); ? ? ? ? ? ? ? ? ? ? // 设置字体样式 ?? ??? ??? ?outtextxy(8 * SIZE, 12 * SIZE, _T("玩家2胜利!")); ?? ??? ??? ?outtextxy(8 * SIZE, 15 * SIZE, _T("按空格键继续!")); ?? ??? ??? ?while (getch() != ' ') ?? ??? ??? ?{ ?? ??? ??? ??? ?; ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?Sleep(150); ?? ?} } ? void play() ? //开始传统模式游戏 { ?? ?char k = 'a';//k记录前一时刻移动的方向 ?? ?char ch = 'a'; ?? ?snake.count = 0; ?? ?score = 0; ?? ?chushihua(); ?? ?getfood(); ?? ?while (1) ?? ?{ ?? ??? ? ?? ??? ?if (kbhit()) ?? ??? ?{ ?? ??? ??? ?while (1)//如果按其他键,则暂停 ?? ??? ??? ?{ ?? ??? ??? ??? ?ch = getch(); ?? ??? ??? ??? ?if (ch == 'w' || ch == 'a' || ch == 's' || ch == 'd') ?? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ?else ?? ??? ??? ??? ??? ?continue; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?eatfood(); ?? ??? ?move(); ?? ??? ?if (k == 'a'&&ch == 'd') ? ?//防止反向咬到自己 ?? ??? ??? ?ch = 'a'; ?? ??? ?else if (k == 'w'&&ch == 's') ?? ??? ??? ?ch = 'w'; ?? ??? ?else if (k == 'd'&&ch == 'a') ?? ??? ??? ?ch = 'd'; ?? ??? ?else if (k == 's'&&ch == 'w') ?? ??? ??? ?ch = 's'; ?? ??? ?turn(ch); ?? ??? ?k = ch; ?? ??? ? ?? ??? ? ?? ??? ?if (die()) ?? ??? ?{ ?? ??? ??? ?PlaySound("F:\\Snake_bgm\\gameover.WAV", NULL, SND_FILENAME | SND_ASYNC); ?? ??? ??? ?settextcolor(YELLOW); ?? ??? ??? ?LOGFONT f; ?? ??? ??? ?gettextstyle(&f); ? ? ? ? ? ? ? ? ? ? // 获取当前字体设置 ?? ??? ??? ?f.lfHeight = 48; ? ? ? ? ? ? ? ? ? ? ?// 设?米痔甯叨任? 48 ?? ??? ??? ?_tcscpy(f.lfFaceName, _T("黑体")); ? ?// 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数) ?? ??? ??? ?f.lfQuality = ANTIALIASED_QUALITY; ? ?// 设置输出效果为抗锯齿 ? ?? ??? ??? ?settextstyle(&f); ? ? ? ? ? ? ? ? ? ? // 设置字体样式 ?? ??? ??? ?outtextxy(8 * SIZE, 12 * SIZE, _T("Game Over!")); ?? ??? ??? ?outtextxy(8 * SIZE, 15 * SIZE, _T("按空格键继续!")); ?? ??? ??? ?FILE *fp; ?? ??? ??? ?int len; ?? ??? ??? ?len = strlen(maxScore); ?? ??? ??? ?maxScore[len] = '\0'; ?? ??? ??? ?int maxscore; ?? ??? ??? ?char ms[5]; ?? ??? ??? ?maxscore = StringToInt(maxScore, len);//将字符串转化为整数 ?? ??? ??? ?if (score>maxscore)//如果破纪录 ?? ??? ??? ?{ ?? ??? ??? ??? ?fp = fopen("maxscore", "w");//将新纪录写入文件,并将文件中的原内容清空 ?? ??? ??? ??? ?if (fp != NULL) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?itoa(score, ms, 10); ?? ??? ??? ??? ??? ?fputs(ms, fp); ?? ??? ??? ??? ?} ?? ??? ??? ??? ?fclose(fp); ?? ??? ??? ?} ?? ??? ??? ?while (getch() != ' ') ?? ??? ??? ?{ ?? ??? ??? ??? ?; ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?print(); ?? ??? ?initmap();//画边框 ?? ??? ?wall();//画障碍物 ?? ??? ?score_rule();//显示分数和规则 ?? ??? ?Sleep(snake.speed);//速度 ?? ?} }以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。