#include

#include

#include

#include

#include

#include

#define W 70

#define H 22

#define N 2

#define MAX_LEN 400

typedef struct PLAYER

{

char key;//保存玩家输入 int head;//记录长度 int a[2];//记录蛇尾位置 int direct;

int snake [MAX_LEN][3];//每个点有三个属性 snake[i][0]=1用于表示头,0表示身体,snake【i】【1】表示横坐标。snake【i】【2】表示纵坐标。}player;

/******光标移到指定位置**************************************************************/

void gotoxy(HANDLE hOut, int x, int y)

{

COORD pos;

pos.X = x; //横坐标 pos.Y = y; //纵坐标 SetConsoleCursorPosition(hOut, pos);

}

/******制作游戏窗口******************************************************************/

void make_frame()

{

int i;

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量 gotoxy(hOut,0,0); //打印框角 printf("*");

gotoxy(hOut,W,0);

printf("*");

gotoxy(hOut,0,H-1);

printf("*");

gotoxy(hOut,W,H-1);

printf("*");

for(i=0;i

{

gotoxy(hOut,i,0);

printf("*"); //打印上横框 }

for(i=1;i

{

gotoxy(hOut,i,H-1);

printf("*"); //打印下横框 }

for(i=0;i

{

gotoxy(hOut,0,i);

printf("*"); //打印左竖框 }

for(i=1;i

{

gotoxy(hOut,W,i);

printf("*"); //打印右竖框 }

}

//初始化void init(char map[H][W],player stu[N])

{

int i,j;

//初始化蛇//玩家一 stu[0].snake[0][0] = 0,stu[0].snake[0][1] = 9,stu[0].snake[0][2] = 7;

stu[0].snake[1][0] = 0,stu[0].snake[1][1] = 9,stu[0].snake[1][2] = 8;

stu[0].snake[2][0] = 1,stu[0].snake[2][1] = 9,stu[0].snake[2][2] = 9;

stu[0].direct=4;

//玩家二 stu[1].snake[0][0] = 0,stu[1].snake[0][1] = 13,stu[1].snake[0][2] = 7;

stu[1].snake[1][0] = 0,stu[1].snake[1][1] = 13,stu[1].snake[1][2] = 8;

stu[1].snake[2][0] = 1,stu[1].snake[2][1] = 13,stu[1].snake[2][2] = 9;

stu[1].direct=4;

}

//蛇的移动void move(player stu[N],int number,int food[2])//number 表示玩家几{

int x,y;//x,y作为临时交换的值,head作为蛇头 int i,j;

for(i=0;i

if(stu[number].snake[i][0]==1)

{

stu[number].head = i;

break;

}

}

//将找到的蛇头坐标保存下来 x = stu[number].snake[stu[number].head][1];

y = stu[number].snake[stu[number].head][2];

//头移动 switch(stu[number].direct)

{

case 1://向上 stu[number].snake[stu[number].head][1]--;

break;

case 2://向下 stu[number].snake[stu[number].head][1]++;

break;

case 3://向左 stu[number].snake[stu[number].head][2]--;

break;

case 4:

stu[number].snake[stu[number].head][2]++;

break;

}

//判断是否吃到食物 if(ifEat(stu,number,food))

{

//将原来食物的位置变为蛇头 stu[number].snake[stu[number].head+1][0] = 1;

stu[number].snake[stu[number].head+1][1] = food[0];

stu[number].snake[stu[number].head+1][2] = food[1];

//将原来的蛇头变为身体 stu[number].snake[stu[number].head][0] = 0;

//将原来的食物置空 food[0] = 0;

food[1] = 0;

}

//身体移动,从头开始把前一个块的位置赋给后一个块,并保存后一个块的位置 stu[number].a[0]=stu[number].snake[0][1];

stu[number].a[1]=stu[number].snake[0][2];

for(j=stu[number].head-1;j>=0;j--)

{

int temp;

temp = x;

x = stu[number].snake[j][1];

stu[number].snake[j][1] = temp;

temp = y;

y = stu[number].snake[j][2];

stu[number].snake[j][2] = temp;

}

}

//判断是否吃到食物int ifEat(player stu[N],int number,int food[2])

{

//判断头的位置和食物位置是否重合 if(stu[number].snake[stu[number].head][1]==food[0]&&stu[number].snake[stu[number].head][2]==food[1])

{

return 1;

}

else

{

return 0;

}

}

void makeFood(int food[2],player stu[N])

{

int x,y;

srand(time(0));

//生成一个随机坐标 x = rand() % (H-3) + 2;

y = rand() % (W-3) + 2;

while(ifReprat(stu,x,y))//如果重复再次生成,直到不重复 {

x = rand() % (H-3) + 2;

y = rand() % (W-3) + 2;

}

//!!!!!!!!!!!!!!!!!!!!!!! food[0] = y;

food[1] = x;

}

int ifReprat(player stu[N],int x,int y)

{

int i,j;

for(i = 0;i

{

for(j = 0;j

{

if(stu[i].snake[j][0]==1)//到蛇头结束判断 {

break;

}

if((stu[i].snake[j][1] == x)&&(stu[i].snake[j][2] == y))//有重复 {

return 1;

}

}

}

return 0;

}

//绘制现在画面void makeMap(HANDLE hOut,char map[H][W],player stu[N],int food[2])

{

int i,j;

/*//重绘地图

for(i=0;i

{

for(j=0;j

{

if(i==0||j==0||i==H-1||j==W-1)

{

map[i][j] = '*';

}

else

{

map[i][j] = ' ';

}

}

}*/

//重绘蛇 for(i=0;i

{

if(i==0)//不同的蛇,身体不同便于区分 {

gotoxy(hOut,stu[i].a[0],stu[i].a[1]);

printf("");

for(j=0;j

{

gotoxy(hOut,stu[i].snake[j][1],stu[i].snake[j][2]);

if(j==0)

{

printf("○");

}

else

{

//if(stu[i].snake[j][0] == 1) break;//遇到头停止绘制 printf("⊙");

}

}

gotoxy(hOut,stu[i].snake[j][1],stu[i].snake[j][2]);

printf("¤");

}

if(i==1)

{

gotoxy(hOut,stu[i].a[0],stu[i].a[1]);

printf("");

gotoxy(hOut,stu[i].snake[0][1],stu[i].snake[0][2]);

printf("○");

for(j=1;j

{

if(stu[i].snake[j][0] == 1) break;//遇到头停止绘制 gotoxy(hOut,stu[i].snake[j][1],stu[i].snake[j][2]);

printf("⊙");

gotoxy(hOut,W,H);

}

gotoxy(hOut,stu[i].snake[j][1],stu[i].snake[j][2]);

printf("¤");

}

}

}

//判断是否撞(墙、自己、其他玩家)(判定方式待优化)int ifBump(player stu[2],int number,int other)

{

int i,j;

if((stu[number].snake[stu[number].head][2]==0)||(stu[number].snake[stu[number].head][2]==H-1)||(stu[number].snake[stu[number].head][1]==0)||(stu[number].snake[stu[number].head][1]==W-1))

{//判断是否与墙相撞 printf("sifa1");

return 1;

}

for(j=0;j

{//判断是不是与自己相撞 if(stu[number].snake[j][1]==stu[number].snake[stu[number].head][1]&&stu[number].snake[number][2]==stu[number].snake[stu[number].head][2])

{

printf("sifa2");

return 1;

}

}

for(i=0;i

{//判断是不是与别人的身体相撞 if(stu[other].snake[i][1]==stu[number].snake[stu[number].head][1]&&stu[other].snake[i][2]==stu[number].snake[stu[number].head][2])

{

printf("sifa3");

return 1;

}

}

if(stu[other].snake[stu[other].head][1]==stu[number].snake[stu[number].head][1]&&stu[other].snake[stu[other].head][2]==stu[number].snake[stu[number].head][2])

{//判断是否与别人头相撞 if(stu[number].head<=stu[other].head)

{

printf("sifa4");

return 1;

}

}

return 0;

}

void getKey(player stu[N])

{

char choice;

if (_kbhit())

{

choice = _getch();

}

switch(choice)

{

case 'H':

//case 'w'://用户一按上键 if(stu[0].direct!=4)

{

stu[0].direct = 3;

}

break;

case 'P':

//case 's'://用户一按下键 if(stu[0].direct!=3)

{

stu[0].direct = 4;

}

break;

case 'K':

//case 'a'://用户一按左键 if(stu[0].direct!=2)

{

stu[0].direct = 1;

}

break;

case 'M':

//case 'd'://用户一按右键 if(stu[0].direct!=1)

{

stu[0].direct = 2;

}

break;

case '5':

//case 'i'://用户二按上键 if(stu[1].direct!=3)

{

stu[1].direct = 4;

}

break;

case '2':

//case 'k'://用户二按下键 if(stu[1].direct!=4)

{

stu[1].direct = 3;

}

break;

case '4':

//case 'j'://用户二按左键 if(stu[1].direct!=2)

{

stu[1].direct = 1;

}

break;

case '6':

//case 'l'://用户二按右键 if(stu[1].direct!=1)

{

stu[1].direct = 2;

}

break;

}

}

//存档void Leaderboard(player stu[N],char rank[7])

{

int i,j,temp;

char ch;

FILE*fp;

if((fp=fopen("排行榜.txt","r"))==NULL)

{

printf("读取失败!\n");

exit(0);

}

ch=fgetc(fp);

i=0;

while(ch!=EOF)

{

rank[i]=ch;

ch=fgetc(fp);

i++;

}

fclose(fp);

rank[6]=stu[0].head;

rank[5]=stu[1].head;

for(i=0;i<6;i++)

{

for(j=i+1;j<7;j++)

{

if(rank[i]

{

temp=rank[i];

rank[i]=rank[j];

rank[j]=temp;

}

}

}

if((fp=fopen("排行榜.txt","w"))==NULL)

{

printf("缓存失败!\n");

exit(0);

}

for(i=0;i<7;i++)

{

fputc(rank[i],fp);

}

fclose(fp);

}

//判断输入是否合法char ifLegal(char a,int low,int high)

{

a=_getch();

while(a>high||a

{

a=_getch();

}

printf("%c",a);

return a;

}

int main()

{

int w;

char win;

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

char map[H][W];

int food[2];

char rank[7];

player stu[N];

int sign = 0;

food[0] = 2;

food[1] = 9;

//while(1)//{ init(map,stu);

make_frame();

makeMap(hOut,map,stu,food);

//showview(map);//绘制食物 gotoxy(hOut,food[0],food[1]);

printf("⊙");

while(1)

{

getKey(stu);

//system("cls"); Sleep(1000);

move(stu,0,food);

move(stu,1,food);

if (!food[0]&&!food[1])

{//食物已经被吃掉--重新生成食物 makeFood(food,stu);//生成食物坐标 gotoxy(hOut,food[0],food[1]);

printf("⊙");

}

//showview(map); if (ifBump(stu,0,1))

{

printf("游戏结束,玩家二胜\n");

sign = 2;

break;

}

if (ifBump(stu,1,0))

{

printf("游戏结束,玩家一胜\n");

sign = 1;

break;

}

makeMap(hOut,map,stu,food);

getKey(stu);

}

//Leaderboard(stu,rank); if(sign==1)

{

win='1';

}

else if(sign==2)

{

win='2';

}

//system("cls");//again(map,food,rank,stu,win);//} gotoxy(hOut,0,H+2);// return 0;

}

用c语言写双人贪吃蛇,试图写了一个双人贪吃蛇,结果蛇竖着跑正常,横着跑就只有头了,求解~...相关推荐

  1. c语言写贪吃蛇什么水平_学了一些C语言,也不知道自己学到什么程度,自己想写个贪吃蛇但是写不出来,想看懂下面这个程序,求解释...

    已结贴√ 问题点数:20 回复次数:3 学了一些C语言,也不知道自己学到什么程度,自己想写个贪吃蛇但是写不出来,想看懂下面这个程序,求解释 #include//基本库 #include//系统库 #i ...

  2. python的ai写作_神奇,用Python写一个AI贪吃蛇,真的可以追着你跑的那种

    语言选择 Life is short, use python! 所以,根本就没多想,直接上python. 最初版本 先让你的程序跑起来 一开始我的目标仅仅是让程序去控制贪吃蛇运动,让它去吃食物,仅此而 ...

  3. C语言小项目:基于ncurses库和链表的贪吃蛇小游戏

    目录 一.项目准备 二.项目步骤 (1)选择ncurses库的原因 (2)ncurses库的基本入门 (3)贪吃蛇地图的整体规划 (4)实现贪吃蛇第一个节点的显示 (5)显示贪吃蛇的完整身子 (6)实 ...

  4. python双人格斗游戏代码_Python:游戏:贪吃蛇

    一.游戏介绍 贪吃蛇是个非常简单的游戏,适合练手.先来看一下我的游戏截图: 玩法介绍: 回车键:开始游戏 空格键:暂停 / 继续 ↑↓←→方向键 或 WSAD 键:控制移动方向. 食物分红.绿.蓝三种 ...

  5. 贪吃蛇大作战ai_其实《贪吃蛇大作战》里你的对手都是AI

    <贪吃蛇大作战>是最近朋友圈最火爆的手游,不少玩家都通过分享得分进行炫耀并邀请好友加入游戏.这种火爆很快引起了多方关注,有不少媒体开始揭露<贪吃蛇大作战>只是包裹在完美AI模式 ...

  6. html5实现贪吃蛇小游戏,H5 canvas实现贪吃蛇小游戏

    本文介绍了h5 canvas实现贪吃蛇小游戏,分享给大家,具体如下: 实现效果如下 实现思路: ps:这个只是思路,详细可看代码注释 一.先把蛇画出来 定义一下蛇的结构,用一个数组保存一堆矩形,包含蛇 ...

  7. java贪吃蛇游戏代码下载_java实现贪吃蛇游戏代码(附完整源码)

    免费资源网,https://freexyz.cn/ 先给大家分享源码,喜欢的朋友点此处下载. 游戏界面 GUI界面 java实现贪吃蛇游戏需要创建一个桌面窗口出来,此时就需要使用java中的swing ...

  8. java 贪吃蛇碰撞检测_温习数据算法—贪吃蛇

    前言很多朋友学习了计算机语言后都做过贪吃蛇的游戏(VB,C,C++,C#,JAVA,JQuery等),现在估计很多人都忘记怎么写了. 我们现在用jquery+css来实现一个贪吃蛇的游戏效果. 这里主 ...

  9. ACMNO.27 Python的两行代码解决 C语言-字符逆序 写一函数。使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。 输入 一行字符 输出 逆序后的字符串

    题目描述 写一函数,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串. 输入 一行字符 输出 逆序后的字符串 样例输入 123456abcdef 样例输出 fedcba654321 来源 ...

  10. 写的函数符号表里没有_你有没有想过,C语言 main 函数到底为啥这么写?

    但凡是学过C语言的人,都知道要先写main函数,然而很多时候我们看到的main函数却各有差异,这究竟是为啥?哪种是对的呢?今天我们就来聊聊main函数. 那么main函数一共有多少个版本呢? 1.ma ...

最新文章

  1. 微服务架构10个最重要的设计模式
  2. 六一欢乐赛 考试总结
  3. python文件输入和输出
  4. OpenGL中的reshape函数(整理)
  5. 全球及中国6氯5氨基邻甲酚行业深度调研与运营潜力分析报告2022版
  6. Doxygen自动文档生成工具在Eclipse中的集成及使用举例
  7. Clion生成动态链接库.dll
  8. 测试—自定义消息处理
  9. 2sum、3sum、4sum以及任意连续的数的和为sum、任意连续或者不连续的数的和为sum...
  10. 18.linux日志收集数据到hdfs上面
  11. Bootstrap-datetimepicker控件使用
  12. Vue源码分析 - observer.js
  13. CAN Ape 标定与诊断
  14. matlab怎么学机器人算法,机器人学、机器视觉与控制——MATLAB算法基础
  15. C++输出透明背景字体
  16. 手机怎么调整照片分辨率?照片清晰度dpi怎么调整?
  17. 使用Windows10搭建服务器 ——一次虚拟机实验记录
  18. Photoshopcs6 自学笔记0 快捷键
  19. Java员工管理系统(控制台输出)
  20. iOS_TUTK_多台设备同时连线卡UI问题

热门文章

  1. ART艺术作品相关公开数据集
  2. linux 内核头文件、内核库文件
  3. 产学研2.0:麦可思大学生就业据、企业创新调查年鉴(含产学研部分)、RD相关数据等
  4. 仿宋GB_2312字体在wps,office中的安装下载使用
  5. 如何做项目总结与汇报
  6. Android开发之——统计代码行数
  7. 地理空间数据免费获取(一)
  8. matlab 响应曲面,MINITAB 响应曲面法应用
  9. Quartus II 11.0 破解补丁
  10. 新科高德发布2009.03版电子眼升级数据升级方法: 1. 新科2440方案机器内