C语言实现贪吃蛇,c语言贪吃蛇流程图

C语言实现贪吃蛇,c语言贪吃蛇流程图,C语言基于图形库实现双人贪吃蛇

本文主要介绍了基于图形库的双人吃蛇者的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);

//产生蛇身

填充圆(34 *尺寸尺寸/2.7 *尺寸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 *尺寸,'复活');

}

void score_rule()

{

字符计数[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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: