用c语言写双人贪吃蛇,试图写了一个双人贪吃蛇,结果蛇竖着跑正常,横着跑就只有头了,求解~...
#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语言写双人贪吃蛇,试图写了一个双人贪吃蛇,结果蛇竖着跑正常,横着跑就只有头了,求解~...相关推荐
- c语言写贪吃蛇什么水平_学了一些C语言,也不知道自己学到什么程度,自己想写个贪吃蛇但是写不出来,想看懂下面这个程序,求解释...
已结贴√ 问题点数:20 回复次数:3 学了一些C语言,也不知道自己学到什么程度,自己想写个贪吃蛇但是写不出来,想看懂下面这个程序,求解释 #include//基本库 #include//系统库 #i ...
- python的ai写作_神奇,用Python写一个AI贪吃蛇,真的可以追着你跑的那种
语言选择 Life is short, use python! 所以,根本就没多想,直接上python. 最初版本 先让你的程序跑起来 一开始我的目标仅仅是让程序去控制贪吃蛇运动,让它去吃食物,仅此而 ...
- C语言小项目:基于ncurses库和链表的贪吃蛇小游戏
目录 一.项目准备 二.项目步骤 (1)选择ncurses库的原因 (2)ncurses库的基本入门 (3)贪吃蛇地图的整体规划 (4)实现贪吃蛇第一个节点的显示 (5)显示贪吃蛇的完整身子 (6)实 ...
- python双人格斗游戏代码_Python:游戏:贪吃蛇
一.游戏介绍 贪吃蛇是个非常简单的游戏,适合练手.先来看一下我的游戏截图: 玩法介绍: 回车键:开始游戏 空格键:暂停 / 继续 ↑↓←→方向键 或 WSAD 键:控制移动方向. 食物分红.绿.蓝三种 ...
- 贪吃蛇大作战ai_其实《贪吃蛇大作战》里你的对手都是AI
<贪吃蛇大作战>是最近朋友圈最火爆的手游,不少玩家都通过分享得分进行炫耀并邀请好友加入游戏.这种火爆很快引起了多方关注,有不少媒体开始揭露<贪吃蛇大作战>只是包裹在完美AI模式 ...
- html5实现贪吃蛇小游戏,H5 canvas实现贪吃蛇小游戏
本文介绍了h5 canvas实现贪吃蛇小游戏,分享给大家,具体如下: 实现效果如下 实现思路: ps:这个只是思路,详细可看代码注释 一.先把蛇画出来 定义一下蛇的结构,用一个数组保存一堆矩形,包含蛇 ...
- java贪吃蛇游戏代码下载_java实现贪吃蛇游戏代码(附完整源码)
免费资源网,https://freexyz.cn/ 先给大家分享源码,喜欢的朋友点此处下载. 游戏界面 GUI界面 java实现贪吃蛇游戏需要创建一个桌面窗口出来,此时就需要使用java中的swing ...
- java 贪吃蛇碰撞检测_温习数据算法—贪吃蛇
前言很多朋友学习了计算机语言后都做过贪吃蛇的游戏(VB,C,C++,C#,JAVA,JQuery等),现在估计很多人都忘记怎么写了. 我们现在用jquery+css来实现一个贪吃蛇的游戏效果. 这里主 ...
- ACMNO.27 Python的两行代码解决 C语言-字符逆序 写一函数。使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。 输入 一行字符 输出 逆序后的字符串
题目描述 写一函数,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串. 输入 一行字符 输出 逆序后的字符串 样例输入 123456abcdef 样例输出 fedcba654321 来源 ...
- 写的函数符号表里没有_你有没有想过,C语言 main 函数到底为啥这么写?
但凡是学过C语言的人,都知道要先写main函数,然而很多时候我们看到的main函数却各有差异,这究竟是为啥?哪种是对的呢?今天我们就来聊聊main函数. 那么main函数一共有多少个版本呢? 1.ma ...
最新文章
- 微服务架构10个最重要的设计模式
- 六一欢乐赛 考试总结
- python文件输入和输出
- OpenGL中的reshape函数(整理)
- 全球及中国6氯5氨基邻甲酚行业深度调研与运营潜力分析报告2022版
- Doxygen自动文档生成工具在Eclipse中的集成及使用举例
- Clion生成动态链接库.dll
- 测试—自定义消息处理
- 2sum、3sum、4sum以及任意连续的数的和为sum、任意连续或者不连续的数的和为sum...
- 18.linux日志收集数据到hdfs上面
- Bootstrap-datetimepicker控件使用
- Vue源码分析 - observer.js
- CAN Ape 标定与诊断
- matlab怎么学机器人算法,机器人学、机器视觉与控制——MATLAB算法基础
- C++输出透明背景字体
- 手机怎么调整照片分辨率?照片清晰度dpi怎么调整?
- 使用Windows10搭建服务器 ——一次虚拟机实验记录
- Photoshopcs6 自学笔记0 快捷键
- Java员工管理系统(控制台输出)
- iOS_TUTK_多台设备同时连线卡UI问题