鱼C论坛

 找回密码
 立即注册
查看: 2192|回复: 6

vc++制作贪吃蛇遇到的小问题,求解

[复制链接]
发表于 2014-9-1 00:07:20 | 显示全部楼层 |阅读模式
20鱼币
新人开始学做贪吃蛇,只做出了一小部分,这是直线控制移动的问题,
单独把第一行和最后一行的运行代码都行,组合起来就打不到想要的效果了,求各位大大帮一下

<P> #include<stdio.h>
#include<graphics.h>
#include<conio.h>
int main()
{
  int x,s,m,n,k,g;      //x为数组单元位置,进行([0],[1]),([2],[3])尾位置消除操作,与[2x+2][2x+3]进行头位置增加操作,
                    //s为标志位操作,s=-1时进行判定进入上下操作,s=1时进行进入左右操作
                    //当s=-1时,m进行上下偏移操作,当s=1,n进行左右偏移操作,
                    //k备用,进行循环判定时设定值for(k=0;k<100;k++)
  
  
  x=0;               //初值设定            
  s=1;
  m=0;
  n=0;
  k=0;               
  int a[1000];      //存储节点位置;直线的两个端点,开始坐标和结束坐标存放位置
  a[0]=100;
  a[1]=100;
  a[2]=200;
  a[3]=100;         //设定第一条直线,坐标为(100,100,100,200)由起始点指向下一点,方向向下</P>
<P>
printf("\n\n\n\n\n请按任意键进入画图界面\n\n\n\n\n\n");
getch();                 //按键进入画图界面
  initgraph(640,480);     //进入画图界面
 line(a[0],a[1],a[2],a[3]);         //第一个条直线起始位置</P>
<P> </P>
<P>  while(1)         //初始化结束,开始进入循环
  {
  Sleep(10);</P>
<P> </P>
<P>//第一条直线操作开始</P>
<P> Sleep(100);
   
   if(a[1]==a[3])       //判定==,要注意不是赋值=
   {
    s=1;          //进入左右操作
    if(a[0]>a[2])
    {   setcolor(BLACK);
          
            line(a[0],a[1],a[0]-1,a[3]);  
      a[0]=a[0]-1;       //   ←
     
    }
    else if(a[0]<a[2])
    { setcolor(BLACK);
   
            line(a[0],a[1],a[0]+1,a[3]);  
    a[0]=a[0]+1;       //   →
   
    }
  else                     //a[0]=a[2]
  {      x=x-1;
  for(k=0;k<=1000;k=k+2)
  {
   a[k+2]=a[k];
      a[k+1]=a[k+3];
  }
  }             //if的结束括号</P>
<P>   }</P>
<P>//第一条直线操作结束</P>
<P> </P>
<P>
//第x条直线操作开始
             
   if(kbhit())                               
   {  g=getch();                                 //如果成功键入则执行以下操作</P>
<P>      if((g==115)&&(s==1))                 //s键  ↓   原来进行左右操作现在才能进行上下操作
   {                             
        s=-1;                            //进入上下操作
        x=x+1;                           //进行存储操作
     a[2*x+2]=a[2*x];
     a[2*x+3]=a[2*x+1]+1;
     setcolor(WHITE);
              line(a[2*x],a[2*x+1],a[2*x+2],a[2*x+3]);
   }</P>
<P>        if((g==119)&&(s==1))                  //w键  ↑  原来进行左右操作现在才能进行上下操作
  {                             
        s=-1;                            //进入上下操作
        x=x+1;                           //进行存储操作
     a[2*x+2]=a[2*x];
     a[2*x+3]=a[2*x+1]-1;
     setcolor(WHITE);
              line(a[2*x],a[2*x+1],a[2*x+2],a[2*x+3]);
   }</P>
<P> </P>
<P>  
   if((g==100)&&(s==-1))                  //d键  → 
  {                             
        s=1;                            //进入左右操作
        x=x+1;                           //进行存储操作
     a[2*x+2]=a[2*x]+1;
     a[2*x+3]=a[2*x+1];
     setcolor(WHITE);
              line(a[2*x],a[2*x+1],a[2*x+2],a[2*x+3]);
   }</P>
<P>
   if((g==97)&&(s==-1))                  //a键  ← 
  {                             
        s=1;                            //进入左右操作
        x=x+1;                           //进行存储操作
     a[2*x+2]=a[2*x]-1;
     a[2*x+3]=a[2*x+1];
     setcolor(WHITE);
              line(a[2*x],a[2*x+1],a[2*x+2],a[2*x+3]);
   }</P>
<P>
   }                     
   </P>
<P> </P>
<P>   else                  //没有键入,自动执行以下操作
   {
          if(a[2*x]==a[2*x+2])          //进入上下操作
   {    s=-1;              </P>
<P>      if(a[2*x+1]>a[2*x+3])       
   {    
    setcolor(WHITE);
    a[2*x+3]=a[2*x+3]-1;        //   ↑
    line(a[2*x],a[2*x+1],a[2*x+2],a[2*x+3]);  
              
    }</P>
<P>  else  if(a[2*x+1]<a[2*x+3])       
  {    
   setcolor(WHITE);
    a[2*x+3]=a[2*x+3]+1;        //   ↓
    line(a[2*x],a[2*x+1],a[2*x+2],a[2*x+3]);  
              
    }
  
   }
   </P>
<P>   if(a[2*x+1]==a[2*x+3])          //进入左右操作
   {
    s=1;          
    if(a[2*x]>a[2*x+2])
    {     
     setcolor(WHITE);
    a[2*x+2]=a[2*x+2]-1;            //   ←
            line(a[2*x],a[2*x+1],a[2*x+2],a[2*x+3]);   
    }
    else  if(a[2*x]<a[2*x+2])
    {     
     setcolor(WHITE);
    a[2*x+2]=a[2*x+2]+1;            //   →
          line(a[2*x],a[2*x+1],a[2*x+2],a[2*x+3]); 
    }
 </P>
<P>   }
            
   }                 </P>
<P>
        </P>
<P>//第x条直线操作结束</P>
<P> </P>
<P> </P>
<P>  }               //while(1)的结束括号</P>
<P>
 closegraph();   //退出画图界面</P>
<P>}               //主函数结束括号</P>

最佳答案

查看完整内容

我以前做了一个 是用的小格子 你试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-1 00:07:21 | 显示全部楼层
我以前做了一个 是用的小格子 你试试
未命名.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-1 17:52:34 | 显示全部楼层
我现在也正在做贪食蛇呢,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-9-1 19:00:47 From FishC Mobile | 显示全部楼层
流行语 发表于 2014-9-1 17:52
我现在也正在做贪食蛇呢,

我没有用堆栈做,才做了控制直线移动部分就卡了快一周,感觉好难,都快看晕了:sweat:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-1 20:19:40 | 显示全部楼层
我现在正在想怎么做呢,还没有思路呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-9-2 10:45:18 From FishC Mobile | 显示全部楼层
流行语 发表于 2014-9-1 20:19
我现在正在想怎么做呢,还没有思路呢

你可以尝试着做一条通过按键可以自由控制的直线,通过按键是否输入来进行判定,还要有尾部一点的消除和前进方向的增加,反正我是一小个模块一个个测试的,但是作为新手,基础太薄弱了,结构体不是很熟悉,要不就不要那么蛋疼了,好像论坛上就有贪吃蛇的代码,你可以看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-29 21:59:22 | 显示全部楼层
我做过一个,但是实现方法不一样.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 09:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表