贪吃蛇c语⾔逻辑思路,贪吃蛇编写思路及C语⾔源码
规则:每吃上⼀个点,就长⼤⼀点,不能撞墙或者撞上⾃⼰⾝体。
教训:在有限的空间⾥,可以贪吃,但是要注意安全哦。
这个游戏是我刚⼯作⼀年的时候写的,当时对C语⾔有了些了解,想做点东西,刚好看到同事的⼿机上有这个
游戏(那时我还没有⼿机呢,呵呵),觉得挺好玩,要实现的话也还⽐较简单,就在电脑上⽤TC上做出来了
。刚做出来的时候,那种喜悦,确实不是玩别⼈的游戏所能带来的。
这个程序是⼊门级别的,适合编程刚⼊门的朋友们试⼀试。⾼⼿达⼈们请跳过。
下⾯我简单说⼀下我的思路,理解下⾯⼏点会⽐较清楚⼀些。
1,基础:你⾸先要能画出⼀个带颜⾊的⽅块。举⼀反三:可以画⼀个就可以画很多个了。(TC中画⽅块⽤到了EGAVGA.BGI这个⽂件) 2,移动:⼀个⽅块消失,相邻地⽅⼀个⽅块出现,在视觉上就是移动了。
3,消失:⽤背景颜⾊在同样的地⽅画同样⼤⼩的⽅块。
4,相对坐标:视觉上像素这个单位太⼩,⽤⽅块的⼤⼩作为相对坐标的单位。
5,随机点:使⽤伪随机函数,参数⼀般⽤上系统当前时间,你再随意捏造个四则运算,就会产⽣出独⼀⽆⼆
的随机数了。
6,链表:这个是精髓啊,你看那蛇不是就像⼀个链表吗,这个可是我认为在这个游戏中使⽤的最⾼深的结构
了,呵呵。
7,长⼤:链表头遇上⼀个⾷物(随机产⽣的⽅块),链表上添加⼀个节点。
8,死亡:链表头撞上了⾃⾝或者撞墙。
也就这么多,理解了这⼏点,整个框架也就出来了。
下⾯就是源代码:
#include
#include
#include
#include
#define LEN sizeof(struct list)
#define uchar unsigned char
int n,sco,r,t,speed=8800;
uchar i,a,x1,y1,hit,long1=16,cycy=0,str1[200],xisu;
struct list
{ int x,y;
struct list * next,* last;
};
struct list * p1,* p2,* head,* eof1;
void
up(void); void down();
void
left(); void right();
void unit(uchar,uchar,uchar); void score();
void
dl(int); void save1();
void
load1(); void save(); main()
{ int driver=VGA,mode=VGAHI;
unsigned char ss[8];
initgraph(&driver,&mode,"c:\\tc");
setfillstyle(1,8);
setcolor(8);
bar(2,2,600,400);
setfillstyle(1,7); setcolor(7);
bar(117,117,170,140);
setfillstyle(1,8); setcolor(8);
bar(118,118,170,140);
setcolor(14);
sprintf(ss,"enter");
outtextxy(120,125,ss);
setcolor(0);
line(118,141,171,141);
line(118,142,172,142);
line(171,118,171,141);
line(172,118,172,142);
setfillstyle(1,14);
setcolor(14);
circle(15,15,10); sprintf(ss," fast"); outtextxy(30,15,ss); circle(15,55,10); sprintf(ss," normol");
outtextxy(30,55,ss);
circle(15,95,10); sprintf(ss," slow");
outtextxy(30,95,ss);
circle(15,15,6);floodfill(15,15,14);xisu=0;
do
{
a=getch();
if(a==9) { setcolor(14);setfillstyle(1,14);
a=8; xisu++;
circle(15,15+(xisu%3)*40,6);
floodfill(15,15+(xisu%3)*40,14);
setfillstyle(1,7); setcolor(7);
circle(15,15+((xisu-1)%3)*40,6);
floodfill(15,15+((xisu-1)%3)*40,7);
}
if((a==76)||(a==108)) { load1(); xisu=2;
goto
LOOP;
}
}
while(a!=13);
setcolor(8);
line(118,141,171,141); line(171,118,171,141); dl(speed);
p2=(struct list
*)malloc(LEN); hit=1; p1=p2; head=p2;
p2->x=20;
p2->y=20; p2->last=NULL; p2->next=NULL; rectangle(0,0,600,450);
setfillstyle(1,0); setcolor(0);
bar(1,1,599,449); setfillstyle(1,14);
setcolor(14);
speed=speed*(xisu%3+1);
for(i=0;i<15;i++) { p2=(struct list
*)malloc(LEN);
p2->x=21+i;
p2->y=20; unit(21+i,20,14);
p1->next=p2; p2->last=p1; p2->next=NULL;
p1=p2;
}
unit(head->x,head->y,14);
LOOP: while(1)
{ if(hit==1) { randomize();
x1=random(30);
y1=random(20);
x1=x1+3;
y1=y1+3;
p2=head;
p1=p2;
while(p1->next!=NULL)
{ if((x1==p2->x)&&(y1==p2->y)) {
x1=random(30)+3;y1=random(20)+3;p2=head;p1=p2; } else
{ p1=p2;
p2=p1->next;
}
}
unit(x1,y1,14);
hit=0;
}
if(kbhit()!=0)
a=getch();
switch(a) {
case 72 :
up(); break;
case 80 :
down(); break;
case 75 :
left(); break;
case 77 :
right(); break;
:
case 115:
dl(500); save1(); break; }
if(cycy==1)
break;
}
do
{
a=getch();
}
c语言游戏贪吃蛇源码
while((a>14)||(a<13));
closegraph();
}
void up(void)
{ p2=head->next;
p1=p2;
while(p1->next!=NULL)
{ if((head->x==p2->x)&&(head->y-1==p2->y))
{
score(); break;
}
else
{ p1=p2;
p2=p1->next;
}
}
if((hit==0)&&(head->x==x1)&&(head->y-1==y1)) { p2=(struct list *)malloc(LEN);
p2->x=x1;
p2->y=y1;
p2->next=head;
head->last=p2;
head=p2; hit=1;long1++;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论