关于C语言写贪吃蛇时,蛇的身体以及移动该怎么写

作者&投稿:裴享 (若有异议请与网页底部的电邮联系)
c语言贪吃蛇怎么让蛇自己动起来啊?~

#define N 200
#include
#include
#include
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;/*得分*/
int gamespeed=50000;/*游戏速度自己调整*/
struct Food
{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死亡*/
}snake;
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void DrawK(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/
void main(void)
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\c");
cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
for(i=50;i<=600;i+=10)/*画围墙*/
{
rectangle(i,40,i+10,49); /*上边*/
rectangle(i,451,i+10,460);/*下边*/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10); /*左边*/
rectangle(601,i,610,i+10);/*右边*/
}
}
/*玩游戏具体过程*/
void GamePlay(void)
{
randomize();/*随机数发生器*/
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇头*/
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes==1)/*需要出现新食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;/*画面上有食物了*/
}
if(food.yes==0)/*画面上有食物了就要显示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case 1:snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break;
}
for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*显示失败*/
snake.life=1;
break;
}
}
if(snake.x[0]595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/
}
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes=1;/*画面上需要出现新的食物*/
score+=10;
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/
for(i=0;i<snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
} /*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循环*/
break;
key=bioskey(0);/*接收按键*/
if(key==ESC)/*按ESC键退出*/
break;
else
if(key==UP&&snake.direction!=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1;
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2;
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/
}
/*游戏结束*/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
/*输出成绩*/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
/*图形结束*/
void Close(void)
{
getch();
closegraph();
}

自动移动可以通过定时器实现。
每个定时周期蛇头往移动方向移动一个位置,比如往左,x减一。后面的蛇身移动到前一个之前的位置。

只要记住一点,只有蛇头才会每次赋予新的坐标,之后的身体都是copy前一个节点的坐标,链表结构里应该有x,y坐标信息,我以前就是这么做的,可行

我写过,我的策略就是蛇的链表删去尾节点,并根据蛇当前移动的方向增加头节点! 再显示出来,看起来就移动一格了。

我写了一个不过在多线程下貌似有BUG

表示尝试过,不会

1、获得移动方向矢量(Dx,Dy)(其中,Dx,Dy值分别为1,0,-1三个值中的一个)

2、在贪吃蛇数据链表中增加新的头结点:
Head.x=Head.x+Dx; Head.y=Head.y+Dy
原Head节点变为第二节点,原第二节点变为第三节点,原第三节点变为第四节点...
如果不仅仅是三个节点,则依次类推
判断最后一个节点,命名为Last

3、判断如果是否吃到食物,
如吃到食物,则不操作
如未吃到食物,则将执行尾节点删除:Last.Delete
即可
4、按照最新的链表更新节点位置的显示

上述动作的循环,即可得到贪吃蛇移动、吃食物等连续动作


C语言贪吃蛇如何判断边界啊?
只能强行枚举边界。第一种情况:(蛇头横坐标<边界左端坐标&&蛇身体的第二个坐标在头的右方),那么蛇就碰到了左边界。第二种情况:(蛇头横坐标>边界右端坐标&&蛇身体的第二个坐标在头的左方),那么蛇就碰到了右边界。第三种情况:(蛇头纵坐标<边界上端坐标&&蛇身体的第二个坐标在头的下方),那么蛇...

在c语言中,写一个贪吃蛇程序,请问贪吃蛇的自动移动函数怎么写
自动移动可以通过定时器实现。每个定时周期蛇头往移动方向移动一个位置,比如往左,x减一。后面的蛇身移动到前一个之前的位置。

c语言贪吃蛇当地图是用数组写得后,随机产生食物怎么写?
地图假设格点N个,取random() * N的格点上有食物;此处要避免出现在蛇身上即可

在dos环境下c语言编程编一个贪吃蛇游戏
印模花道 采纳率:21% 擅长: 交通出行 其他回答 54444445 19890213zz | 发布于2011-01-12 举报| 评论 0 6 为您推荐: c语言程序 贪吃蛇c语言代码 贪吃蛇编程代码量300 c语言入门自学 c语言 贪吃蛇 c语言编程游戏 贪吃蛇c语言背景 c语言入门贪吃蛇 dos命令 怎么玩dos贪吃蛇 其他...

贪食蛇游戏,c语言怎么实现多线程, 高悬赏
另外一个控制贪吃蛇移动的时候也要加锁 while(...){ char c;pthread_mutex_lock(&mutex);c = direction;pthread_mutex_unlock(&mutex);switch(c){ ...} ...} 这样就好了 注意你的控制贪吃蛇移动的部分也必须要放在另外一个pthread 里面执行,如果放在主线程, 主线程会一直等listen_keyboard_inp...

贪吃蛇游戏的C语言编程
include <windows.h> include <ctime> include <iostream> include <vector> include <queue> using namespace std;ifndef SNAKE_H define SNAKE_H class Cmp { friend class Csnake;int rSign; \/\/横坐标 int lSign; \/\/竖坐标 public:\/\/ friend bool isDead(const Cmp& cmp);Cmp(int r,int...

用C语言写贪吃蛇的代码,怎么让蛇不能反向走呢?大神在哪里??部分代码如下...
墙有坐标撒,以左下角为坐标原点,蛇每走一步加入判断:蛇方向是上,判断蛇头的位置是否与右上角的纵坐标相等,相等就是撞墙;其他方向类似。蛇的身体是一个(x,y)的一系列坐标链表,每走一步除了判断墙体,再判断蛇头的坐标-反向坐标,与坐标集合的第二个节点相比,是否相等,相等就是反向操作;再...

c语言贪吃蛇转向问题
程序开始->屏幕中心产生一个“蛇”->得到按键命令后移动->计时器++time后,按照上次得到的按键命令方向移动->得到新按键命令转向->得到新“身体”->撞墙(自身)结束游戏 产生蛇:屏幕确定地点选取三个位置,放置三个Body,在第一次接收按键时确定”头“坐标(x0,y0)。头:*fount指向null的节点 移动...

c语言贪吃蛇源代码怎么用?
C语言贪吃蛇源代码必须经过相应的C\/C++编译器编译成EXE文件后才能运行。 由于我们通常使用的操作系统是Windows系统,而在该系统下最长用的C\/C++编译器是VC++编译器,目前在大专院校常用的版本还是VC++6.0 下面就以VC++6.0来说明编译过程: 1.在VC++6.0中通过“File”菜单下的 “Open”子菜单打开贪吃蛇代码 2.在VC++...

用C语言来编写贪吃蛇代码时,贪吃蛇的构思是怎样的?
这是个输入输出同时进行的程序 要调用DOS中断功能(键盘中断)可以参考浙江大学出版的《C语言高级程序设计》

柯坪县13849657229: 关于C语言写贪吃蛇时,蛇的身体以及移动该怎么写 -
毋缸复方: 1、获得移动方向矢量(Dx,Dy)(其中,Dx,Dy值分别为1,0,-1三个值中的一个)2、在贪吃蛇数据链表中增加新的头结点:Head.x=Head.x+Dx; Head.y=Head.y+Dy 原Head节点变为第二节点,原第二节点变为第三节点,原第三节点变为第四节点...如果不仅仅是三个节点,则依次类推 判断最后一个节点,命名为Last3、判断如果是否吃到食物,如吃到食物,则不操作 如未吃到食物,则将执行尾节点删除:Last.Delete 即可4、按照最新的链表更新节点位置的显示 上述动作的循环,即可得到贪吃蛇移动、吃食物等连续动作

柯坪县13849657229: 求份详细的贪吃蛇课程设计报告
毋缸复方: 贪吃蛇游戏----《C程序设计课程设计》 一、 设计要求 编写C语言程序实现贪吃蛇游戏,贪吃蛇游戏是一个深受人们喜欢的游戏:一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过键盘上的四个光标键控制蛇向上下左右四个方向移动,...

柯坪县13849657229: C语言写贪吃蛇 -
毋缸复方: #include <stdio.h> #include <graphics.h> #include <stdlib.h> #include <dos.h> /*引用的库函数*/ #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b/*宏定义键名*/ #define N 200 int i,key; ...

柯坪县13849657229: 贪吃蛇游戏 - ---《C程序设计课程设计》 -
毋缸复方: // Snake.h : main header file for the SNAKE application // #if !defined(AFX_SNAKE_H__2EBD7F04_452B_11D7_B6CA_0050BAE90E03__INCLUDED_) #define AFX_SNAKE_H__2EBD7F04_452B_11D7_B6CA_0050BAE90E03__...

柯坪县13849657229: c语言 贪吃蛇 程序 -
毋缸复方: /* 贪吃蛇程序 by champking */#define N 200#include <graphics.h>#include <stdlib.h>#include <dos.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b int i,key; int score = 0;/*得分*/ int ...

柯坪县13849657229: 用c++写贪吃蛇,蛇如果碰到自己身体就死亡的代码怎么编啊? -
毋缸复方: 蛇头的位置如果和蛇身序列的任一位置重合,即死展开全部

柯坪县13849657229: 单片机贪吃蛇用C语言编程怎么实现蛇吃完食物后蛇头和蛇尾互换 -
毋缸复方: 蛇身应该是数组或链表吧,取它们的倒序,前进方向相反就行了

柯坪县13849657229: 求C语言贪吃蛇思路.. -
毋缸复方: 楼上正解,蛇在移动时,其实蛇尾是用与背景色相同的蛇身覆盖的

柯坪县13849657229: C语言简易课程设计贪吃蛇 -
毋缸复方: #define N 200 #include <graphics.h> #include <stdlib.h> #include <dos.h> #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b int i,key; int score=0;/*得分*/ int gamespeed=50000;/*游...

柯坪县13849657229: 求贪吃蛇C语言代码,有一定功能要求 -
毋缸复方: 以下是代码/* 贪吃蛇程序 by champking */#define N 200#include <graphics.h>#include <stdlib.h>#include <dos.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b int i,key; int score = 0;...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网