修改以下c语言代码,要求能在Head函数里实时反映出两条蛇的长度。
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<malloc.h>
#include<time.h>
#include<stdbool.h>
//#define X 20
//#define Y 20
int X,Y; //游戏边界
unsigned char smp_type;//难度系数 main函数中 通过增加蛇的长度 来增减难度
void Change(unsigned char type); //根据游戏边界确定难度 ,0,1,2 type 难度类型
enum Dir {enum_east,enum_south,enum_west,enum_north}; //枚举类型 方向
struct Snake //蛇结构体
{
int iX,iY;
enum Dir emDir;
};
struct Node //链表的节点
{
struct Snake stSnake;
int iCount;
struct Node *pPre;
struct Node *pNext;
};
struct Node *g_pHead=NULL;
struct Node *g_pEnd=NULL;
struct Node *g_pHead1=NULL;
struct Node *g_pEnd1=NULL;
char g_Back[1000][1000];
void Head(void);//头 英文
void Frame(void);//框架 英文
void GotoXY(unsigned short hang,unsigned short lie);//去某行某列
void CreatSnake(int iCount);//创造蛇
void CreatSnake1(int iCount);
void Free();
void Free1();
void DrawSnake(void);
void DrawSnake1(void);
void Move(void);
void Move1(void);
void Drop(void);
void Drop1(void);
void KeyState(void);//箭头控制转向
void Food(void);
void Appand(void);//附加 英文
void Appand1(void);
bool Eat(void);
bool Eat1(void);
bool IsDie(void);
bool IsDie1(void);
void HideCursor(); // 用于隐藏光标
void Change(unsigned char type) //游戏边界) //目前无用
{
switch (type)
{
case 3: // 困难
X=20;Y=20;
GotoXY(0, 0);
printf("中等");
break;
case 2: // 中等
X=15;Y=15;
GotoXY(0, 0);
// g_speed = 200;
printf("困难");
break;
case 1: //简单
X=10;Y=10;
GotoXY(0, 0);
// g_speed = 500;
printf("简单");
}
// g++;
}
int main(void)
{
srand((unsigned int)time(NULL));
while(1)
{
smp_type=0;
int tmp=0;
printf("please press 1,2,3 select easy to diffrent!\n");
while(1)
{
KeyState();//获取 按键
if(smp_type>=1 &&smp_type<=3)break;
}
if(smp_type==1)tmp=3; //蛇的大小
if(smp_type==2)tmp=6;
if(smp_type==3)tmp=9;
Change(smp_type);
Head(); //提示文字
Frame(); //产生边框
//GotoXY(50,50);
//g_pHead;
CreatSnake(3);
CreatSnake1(3);
DrawSnake();
DrawSnake1();
Food();
HideCursor(); //隐藏光标
while(1)
{
KeyState();
if(true==Eat())
{
Food();
}
else if(true==Eat1())
{
Food();
}
/*if((true==IsDie1())||(true==IsDie()))
{
system("pause>0");
}*/
if((true==IsDie1())||(true==IsDie()))
{
system("pause>0");
if(GetAsyncKeyState(VK_ESCAPE))
return 0;
else
{
system("cls");break;
}
}
Drop();
Drop1();
Move();
Move1();
DrawSnake();
DrawSnake1();
Sleep(300);
}
Free();
}
return 0;
}
void HideCursor() // 用于隐藏光标
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0}; // 第二个值为0表示隐藏光标
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
bool IsDie(void) //撞边结束
{
if(1==g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY-3]) //1表示墙 0表示空气 2表示食物
{
GotoXY(15,49);
printf("P1 Game over!");
return true;
}
return false;
}
bool IsDie1(void) //撞边结束 xigai
{
if(1==g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY-3]) //1表示墙 0表示空气 2表示食物
{
GotoXY(15,49);
printf("P2 Game over!");
return true;
}
return false;
}
void GotoXY(unsigned short hang,unsigned short lie) //设置光标位置
{
COORD cd = {lie,hang};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cd);
}
void Appand(void) //吃食后增加长度
{
//创建节点
struct Node *pTemp=(struct Node*)malloc(sizeof(struct Node));
if(NULL==pTemp)
return;
//节点成员赋值
pTemp->iCount++;
pTemp->pPre=NULL;
pTemp->pNext=NULL;
pTemp->stSnake.emDir=g_pEnd->stSnake.emDir;
switch(g_pEnd->stSnake.emDir)
{
case enum_east:
pTemp->stSnake.iX=g_pEnd->stSnake.iX;
pTemp->stSnake.iY=g_pEnd->stSnake.iY+1;
break;
case enum_south:
pTemp->stSnake.iX=g_pEnd->stSnake.iX+1;
pTemp->stSnake.iY=g_pEnd->stSnake.iY;
break;
case enum_west:
pTemp->stSnake.iX=g_pEnd->stSnake.iX;
pTemp->stSnake.iY=g_pEnd->stSnake.iY-1;
break;
case enum_north:
pTemp->stSnake.iX=g_pEnd->stSnake.iX-1;
pTemp->stSnake.iY=g_pEnd->stSnake.iY;
break;
}
//链接到链表的尾巴上
pTemp->pPre=g_pEnd;
g_pEnd->pNext=pTemp;
g_pEnd=pTemp;
}
void Appand1(void) //吃食后增加长度 xiyga
{
//创建节点
struct Node *pTemp1=(struct Node*)malloc(sizeof(struct Node));
if(NULL==pTemp1)
return;
//节点成员赋值
pTemp1->iCount++;
pTemp1->pPre=NULL;
pTemp1->pNext=NULL;
pTemp1->stSnake.emDir=g_pEnd1->stSnake.emDir;
switch(g_pEnd1->stSnake.emDir)
{
case enum_east:
pTemp1->stSnake.iX=g_pEnd1->stSnake.iX;
pTemp1->stSnake.iY=g_pEnd1->stSnake.iY+1;
break;
case enum_south:
pTemp1->stSnake.iX=g_pEnd1->stSnake.iX+1;
pTemp1->stSnake.iY=g_pEnd1->stSnake.iY;
break;
case enum_west:
pTemp1->stSnake.iX=g_pEnd1->stSnake.iX;
pTemp1->stSnake.iY=g_pEnd1->stSnake.iY-1;
break;
case enum_north:
pTemp1->stSnake.iX=g_pEnd1->stSnake.iX-1;
pTemp1->stSnake.iY=g_pEnd1->stSnake.iY;
break;
}
//链接到链表的尾巴上
pTemp1->pPre=g_pEnd1;
g_pEnd1->pNext=pTemp1;
g_pEnd1=pTemp1;
}
bool Eat(void) //判断是否吃食
{
if(2==g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY])
{
g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY]=0;
Appand();
return true;
}
else if(3==g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY])
{
g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY]=0;
Appand();
Appand();
return true;
}
return false;
}
bool Eat1(void) //判断是否吃食 xigai
{
if(2==g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY])
{
g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY]=0;
Appand1();
return true;
}
else if(3==g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY])
{
g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY]=0;
Appand1();
Appand1();
return true;
}
return false;
}
void Food(void) //食物 xiugai
{
while(1)
{
//产生一组坐标
int x=rand()%(X-2)+1;
int y=rand()%(Y-2)+4;
//判断是否在蛇身上
struct Node *pT=g_pHead;
struct Node *pT1=g_pHead1;
while(pT!=NULL)
{
if(x==pT->stSnake.iX&&y==pT->stSnake.iY)
break;
pT=pT->pNext;
}
while(pT1!=NULL)
{
if(x==pT1->stSnake.iX&&y==pT1->stSnake.iY)
break;
pT1=pT1->pNext;
}
//在的话就下一次
if((NULL!=pT1)&&(NULL!=pT))
continue;
//不在,那就是合理的位置
else
{
int foodshape=rand()%3;
if(foodshape==0)
{
foodshape=3;
}
else if(foodshape==1)
{
foodshape=2;
}
g_Back[x][y]=foodshape;
GotoXY(9+x,y*2+30);
if(foodshape==2)
{
printf("□");
}
else if(foodshape==3)
{
printf("o");
}
break;
}
}
}
void KeyState(void) //箭头控制转向 xiugai
{
if(GetAsyncKeyState(VK_UP))
{
g_pHead->stSnake.emDir=enum_north;
}
else if(GetAsyncKeyState(VK_DOWN))
{
g_pHead->stSnake.emDir=enum_south;
}
else if(GetAsyncKeyState(VK_LEFT))
{
g_pHead->stSnake.emDir=enum_west;
}
else if(GetAsyncKeyState(VK_RIGHT))
{
g_pHead->stSnake.emDir=enum_east;
}
if(GetAsyncKeyState('W'))
{
g_pHead1->stSnake.emDir=enum_north;
}
else if(GetAsyncKeyState('S'))
{
g_pHead1->stSnake.emDir=enum_south;
}
else if(GetAsyncKeyState('A'))
{
g_pHead1->stSnake.emDir=enum_west;
}
else if(GetAsyncKeyState('D'))
{
g_pHead1->stSnake.emDir=enum_east;
}
//------------------------------------------ 以下为获取难度级别
else if(GetAsyncKeyState('1'))
{
smp_type=1;
}
//------------------------------------------
else if(GetAsyncKeyState('2'))
{
smp_type=2;
}
//------------------------------------------
else if(GetAsyncKeyState('3'))
{
smp_type=3;
}
}
void Move(void) //移动蛇
{
if(NULL==g_pHead)
return;
struct Node *pT=g_pEnd;
while(pT!=g_pHead)
{
pT->stSnake=pT->pPre->stSnake;
pT=pT->pPre;
}
switch (g_pHead->stSnake.emDir)
{
case enum_east:
g_pHead->stSnake.iY++;
break;
case enum_south:
g_pHead->stSnake.iX++;
break;
case enum_west:
g_pHead->stSnake.iY--;
break;
case enum_north:
g_pHead->stSnake.iX--;
break;
}
}
void Move1(void) //移动蛇 xiugai
{
if(NULL==g_pHead1)
return;
struct Node *pT1=g_pEnd1;
while(pT1!=g_pHead1)
{
pT1->stSnake=pT1->pPre->stSnake;
pT1=pT1->pPre;
}
switch (g_pHead1->stSnake.emDir)
{
case enum_east:
g_pHead1->stSnake.iY++;
break;
case enum_south:
g_pHead1->stSnake.iX++;
break;
case enum_west:
g_pHead1->stSnake.iY--;
break;
case enum_north:
g_pHead1->stSnake.iX--;
break;
}
}
void Drop(void) //消除尾巴
{
GotoXY(9+g_pEnd->stSnake.iX,g_pEnd->stSnake.iY*2+30);
printf(" ");
}
void Drop1(void) //消除尾巴 xigai
{
GotoXY(9+g_pEnd1->stSnake.iX,g_pEnd1->stSnake.iY*2+30);
printf(" ");
}
void DrawSnake(void) //画蛇
{
if(NULL==g_pHead)
return;
struct Node *pT=g_pHead;
while(pT!=NULL)
{
GotoXY(9+pT->stSnake.iX,pT->stSnake.iY*2+30);
printf("O");
pT=pT->pNext;
}
}
void DrawSnake1(void) //画蛇 xigai
{
if(NULL==g_pHead1)
return;
struct Node *pT1=g_pHead1;
while(pT1!=NULL)
{
GotoXY(9+pT1->stSnake.iX,pT1->stSnake.iY*2+30);
printf("@");
pT1=pT1->pNext;
}
}
void CreatSnake(int iCount) //链表、节点 创造蛇的大小
{
if(iCount<=0)
return;
int i;
for(i=0;i<iCount;i++)
{
//创建节点
struct Node *pT=(struct Node*)malloc(sizeof(struct Node));
if(NULL==pT)
return ;
//节点成员赋值
pT->iCount=0;
pT->pNext=NULL;
pT->pPre=NULL;
pT->stSnake.emDir=enum_west;
pT->stSnake.iX=0;
pT->stSnake.iY=0;
// 将节点连在链表上
if(NULL==g_pHead)
{
g_pHead=pT;
g_pEnd=pT;
g_pHead->iCount=1;
//g_pHead->stSnake.iX=rand()%(X-2)+1; //随机数取余数,确保iX小于(X-2)+1
//g_pHead->stSnake.iY=rand()%(Y-iCount-1)+3; //随机数取余数,确保iY小于(Y-iCount)+1
g_pHead->stSnake.iX=7;
g_pHead->stSnake.iY=13;
}
else
{
g_pEnd->pNext=pT;
pT->pPre=g_pEnd;
g_pEnd=pT;
g_pHead->iCount+=1;
g_pEnd->stSnake.iX=g_pEnd->pPre->stSnake.iX;
g_pEnd->stSnake.iY=g_pEnd->pPre->stSnake.iY+1;
}
}
}
void CreatSnake1(int iCount) //链表、节点 创造蛇的大小 xiuagui
{
if(iCount<=0)
return;
int i;
for(i=0;i<iCount;i++)
{
//创建节点
struct Node *pT1=(struct Node*)malloc(sizeof(struct Node));
if(NULL==pT1)
return ;
//节点成员赋值
pT1->iCount=0;
pT1->pNext=NULL;
pT1->pPre=NULL;
pT1->stSnake.emDir=enum_east;
pT1->stSnake.iX=0;
pT1->stSnake.iY=0;
// 将节点连在链表上
if(NULL==g_pHead1)
{
g_pHead1=pT1;
g_pEnd1=pT1;
g_pHead1->iCount=1;
//g_pHead1->stSnake.iX=rand()%(X-2)+1; //随机数取余数,确保iX小于(X-2)+1
//g_pHead1->stSnake.iY=rand()%(Y-iCount-1)+3; //随机数取余数,确保iY小于(Y-iCount)+1
g_pHead1->stSnake.iX=11;
g_pHead1->stSnake.iY=12;
}
else
{
g_pEnd1->pNext=pT1;
pT1->pPre=g_pEnd1;
g_pEnd1=pT1;
g_pHead1->iCount+=1;
g_pEnd1->stSnake.iX=g_pEnd1->pPre->stSnake.iX;
g_pEnd1->stSnake.iY=g_pEnd1->pPre->stSnake.iY+1;
}
}
}
void Free(void)
{
if(NULL==g_pHead)
return;
struct Node *pT=g_pHead;
while(NULL!=pT)
{
//记录被删除的节点
struct Node *pp=pT;
//节点往下走
pT=pT->pNext;
//释放记录
free(pp);
}
g_pHead=NULL;
g_pEnd=NULL;
}
void Free1(void) //xiufvai
{
if(NULL==g_pHead1)
return;
struct Node *pT1=g_pHead1;
while(NULL!=pT1)
{
//记录被删除的节点
struct Node *pp1=pT1;
//节点往下走
pT1=pT1->pNext;
//释放记录
free(pp1);
}
g_pHead1=NULL;
g_pEnd1=NULL;
}
void Frame(void) //边框赋值
{
int i;
for(i=0;i<X;i++)
{
int j;
for(j=0;j<Y;j++)
{
if(i==0||j==0||i==X-1||j==Y-1)
g_Back[i][j]=1;
else g_Back[i][j]=0;
}
}
for(i=0;i<X;i++)
{
GotoXY(i+9, 0);
printf("\t\t\t\t ");
int j;
for(j=0;j<Y;j++)
{
if(g_Back[i][j]==1)
printf("■ ");
else
printf(" ");
}
putchar('\n');
}
}
void Head(void) //提示文字
{
printf("\t\t\t\t\t>>>>>>>>>> 贪吃蛇 <<<<<<<<<<\n");
printf("\t\t\t\t\t>>>>> Enter 启动/暂停 <<<<<\n");
printf("\t\t\t\t\t>>>>> ↑←↓→ 控制方向 <<<<<\n");
printf("\t\t\t\t\t>>>>> 1 查看历史记录 <<<<<\n");
printf("\t\t\t\t\t>>>>> Q 重新开始 <<<<<\n");
printf("\t\t\t\t\t>>>>> 切换难度: 简单 <<<<<\n");
printf("\t\t\t\t\t>>>>> 蛇1当前长度: <<<<<\n");
printf("\t\t\t\t\t>>>>> 蛇2当前长度: 0 <<<<<\n");
printf("\t\t\t\t\t>>>>> ESC 退出游戏 <<<<<\n");
printf("\t\t\t\t\t>>>>>>>>>>>>>>><<<<<<<<<<<<<<<\n");
}
#ifndef HEAD1_H_INCLUDED
#define HEAD1_H_INCLUDED
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include <time.h>
#include"struct.h"
//file
char* generFname(char n[]);
sonl* readPastS(char fname[],int cis);
void readPastB();
void writeSon(char fname[],sonl* sonh);
void writeBig();
//page
void to_g2(char *na );
void to_g3(char *na );
//game.c
void HideCursor();
void gotoxy(int x,int y);
void chioce10();
void withInpute();
void enemySpeed(int mx);
void bulletMove();
void show();
void startup();
void startGame1(int mx,char *na );
void startGame0(int mx,char *na );
//link
stu* createBig(char n[] );
sonl* insertSon(sonl *sonh,int mx,int score);
void deleteBig(char n[] );
void update(int score,int mx,stu *point );
void printCL();
stu* findSon(char n[] );
void printPR(sonl *h);
#endif // HEAD1_H_INCLUDED
你函数里已经有了获取蛇长度的函数,你只是没有调用,Header里加上打印出来蛇的长度就可以了:
int snake1Length = Free();
int snake2Length = Free1();
printf("\t\t\t\t\t>>>>> 蛇1当前长度: <<<<<\n");
printf(snake1Length);
printf("\t\t\t\t\t>>>>> 蛇2当前长度: 0 <<<<<\n");
printf(snake2Length);
做了点修改,参考一下:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<malloc.h>
#include<time.h>
#include<stdbool.h>
//#define X 20
//#define Y 20
int X, Y; //游戏边界
unsigned char smp_type;//难度系数 main函数中 通过增加蛇的长度 来增减难度
void Change(unsigned char type); //根据游戏边界确定难度 ,0,1,2 type 难度类型
enum Dir { enum_east, enum_south, enum_west, enum_north }; //枚举类型 方向
struct Snake //蛇结构体
{
int iX, iY;
enum Dir emDir;
};
struct Node //链表的节点
{
struct Snake stSnake;
int iCount;
struct Node *pPre;
struct Node *pNext;
};
struct Node *g_pHead = NULL;
struct Node *g_pEnd = NULL;
struct Node *g_pHead1 = NULL;
struct Node *g_pEnd1 = NULL;
char g_Back[1000][1000];
void Head(void);//头 英文
void Frame(void);//框架 英文
void GotoXY(unsigned short hang, unsigned short lie);//去某行某列
void CreatSnake(int iCount);//创造蛇
void CreatSnake1(int iCount);
void Free();
void Free1();
void DrawSnake(void);
void DrawSnake1(void);
void Move(void);
void Move1(void);
void Drop(void);
void Drop1(void);
void KeyState(void);//箭头控制转向
void Food(void);
void Appand(void);//附加 英文
void Appand1(void);
bool Eat(void);
bool Eat1(void);
bool IsDie(void);
bool IsDie1(void);
void HideCursor(); // 用于隐藏光标
void Change(unsigned char type) //游戏边界) //目前无用
{
switch (type)
{
case 3: // 困难
X = 20; Y = 20;
GotoXY(1, 0);
printf("中等");
break;
case 2: // 中等
X = 15; Y = 15;
GotoXY(1, 0);
// g_speed = 200;
printf("困难");
break;
case 1: //简单
X = 10; Y = 10;
GotoXY(1, 0);
// g_speed = 500;
printf("简单");
}
// g++;
}
int main(void)
{
srand((unsigned int)time(NULL));
while (1)
{
smp_type = 0;
int tmp = 0;
printf("please press 1,2,3 select easy to diffrent!\n");
while (1)
{
KeyState();//获取 按键
if (smp_type >= 1 && smp_type <= 3)break;
}
if (smp_type == 1)tmp = 3; //蛇的大小
if (smp_type == 2)tmp = 6;
if (smp_type == 3)tmp = 9;
Change(smp_type);
Head(); //提示文字
Frame(); //产生边框
//GotoXY(50,50);
//g_pHead;
CreatSnake(3);
CreatSnake1(3);
DrawSnake();
DrawSnake1();
Food();
HideCursor(); //隐藏光标
while (1)
{
KeyState();
if (true == Eat())
{
Food();
}
else if (true == Eat1())
{
Food();
}
/*if((true==IsDie1())||(true==IsDie()))
{
system("pause>0");
}*/
if ((true == IsDie1()) || (true == IsDie()))
{
system("pause>0");
if (GetAsyncKeyState(VK_ESCAPE))
return 0;
else
{
system("cls"); break;
}
}
Drop();
Drop1();
Move();
Move1();
DrawSnake();
DrawSnake1();
Sleep(300);
}
Free();
}
return 0;
}
void HideCursor() // 用于隐藏光标
{
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; // 第二个值为0表示隐藏光标
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
bool IsDie(void) //撞边结束
{
if (1 == g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY - 3]) //1表示墙 0表示空气 2表示食物
{
GotoXY(15, 49);
printf("P1 Game over!");
return true;
}
return false;
}
bool IsDie1(void) //撞边结束 xigai
{
if (1 == g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY - 3]) //1表示墙 0表示空气 2表示食物
{
GotoXY(15, 49);
printf("P2 Game over!");
return true;
}
return false;
}
void GotoXY(unsigned short hang, unsigned short lie) //设置光标位置
{
COORD cd = { lie,hang };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cd);
}
void Appand(void) //吃食后增加长度
{
//创建节点
struct Node *pTemp = (struct Node*)malloc(sizeof(struct Node));
if (NULL == pTemp)
return;
//节点成员赋值
pTemp->iCount++;
pTemp->pPre = NULL;
pTemp->pNext = NULL;
pTemp->stSnake.emDir = g_pEnd->stSnake.emDir;
switch (g_pEnd->stSnake.emDir)
{
case enum_east:
pTemp->stSnake.iX = g_pEnd->stSnake.iX;
pTemp->stSnake.iY = g_pEnd->stSnake.iY + 1;
break;
case enum_south:
pTemp->stSnake.iX = g_pEnd->stSnake.iX + 1;
pTemp->stSnake.iY = g_pEnd->stSnake.iY;
break;
case enum_west:
pTemp->stSnake.iX = g_pEnd->stSnake.iX;
pTemp->stSnake.iY = g_pEnd->stSnake.iY - 1;
break;
case enum_north:
pTemp->stSnake.iX = g_pEnd->stSnake.iX - 1;
pTemp->stSnake.iY = g_pEnd->stSnake.iY;
break;
}
//链接到链表的尾巴上
pTemp->pPre = g_pEnd;
g_pEnd->pNext = pTemp;
g_pEnd = pTemp;
}
void Appand1(void) //吃食后增加长度 xiyga
{
//创建节点
struct Node *pTemp1 = (struct Node*)malloc(sizeof(struct Node));
if (NULL == pTemp1)
return;
//节点成员赋值
pTemp1->iCount++;
pTemp1->pPre = NULL;
pTemp1->pNext = NULL;
pTemp1->stSnake.emDir = g_pEnd1->stSnake.emDir;
switch (g_pEnd1->stSnake.emDir)
{
case enum_east:
pTemp1->stSnake.iX = g_pEnd1->stSnake.iX;
pTemp1->stSnake.iY = g_pEnd1->stSnake.iY + 1;
break;
case enum_south:
pTemp1->stSnake.iX = g_pEnd1->stSnake.iX + 1;
pTemp1->stSnake.iY = g_pEnd1->stSnake.iY;
break;
case enum_west:
pTemp1->stSnake.iX = g_pEnd1->stSnake.iX;
pTemp1->stSnake.iY = g_pEnd1->stSnake.iY - 1;
break;
case enum_north:
pTemp1->stSnake.iX = g_pEnd1->stSnake.iX - 1;
pTemp1->stSnake.iY = g_pEnd1->stSnake.iY;
break;
}
//链接到链表的尾巴上
pTemp1->pPre = g_pEnd1;
g_pEnd1->pNext = pTemp1;
g_pEnd1 = pTemp1;
}
bool Eat(void) //判断是否吃食
{
if (2 == g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY])
{
g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY] = 0;
Appand();
return true;
}
else if (3 == g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY])
{
g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY] = 0;
Appand();
Appand();
return true;
}
return false;
}
bool Eat1(void) //判断是否吃食 xigai
{
if (2 == g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY])
{
g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY] = 0;
Appand1();
return true;
}
else if (3 == g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY])
{
g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY] = 0;
Appand1();
Appand1();
return true;
}
return false;
}
void Food(void) //食物 xiugai
{
while (1)
{
//产生一组坐标
int x = rand() % (X - 2) + 1;
int y = rand() % (Y - 2) + 4;
//判断是否在蛇身上
struct Node *pT = g_pHead;
struct Node *pT1 = g_pHead1;
while (pT != NULL)
{
if (x == pT->stSnake.iX&&y == pT->stSnake.iY)
break;
pT = pT->pNext;
}
while (pT1 != NULL)
{
if (x == pT1->stSnake.iX&&y == pT1->stSnake.iY)
break;
pT1 = pT1->pNext;
}
//在的话就下一次
if ((NULL != pT1) && (NULL != pT))
continue;
//不在,那就是合理的位置
else
{
int foodshape = rand() % 3;
if (foodshape == 0)
{
foodshape = 3;
}
else if (foodshape == 1)
{
foodshape = 2;
}
g_Back[x][y] = foodshape;
GotoXY(9 + x, y * 2 + 30);
if (foodshape == 2)
{
printf("□");
}
else if (foodshape == 3)
{
printf("o");
}
break;
}
}
}
void KeyState(void) //箭头控制转向 xiugai
{
if (GetAsyncKeyState(VK_UP))
{
if (!g_pHead)
return;
g_pHead->stSnake.emDir = enum_north;
}
else if (GetAsyncKeyState(VK_DOWN))
{
if (!g_pHead)
return;
g_pHead->stSnake.emDir = enum_south;
}
else if (GetAsyncKeyState(VK_LEFT))
{
if (!g_pHead)
return;
g_pHead->stSnake.emDir = enum_west;
}
else if (GetAsyncKeyState(VK_RIGHT))
{
if (!g_pHead)
return;
g_pHead->stSnake.emDir = enum_east;
}
if (GetAsyncKeyState('W'))
{
if (!g_pHead1)
return;
g_pHead1->stSnake.emDir = enum_north;
}
else if (GetAsyncKeyState('S'))
{
if (!g_pHead1)
return;
g_pHead1->stSnake.emDir = enum_south;
}
else if (GetAsyncKeyState('A'))
{
if (!g_pHead1)
return;
g_pHead1->stSnake.emDir = enum_west;
}
else if (GetAsyncKeyState('D'))
{
if (!g_pHead1)
return;
g_pHead1->stSnake.emDir = enum_east;
}
//------------------------------------------ 以下为获取难度级别
else if (GetAsyncKeyState('1'))
{
smp_type = 1;
}
//------------------------------------------
else if (GetAsyncKeyState('2'))
{
smp_type = 2;
}
//------------------------------------------
else if (GetAsyncKeyState('3'))
{
smp_type = 3;
}
}
void Move(void) //移动蛇
{
if (NULL == g_pHead)
return;
struct Node *pT = g_pEnd;
while (pT != g_pHead)
{
pT->stSnake = pT->pPre->stSnake;
pT = pT->pPre;
}
switch (g_pHead->stSnake.emDir)
{
case enum_east:
g_pHead->stSnake.iY++;
break;
case enum_south:
g_pHead->stSnake.iX++;
break;
case enum_west:
g_pHead->stSnake.iY--;
break;
case enum_north:
g_pHead->stSnake.iX--;
break;
}
}
void Move1(void) //移动蛇 xiugai
{
if (NULL == g_pHead1)
return;
struct Node *pT1 = g_pEnd1;
while (pT1 != g_pHead1)
{
pT1->stSnake = pT1->pPre->stSnake;
pT1 = pT1->pPre;
}
switch (g_pHead1->stSnake.emDir)
{
case enum_east:
g_pHead1->stSnake.iY++;
break;
case enum_south:
g_pHead1->stSnake.iX++;
break;
case enum_west:
g_pHead1->stSnake.iY--;
break;
case enum_north:
g_pHead1->stSnake.iX--;
break;
}
}
void Drop(void) //消除尾巴
{
GotoXY(9 + g_pEnd->stSnake.iX, g_pEnd->stSnake.iY * 2 + 30);
printf(" ");
}
void Drop1(void) //消除尾巴 xigai
{
GotoXY(9 + g_pEnd1->stSnake.iX, g_pEnd1->stSnake.iY * 2 + 30);
printf(" ");
}
void DrawSnake(void) //画蛇
{
if (NULL == g_pHead)
return;
struct Node *pT = g_pHead;
while (pT != NULL)
{
GotoXY(9 + pT->stSnake.iX, pT->stSnake.iY * 2 + 30);
printf("O");
pT = pT->pNext;
}
}
void DrawSnake1(void) //画蛇 xigai
{
if (NULL == g_pHead1)
return;
struct Node *pT1 = g_pHead1;
while (pT1 != NULL)
{
GotoXY(9 + pT1->stSnake.iX, pT1->stSnake.iY * 2 + 30);
printf("@");
pT1 = pT1->pNext;
}
}
void CreatSnake(int iCount) //链表、节点 创造蛇的大小
{
if (iCount <= 0)
return;
int i;
for (i = 0; i<iCount; i++)
{
//创建节点
struct Node *pT = (struct Node*)malloc(sizeof(struct Node));
if (NULL == pT)
return;
//节点成员赋值
pT->iCount = 0;
pT->pNext = NULL;
pT->pPre = NULL;
pT->stSnake.emDir = enum_west;
pT->stSnake.iX = 0;
pT->stSnake.iY = 0;
// 将节点连在链表上
if (NULL == g_pHead)
{
g_pHead = pT;
g_pEnd = pT;
g_pHead->iCount = 1;
//g_pHead->stSnake.iX=rand()%(X-2)+1; //随机数取余数,确保iX小于(X-2)+1
//g_pHead->stSnake.iY=rand()%(Y-iCount-1)+3; //随机数取余数,确保iY小于(Y-iCount)+1
g_pHead->stSnake.iX = 7;
g_pHead->stSnake.iY = 13;
}
else
{
g_pEnd->pNext = pT;
pT->pPre = g_pEnd;
g_pEnd = pT;
g_pHead->iCount += 1;
g_pEnd->stSnake.iX = g_pEnd->pPre->stSnake.iX;
g_pEnd->stSnake.iY = g_pEnd->pPre->stSnake.iY + 1;
}
}
}
void CreatSnake1(int iCount) //链表、节点 创造蛇的大小 xiuagui
{
if (iCount <= 0)
return;
int i;
for (i = 0; i<iCount; i++)
{
//创建节点
struct Node *pT1 = (struct Node*)malloc(sizeof(struct Node));
if (NULL == pT1)
return;
//节点成员赋值
pT1->iCount = 0;
pT1->pNext = NULL;
pT1->pPre = NULL;
pT1->stSnake.emDir = enum_east;
pT1->stSnake.iX = 0;
pT1->stSnake.iY = 0;
// 将节点连在链表上
if (NULL == g_pHead1)
{
g_pHead1 = pT1;
g_pEnd1 = pT1;
g_pHead1->iCount = 1;
//g_pHead1->stSnake.iX=rand()%(X-2)+1; //随机数取余数,确保iX小于(X-2)+1
//g_pHead1->stSnake.iY=rand()%(Y-iCount-1)+3; //随机数取余数,确保iY小于(Y-iCount)+1
g_pHead1->stSnake.iX = 11;
g_pHead1->stSnake.iY = 12;
}
else
{
g_pEnd1->pNext = pT1;
pT1->pPre = g_pEnd1;
g_pEnd1 = pT1;
g_pHead1->iCount += 1;
g_pEnd1->stSnake.iX = g_pEnd1->pPre->stSnake.iX;
g_pEnd1->stSnake.iY = g_pEnd1->pPre->stSnake.iY + 1;
}
}
}
void Free(void)
{
if (NULL == g_pHead)
return;
struct Node *pT = g_pHead;
while (NULL != pT)
{
//记录被删除的节点
struct Node *pp = pT;
//节点往下走
pT = pT->pNext;
//释放记录
free(pp);
}
g_pHead = NULL;
g_pEnd = NULL;
}
void Free1(void) //xiufvai
{
if (NULL == g_pHead1)
return;
struct Node *pT1 = g_pHead1;
while (NULL != pT1)
{
//记录被删除的节点
struct Node *pp1 = pT1;
//节点往下走
pT1 = pT1->pNext;
//释放记录
free(pp1);
}
g_pHead1 = NULL;
g_pEnd1 = NULL;
}
void Frame(void) //边框赋值
{
int i;
for (i = 0; i<X; i++)
{
int j;
for (j = 0; j<Y; j++)
{
if (i == 0 || j == 0 || i == X - 1 || j == Y - 1)
g_Back[i][j] = 1;
else g_Back[i][j] = 0;
}
}
for (i = 0; i<X; i++)
{
GotoXY(i + 9, 0);
printf("\t\t\t\t ");
int j;
for (j = 0; j<Y; j++)
{
if (g_Back[i][j] == 1)
printf("■ ");
else
printf(" ");
}
putchar('\n');
}
}
void Head(void) //提示文字
{
printf("\t\t\t\t\t>>>>>>>>>> 贪吃蛇 <<<<<<<<<<\n");
printf("\t\t\t\t\t>>>>> Enter 启动/暂停 <<<<<\n");
printf("\t\t\t\t\t>>>>> ↑←↓→ 控制方向 <<<<<\n");
printf("\t\t\t\t\t>>>>> 1 查看历史记录 <<<<<\n");
printf("\t\t\t\t\t>>>>> Q 重新开始 <<<<<\n");
printf("\t\t\t\t\t>>>>> 切换难度: 简单 <<<<<\n");
int n1 = 0;
if (g_pHead)
n1 = g_pHead->iCount;
printf("\t\t\t\t\t>>>>> 蛇1当前长度:%d <<<<<\n", n1);
int n2 = 0;
if (g_pHead1)
n2 = g_pHead1->iCount;
printf("\t\t\t\t\t>>>>> 蛇2当前长度: %d <<<<<\n", n2);
printf("\t\t\t\t\t>>>>> ESC 退出游戏 <<<<<\n");
printf("\t\t\t\t\t>>>>>>>>>>>>>>><<<<<<<<<<<<<<<\n");
}
写个while(1)的无限循环函数,定时回调,打印实时长度
C语言 要求能在Head函数里实时反映出两条蛇的长度。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <curses.h>
#include <time.h>
int dir_y[] = {-1, 1, 0, 0};
int dir_x[] = {0, 0, -1, 1};
int vis[100][100];
int scord;
typedef struct body
{
int y, x;
struct body *pre, *sub;
} Body;
typedef struct
{
Body *head, *tail;
int DIRECTION;
int HEAD_X;
int HEAD_Y;
int FOOD_X;
int FOOD_Y;
char food;
char H;
} Snake;
//随机函数
int Get_Rand_Number(int k)
{
static int first_time = 0;
if(!first_time){
first_time = 1;
srand((unsigned int)(time(NULL)));
}
return rand()%k + 1;
}
bool kbhit()
{
if(ERR != halfdelay(0)) return 1;
else return 0;
}
void Add(Snake *snake)
{
Body *s;
s = (Body *)malloc(sizeof(Body));
s->y = snake->HEAD_Y;
s->x = snake->HEAD_X;
s->pre = NULL;
s->sub = snake->head;
snake->head->pre = s;
snake->head = s;
}
void Free(Body *head)
{
if(NULL == head) return;
Free(head->sub);
free(head);
}
int Judge_Kill(Snake *snake)
{
if(snake->HEAD_Y == LINES - 1 || snake->HEAD_X == COLS - 1 || snake->HEAD_Y == 0 || snake->HEAD_X == 0) return 1;
if(1 == vis[snake->HEAD_Y][snake->HEAD_X]) return 1;
return 0;
}
void Initialization(Snake *snake, int y, int x)
{
snake->DIRECTION = 0;
int &FOOD_Y = snake->FOOD_Y;
int &FOOD_X = snake->FOOD_X;
snake->HEAD_Y = y;
snake->HEAD_X = x;
while(1)
{
FOOD_Y = Get_Rand_Number(LINES - 3);
FOOD_X = Get_Rand_Number(COLS - 3);
if(!vis[FOOD_Y][FOOD_X]){
vis[FOOD_Y][FOOD_X] = 2;
break;
}
}
move(FOOD_Y, FOOD_X);
printw("%c", snake->food);
snake->head = (Body *)malloc(sizeof(Body));
snake->head->y = y;
snake->head->x = x;
snake->head->pre = snake->head->sub = NULL;
snake->tail = snake->head;
move(y, x);
printw("%c", snake->H);
refresh();
}
void New_Food(Snake *snake)
{
scord++;
int &FOOD_Y = snake->FOOD_Y;
int &FOOD_X = snake->FOOD_X;
while(1){
FOOD_Y = Get_Rand_Number(LINES - 3);
FOOD_X = Get_Rand_Number(COLS - 3);
if(!vis[FOOD_Y][FOOD_X]){
vis[FOOD_Y][FOOD_X] = 2;
break;
}
}
move(FOOD_Y, FOOD_X);
printw("%c", snake->food);
}
int Reverse_Direction(Snake *snake, int fy, int fx)
{
int &HEAD_Y = snake->HEAD_Y;
int &HEAD_X = snake->HEAD_X;
Body *&head = snake->head;
HEAD_Y += dir_y[snake->DIRECTION];
HEAD_X += dir_x[snake->DIRECTION];
if(HEAD_Y == fy && HEAD_X == fx) return 1;
//在蛇长不为1时,下一个移动跟蛇运动方向相反
if(head->sub && HEAD_Y == head->sub->y && HEAD_X == head->sub->x){
if(HEAD_Y == head->y){
if(HEAD_X > head->x) HEAD_X = head->x - 1;
else HEAD_X = head->x + 1;
}
else{
if(HEAD_Y > head->y) HEAD_Y = head->y - 1;
else HEAD_Y = head->y + 1;
}
}
return 0;
}
void Move(Snake *snake)
{
int &FOOD_Y = snake->FOOD_Y;
int &FOOD_X = snake->FOOD_X;
int &HEAD_Y = snake->HEAD_Y;
int &HEAD_X = snake->HEAD_X;
Body *&head = snake->head;
Body *&tail = snake->tail;
//输出蛇头
move(HEAD_Y, HEAD_X);
printw("%c", snake->H);
vis[HEAD_Y][HEAD_X] = 1;
//如果有蛇身,输出之
if(head->sub){
move(head->sub->y, head->sub->x);
printw("#");
}
if(HEAD_Y == FOOD_Y && HEAD_X == FOOD_X){
New_Food(snake);//吃到食物
}
else{//什么都没有吃到
move(tail->y, tail->x);
printw(" ");
vis[tail->y][tail->x] = 0;
if(tail->pre){
Body *tmp = tail;
tail = tail->pre;
tail->sub = NULL;
free(tmp);
}
}
}
int main()
{
initscr();
curs_set(0);//隐藏物理指针
noecho();//不回显输入
box(stdscr, '|', '-');//画框
Snake snake1, snake2;
snake1.food = '$';
snake2.food = '*';
snake1.H = '@';
snake2.H = '+';
//两条蛇的初始化位置(小蛇放中间比较舒服)
int init1_y = LINES / 2;
int init1_x = COLS / 2 - 1;
int init2_y = LINES / 2;
int init2_x = COLS / 2 + 1;
vis[init1_y][init1_x] = 1;
//初始化两条蛇位置跟食物位置
Initialization(&snake1, init1_y, init1_x);
Initialization(&snake2, init2_y, init2_x);
keypad(stdscr, true);//开启键盘功能键
int key = 0;
key = getch();
while(1)
{
#if 0
if(kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
{
while(kbhit() != 0) //可能存在多个按键,要全部取完,以最后一个为主
key = getch(); //将按键从控制台中取出并保存到key中
}
#endif
if(KEY_UP == key) snake1.DIRECTION = 0;
else if(KEY_DOWN == key) snake1.DIRECTION = 1;
else if(KEY_LEFT == key) snake1.DIRECTION = 2;
else if(KEY_RIGHT == key) snake1.DIRECTION = 3;
else if('w' == key) snake2.DIRECTION = 0;
else if('s'== key) snake2.DIRECTION = 1;
else if('a' == key) snake2.DIRECTION = 2;
else if('d' == key) snake2.DIRECTION = 3;
else if(' ' == key){
while((key = getch()) != ' ');
key = 0;
}
//else if('p' == key) getch();
//getch();
//获取向前移动的坐标及判断是否跟蛇运动方向相反(一条长度不为1的运动着的蛇
//是有一个方向是不能走的)
int over1 = 0, over2 = 0;
over1 = Reverse_Direction(&snake1, snake2.FOOD_Y, snake2.FOOD_X);
over2 = Reverse_Direction(&snake2, snake1.FOOD_Y, snake1.FOOD_X);
//判断游戏是否结束
if(Judge_Kill(&snake1) || Judge_Kill(&snake2) || over1 || over2){
//释放内存,很重要
Free(snake1.head);
Free(snake2.head);
break;
}
//往各自的链表添加蛇身
Add(&snake1);
Add(&snake2);
//移动蛇及判断是否吃到另一条蛇的食物
Move(&snake1);
Move(&snake2);
refresh();
usleep(150*1000);//停留150毫秒
if(ERR != halfdelay(1)) key = getch();//在100毫秒内等待输入,如无输入,往下执行
//halfdelay(1);
//key = getch();
}
sleep(3);
endwin();
exit(0);
}
下面是修改后的代码,其中在Head函数中实时更新了两条蛇的长度显示:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <stdbool.h>
int X, Y; // 游戏边界
unsigned char smp_type; // 难度系数
unsigned int snake1_length = 3; // 蛇1长度
unsigned int snake2_length = 3; // 蛇2长度
// 其他函数声明
void Head(void);
void Frame(void);
void GotoXY(unsigned short hang, unsigned short lie);
void KeyState(void);
int main(void) {
// 其他代码...
while (1) {
// 其他代码...
while (1) {
KeyState();
// 更新蛇的长度
GotoXY(11, 34);
printf("%d", snake1_length);
GotoXY(12, 34);
printf("%d", snake2_length);
// 其他代码...
}
// 其他代码...
}
return 0;
}
// 其他函数实现...
在主函数中,声明了两个全局变量 snake1_length 和 snake2_length,分别用于存储两条蛇的长度。在游戏循环中,通过更新这两个变量,并在每次循环时更新显示,即可实现实时反映两条蛇的长度。修改后的代码只包含关键部分,你需要将其添加到原始代码中的适当位置。
请注意,由于在原始代码中没有提供蛇的长度更新的具体逻辑,你需要根据实际游戏逻辑进行相应的修改和更新。
加两个全局变量,实时存储长度,然后打印就可以了
按照以下修改下就可以了
在Head函数里,用两个全局变量g_length1和g_length2来存储两条蛇的长度,并用printf函数输出。
在CreatSnake和CreatSnake1函数里,每次创建一个节点时,就把对应的全局变量加一。
在Appand和Appand1函数里,每次增加一个节点时,也把对应的全局变量加一。
在Drop和Drop1函数里,每次消除一个节点时,就把对应的全局变量减一
要实时显示蛇的长度,可以定义一个全局的变量来记录当前蛇的长度,在其他处理过程中对这个变量进行更新,在你需要的head中实时读取这个变量的值就可以了。
挂壁与C语言贪吃蛇的代码,可以参考:
c语言版贪吃蛇游戏,C语言版贪吃蛇游戏:https://blog.csdn.net/weixin_30069591/article/details/117181679