贪吃蛇c语言判断没有输入,贪吃蛇问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#include

#include

#include

#include

#include

struct Body//定义蛇身结构体

{

short x,y;//蛇身的坐标

struct Body *next;//指向下一个蛇身的指针

};

struct Body *head;//蛇头指针

int length=sizeof(struct Body);//Body结构体所占字节数

int Delay=500;//每次移动之后的停顿时间

short X=0,Y=0;//判断蛇每次移动

short food_x,food_y,food=0;//食物坐标与是否有食物

short life=1;

short score=0;

char movdir='R';//蛇头方向'U'-up,'D'-down,'L'-left,'R'-right

short lockdelay=20;

void Loc(int, int);//光标定位函数

void Beginning();//开始界面

void CreatMap();//创建地图

void GameInit();//游戏初始化

void GameStart();//游戏开始

void DeadOrNo();//蛇的生命

char DeadOrNoByPos(int, int);//蛇的生命

void JudgeFood();

void MakeFood();//制造食物

void ThroWall();//蛇可穿墙

void SnakeMove();//蛇的移动和下面两个函数一起运用

void MoveNo(struct Body *p_body,struct Body *nofood);//没有食物时蛇的移动

void MoveYes(struct Body *yesfood);//有食物时蛇的移动

void DrawSnake(char);//画蛇

void Ending();//结束界面

void HiSleep(int);

int main(void)//主函数

{

srand((unsigned int)time(NULL));//随即种子

again:;

Beginning();//开始欢迎界面

GameInit();//界面初始化

GameStart();//游戏开始

Ending();//结束界面

while(1)

{

if(kbhit())

getch();

else

break;

}

if(getch()!=27)//按ESC键退出游戏(蛇死亡之后)

goto again;

Loc(25,24);

return 0;

}

void Beginning()//开始界面

{

int initx=14,inity=11,init=2;//下面printf字开始右移的初始位置,init代表左右方向

char ch1='\0';

time_t start,end;

}

void CreatMap()//创造地图

{

int i;

for(i=0;i<=56;i+=2)//上下边框

{

Loc(i,0);

printf("□");

Loc(i,24);

printf("□");

}

for(i=0;i<=24;i++)//左右边框

{

Loc(0,i);

printf("□");

Loc(56,i);

printf("□");

}

}

void GameInit()//游戏初始化,创建链表与初始化蛇身,初始化地图

{

struct Body *p_cur,*p_new;//定义四个蛇身指针

int xh;

CreatMap();

head=(struct Body *)malloc(length);

head->x=12;head->y=2;

p_cur=head;

p_cur->next=NULL;

for(xh=0;xh<3;xh++)

{

p_new=(struct Body *)malloc(length);

p_cur->next=p_new;

p_new->x=p_cur->x-2;

p_new->y=p_cur->y;

p_cur=p_new;

p_cur->next=NULL;

}

Delay=500;

food=0;

life=1;

score=0;

movdir='R';

lockdelay=20;

DrawSnake(0);

Loc(65,3);

puts("每吃一个");

Loc(64,4);

puts("蛇会加速哦");

Loc(61,13);

puts("控制键: ↑←↓→");//不会变的游戏提示

}

void GameStart()//游戏开始

{

while(1)

{

DeadOrNo();

if(life==0)//当生命为0时蛇死亡,退出游戏

break;

MakeFood();//制造食物

if(GetAsyncKeyState(VK_UP)&&movdir!='D'&&movdir!='U')//四个if判断是否有方向键输入

movdir='U';

else if(GetAsyncKeyState(VK_DOWN)&&movdir!='U'&&movdir!='D')

movdir='D';

else if(GetAsyncKeyState(VK_LEFT)&&movdir!='R'&&movdir!='L')

movdir='L';

else if(GetAsyncKeyState(VK_RIGHT)&&movdir!='L'&&movdir!='R')

movdir='R';

SnakeMove();//蛇的移动,每次移动一格

Loc(62,7);

printf("得分: %3d",score);//定位,打出所得分数

Loc(62,10);

printf("速度: %5.1f",1000.0/(float)Delay);//定位,打出即时速度,越小越快

HiSleep(Delay);//刷新一次的速度

}

}

void DeadOrNo()//判断蛇死没死

{

struct Body *p_body=head;

while(p_body->next!=NULL)//定位到最后一个蛇身

{

p_body=p_body->next;

if(p_body->x==head->x&&p_body->y==head->y)//如果有任何一个蛇身坐标与蛇头重合,蛇即死亡

life=0;

}

}

char DeadOrNoByPos(int x, int y)

{

struct Body *p_body=head;

while(p_body->next!=NULL)//定位到最后一个蛇身

{

if(p_body->x==x&&p_body->y==y)//如果有任何一个蛇身坐标与蛇头重合,蛇即死亡

return 1;

p_body=p_body->next; //假设情况,忽略蛇尾

}

return 0;

}

void JudgeFood()//判断食物是否与蛇身重叠

{

struct Body *p_body=head;//指向蛇头

while(p_body!=NULL)//当p_body指向最后一节跳出

{

if(food_x==p_body->x&&food_y==p_body->y)//如蛇身与食物重叠则在制造一个食物

{food=0;Loc(62,8);MakeFood();}

p_body=p_body->next;

}

}

void MakeFood()//制造食物

{

if(food==0)

{

food_x=rand()%53+2;

food_y=rand()%23+1;

if(food_x%2==1)

food_x++;//如果坐标为奇数,变为偶数坐标

food=1;

JudgeFood();

}

}

void ThroWall(struct Body *p)//穿墙

{

if(p->x==56)//右进左出

p->x=2;

if(p->x==0)//左进右出

p->x=54;

if(p->y==0)//上进下出

p->y=23;

if(p->y==24)//下进上出

p->y=1;

}

void SnakeMove()//蛇的移动与吃食物,其实就这段最难写

{

struct Body *p_body;//临时结构指针

struct Body *nofood;//没食物

struct Body *yesfood;//有食物

struct Body tmppos;

switch(movdir)

{

case 'U':X=0;Y=-1;break;

case 'D':X=0;Y=1;break;

case 'L':X=-2;Y=0;break;

case 'R':X=2;Y=0;break;

}

tmppos=*head;

tmppos.x+=X;

tmppos.y+=Y;

ThroWall(&tmppos);

if(DeadOrNoByPos(tmppos.x,tmppos.y))

{

if(lockdelay<=0)

life=0;

else

lockdelay--;

}

else

{

lockdelay=(1000/Delay)+1;

if(tmppos.x==food_x&&tmppos.y==food_y)//下一格有食物

MoveYes(yesfood);

else

{

nofood=(struct Body *)malloc(length);//为没食物分配空间

MoveNo(p_body,nofood);

}

}

DrawSnake(1);//画蛇

Loc(food_x,food_y);

printf("●");

}

void MoveYes(struct Body *yesfood)//有食物的移动

{

yesfood=(struct Body *)malloc(length);//每次调用都要为其分配空间,因为每次吃到了食物蛇身会长一节,必须为蛇身在分配一个空间

yesfood->x=food_x;

yesfood->y=food_y;

yesfood->next=head;//新结构拥有了蛇吃完食物的空间

head=yesfood;//在赋给头指针

food=0; score+=1; //加分

MakeFood();//制造食物

}

void MoveNo(struct Body *p_body,struct Body *nofood)//没食物的移动

{

nofood->x=head->x+X;

nofood->y=head->y+Y;

ThroWall(nofood);

nofood->next=head;

head=nofood;//同上

p_body=head;

while((p_body->next)->next!=NULL)//使p_body指向倒数第二个蛇身

p_body=p_body->next;

Loc((p_body->next)->x,(p_body->next)->y);//定位到最后一节蛇身

printf(" ");//消除蛇身

free(p_body->next);//释放空间

p_body->next=NULL;//使倒数第二节成为新的蛇尾

}

void DrawSnake(char simple)//画出蛇头到蛇尾

{

int drawcount=0;

struct Body *p_body=head;//指向蛇头

while(p_body!=NULL)//当p_body指向最后一节跳出

{

Loc(p_body->x,p_body->y);

printf(p_body==head?"■":"□");

drawcount++;

p_body=p_body->next;

if(simple&&drawcount==2)

break;

}

}

void Ending()//结束界面

{

int num=0;

char str[]={"Thank you for playing the snaKe game! "};

system("cls");

Loc(32,9);printf("Game Over!!");

while(str[num]!='\0')

{

Loc(20+num,11);

putchar(str[num]);

num++;

HiSleep(100);

}

Loc(28,13);

puts("按ESC键退出");

Loc(30,15);

puts("按任意键重来...");

}

void Loc(int x, int y)//x为列坐标,y为行坐标,这个不用说了吧~

{

COORD pos = {x,y};

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleCursorPosition(hOut, pos);

}

void HiSleep(int ms)

{

int x;

x=clock();

while(clock()-x

//Sleep(0);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值