sdnyzjzx 发表于 2011-1-4 20:47:17

可自定义蛇尾数量贪吃蛇

本帖最后由 sdnyzjzx 于 2011-1-4 21:02 编辑

学习汇编暂告一个段落了,学习了模块化编程的思想,重新写一遍贪吃蛇。代码中定义了变量Q记录蛇的尾巴数量,加入了Game Over ! 的检查,感觉比原来有所提高,贴出来请大家指点!int i,k,step;
int i,k,step;
int q=5;
int x,y;

_show(int *x,int *y)
{
step++;
gotoxy(10,2);
printf("X:%2dY:%2d",*(x+q+1),*(y+q+1));

gotoxy(70,2);
printf("Step:%d",step);
      
        gotoxy(*x,*y);        /* 去除尾部最后一节*/
      printf(" ");

      for(i=1;i<=q;i++)        /* 显示尾部*/
      {
      gotoxy(*(x+i),*(y+i));
      printf("*");
      }

      gotoxy(*(x+i),*(y+i));        /* 显示头部*/
      printf("%c",1);

      gotoxy(*(x+i),*(y+i));        /* 光标回到头部 */
}

_change(int *x,int *y)
{
        for(i=0;i<=q;i++)
        {
        *(x+i)=*(x+i+1);
        *(y+i)=*(y+i+1);
        }
}

_check(int *x,int *y)
{
        for(i=1;i<=q;i++)
        {
                if(*(x+i)==*(x+q+1) && *(y+i)==*(y+q+1))
                {
                k=0;
                break;
                }
                else
                {
                k=1;
                }
        }
        return k;
}

_help()
{
clrscr();
_lunkuo();
gotoxy(25,10);
printf("UP    --   W");
gotoxy(25,12);
printf("DOWN--   S");
gotoxy(25,14);
printf("LEFT--   A");
gotoxy(25,16);
printf("RIGHT --   D");
gotoxy(21,20);
printf("Press any key return ...");
getch();
return;
}

_lunkuo()
{
gotoxy(10,23);
printf("Esc -- exit");

gotoxy(40,23);
printf("F1 -- Help");

gotoxy(3,3);
for(i=1;i<=76;i++)
{
printf("-");
}

for(i=1;i<=19;i++)
{
gotoxy(3,i+3);
printf("|");
}

gotoxy(3,22);
for(i=1;i<=76;i++)
{
printf("-");
}

for(i=1;i<19;i++)
{
gotoxy(78,i+3);
printf("|");
}

}

main()
{
char c;

_star:       
clrscr();
printf("\nPlease input the number of snake tail:");
scanf("%d",&q);

_t:
clrscr();
step=-1;
_lunkuo();
      *x=*y=20;                /* 初始化蛇的位置 */
        for(i=1;i<=q;i++)
        {
        *(x+i)=*x;
        *(y+i)=*y-i;
        }
        *(x+q+1)=*(x+q);
        *(y+q+1)=*(y+q)-1;
      _show(x,y);

while(q)
{
   c=getch();
        if( *(x+q+1) >3 && *(x+q+1) < 78 && *(y+q+1) >3 && *(y+q+1) < 22)
        {
                _check(x,y);
                if(k==0)
                {
                goto _over;
                }
                else if(c==0x77)            /* up*/
              {
                _change(x,y);
                *(x+q+1)=*(x+q);
                *(y+q+1)=*(y+q)-1;
              _show(x,y);
                }
              else if(c==0x73)      /* down */
                {
                _change(x,y);
                *(x+q+1)=*(x+q);
                *(y+q+1)=*(y+q)+1;
                _show(x,y);
              }
                else if(c==0x61)               /*left */
              {
                _change(x,y);
                *(x+q+1)=*(x+q)-1;
                *(y+q+1)=*(y+q);
              _show(x,y);
              }
                else if(c==0x64)              /*right */
              {
                _change(x,y);
                *(x+q+1)=*(x+q)+1;
                *(y+q+1)=*(y+q);
              _show(x,y);
              }
                else if(c==0x3b)        /* Help*/
                {
                _help();
                goto _t;
                }
                else if(c==0x1b)        /* Quit */
              {
                break;
              }
           }
            else
           {
           goto _over;
        }
}
_over:
        clrscr();
        _lunkuo();
        gotoxy(30,13);
           printf("Game Over !");
            getch();
        gotoxy(26,16);
        printf("Do you want to try again (y/n)?");
        c=getch();
        printf("%c",c);
        if(c=='y'||c=='Y')
        {
        goto _star;
        }
        else
        {
        c=getch();;
        }
clrscr();
printf("\n======Thank you ! Welcom to try again ! Bye ...======");
}

ngm20 发表于 2011-1-6 09:58:42

挺有意思
有函数调用,也有用goto到标号的。。
用标号很有汇编的感觉,整个程序感觉用汇编的思维在写。。呵呵 

Nisy 发表于 2011-1-6 10:51:20

有待完善 等学完C了 可以再次优化下

Nisy 发表于 2011-1-6 10:51:23

有待完善 等学完C了 可以再次优化下

xie83544109 发表于 2011-1-8 20:16:39

/:good
不错,学习了
页: [1]
查看完整版本: 可自定义蛇尾数量贪吃蛇