回 帖 发 新 帖 刷新版面

主题:turboc2.0下的台球游戏

/*运行环境 TC2.0
  w,s,a,d控制方向,  逗号和句号控制力量,空格发杆

本来还可用鼠标控制,因为要用一个"mouse.h",所以去掉了,
如有人想要带鼠标的可与我连系*/



#include<stdio.h>
#include<graphics.h>
#include<conio.h>

#include<math.h>
#define PATH "d:\\学习\\turboc2"/*改为你的TC目录*/
#define pi 3.141593
#define r 10.0
#define zero 0.01
#define BC 0

struct balltype
{
   float x,y;
   float dx,dy;
   int flag;
}ball[16];

int cx=320-5*r,cy=240;
float power=15.0;
int flag=1,player=0,chang=0;
int hole[6][2]=
    {
     {17,92},  {320,92},   {623,92},
     {17,388}, {320,388},  {623,388}
    };
int plball[2]={0,0},ex=1;
/**************************/
void drawtable();
/********************************/
void drawpow()
{
   int i;
   gotoxy(27,4);
   printf("power==[");
   for(i=0;i<power;i++)printf(">");
   for(i=20-power;i>0;i--)printf("-");
   printf("]");
}
/********************************/
void drawpl()
{
  gotoxy(2,4);
  printf("[Player %d]",player+1);
  if(plball[player])printf("<%d--%d>",plball[player],plball[player]+6);
}
/*************/
void bound(int b1,int b2)
{
  float s1=100,s2=100,s,x,y,dx1,dx2,dy1,dy2,d1,d2;
  if(b2==16)
  {
    ball[b1].dx=-ball[b1].dx;
  }
  else if(b2==17)
  {
    ball[b1].dy=-ball[b1].dy;
  }
  else
  {
    x=ball[b2].x-ball[b1].x;
    y=ball[b2].y-ball[b1].y;
    if(!(fabs(ball[b1].dx)<zero&&fabs(ball[b1].dy)<zero))
    {
       s1=atan2(ball[b1].dy,ball[b1].dx);

    }
    if(!(fabs(ball[b2].dx)<zero&&fabs(ball[b2].dy)<zero))
    {
       s2=atan2(ball[b2].dy,ball[b2].dx);

    }
    s=atan2(y,x);


    d1=sqrt(pow(ball[b1].dx,2)+pow(ball[b1].dy,2))*cos(s-s1);
    d2=sqrt(pow(ball[b2].dx,2)+pow(ball[b2].dy,2))*cos(pi-(s-s2));
    dx1=d1*cos(s);
    dx2=d2*cos(pi-s);
    dy1=d1*sin(s);
    dy2=d2*sin(pi-s);
    if(s1!=100&&fabs(s-s1)<pi/2)
    {
      ball[b1].dx-=dx1;
      ball[b1].dy-=dy1;
      ball[b2].dx+=dx1;
      ball[b2].dy+=dy1;
    }
    if(s2!=100&&fabs(s-s2)>pi/2)
    {
      ball[b1].dx+=dx2;
      ball[b1].dy+=dy2;
      ball[b2].dx-=dx2;
      ball[b2].dy-=dy2;
    }
  }
  ball[b1].dx*=0.97;
  ball[b1].dy*=0.97;
  ball[b2].dx*=0.97;
  ball[b2].dy*=0.97;

}
/*******************/
void close()
{
  int i;
  for(i=0;i<16;i++)
  {


  }
}
/*******************/
int getkey()
{
char ch=0;
if(kbhit())
   ch=getch();
return(ch);
}
/************/
void drawball(int i,int flag)
{
  char nc[5];
  if(flag==0)
     setcolor(BC);
  else
  {
     if(i==0)setcolor(WHITE);
     else if(i<8)setcolor(4);
     else if(i==8)setcolor(8);
     else setcolor(2);
  }
      circle(ball[i].x,ball[i].y,r);
      itoa(i,nc,10);
      outtextxy(ball[i].x-6,ball[i].y-3,nc);

}
/*********************/
void drawtable()
{  char p[10],pp[20];
   int i;
   setcolor(14);
   rectangle(5,80,635,400);
   setfillstyle(8,2);
   for(i=0;i<6;i++)
   {
       circle(hole[i][0],hole[i][1],12);
       floodfill(hole[i][0],hole[i][1],14);
   }
   for(i=0;i<16;i++)
   {
      if(ball[i].flag==1)continue;
      else
      {
         ball[i].x=90+i*30;
     ball[i].y=440;
     drawball(i,1);
      }
   }
   drawpow();
   drawpl();
}

/******************/
void go()
{
  float s;
  flag=0;
  chang=1;

  setcolor(BC);
  line(ball[0].x,ball[0].y,cx,cy);
  circle(cx,cy,r);
  line(cx-r,cy,cx+r,cy);
  line(cx,cy-r,cx,cy+r);

  s=atan2(cy-ball[0].y,cx-ball[0].x);

  ball[0].dx=(power/2.5)*cos(s);
  ball[0].dy=(power/2.5)*sin(s);
}
/***************************/
void win(int i)
{
   gotoxy(30,13);
   printf("Player %d win the game!",i+1);
   gotoxy(30,14);
   printf("Press anykey to exit.");
   ex=0;
}
/************************/
void ok(int b)
{
   int i,m=0;
   if(b==8)
   {
     if(plball[player]==0)win(!player);
     else
     {
        for(i=plball[player];i<plball[player]+7;i++)
        {
        if(ball[i].flag!=1)
            {
                m=1;
                break;
            }
        }
    if(!m)win(!player);
    else win(player);
    }
  }
  else if(b==0)
  {
     chang=2;
  }
  else if(plball[player]==0)
  {
      if(b>0&&b<8){plball[player]=1;plball[!player]=9;}
      else if(b>8&&b<16){plball[player]=9;plball[!player]=1;}
      chang=0;
  }
}
/************************/


void main()
{
  int gdriver=DETECT,gmode;
  int i,j,ff=1,k;
  char nc[5];


  initgraph(&gdriver,&gmode,PATH);
  setbkcolor(BC);


  ball[0].x=160;
  ball[0].y=240;
  ball[0].dx=0;
  ball[0].dy=0;

  ball[2].x=480+(r+1);
  ball[2].y=240-3*(r+1);
  ball[2].dx=0;
  ball[2].dy=0;

  ball[1].x=480+3*(r+1);
  ball[1].y=240+4*(r+1);
  ball[1].dx=0;
  ball[1].dy=0;

  ball[3].x=480-(r+1);
  ball[3].y=240+2*(r+1);
  ball[3].dx=0;
  ball[3].dy=0;

  ball[4].x=480-3*(r+1);
  ball[4].y=240-(r+1);
  ball[4].dx=0;
  ball[4].dy=0;

  ball[5].x=480-5*(r+1);
  ball[5].y=240;
  ball[5].dx=0;
  ball[5].dy=0;

  ball[6].x=480+3*(r+1);
  ball[6].y=240-2*(r+1);
  ball[6].dx=0;
  ball[6].dy=0;

  ball[7].x=480+(r+1);
  ball[7].y=240-(r+1);
  ball[7].dx=0;
  ball[7].dy=0;

  ball[8].x=480-(r+1);
  ball[8].y=240;
  ball[8].dx=0;
  ball[8].dy=0;

  ball[9].x=480+(r+1);
  ball[9].y=240+(r+1);
  ball[9].dx=0;
  ball[9].dy=0;

  ball[10].x=480+3*(r+1);
  ball[10].y=240+2*(r+1);
  ball[10].dx=0;
  ball[10].dy=0;

  ball[11].x=480+3*(r+1);
  ball[11].y=240;
  ball[11].dx=0;
  ball[11].dy=0;

  ball[12].x=480-3*(r+1);
  ball[12].y=240+(r+1);
  ball[12].dx=0;
  ball[12].dy=0;

  ball[13].x=480-(r+1);
  ball[13].y=240-2*(r+1);
  ball[13].dx=0;
  ball[13].dy=0;

  ball[14].x=480+(r+1);
  ball[14].y=240+3*(r+1);
  ball[14].dx=0;
  ball[14].dy=0;

  ball[15].x=480+3*(r+1);
  ball[15].y=240-4*(r+1);
  ball[15].dx=0;
  ball[15].dy=0;


  for(i=0;i<16;i++)
  {
    drawball(i,1);
    ball[i].flag=1;

  }
  drawtable();
for(;ex;)
  {
     drawtable();
   for(i=0;i<5;i++)
   {
    switch(getkey())
     {
      case 27:
        goto end;
      case 'w':if(flag==1)
               {
                setcolor(BC);
        line(ball[0].x,ball[0].y,cx,cy);
        circle(cx,cy,r);
                line(cx-r,cy,cx+r,cy);
                line(cx,cy-r,cx,cy+r);
                cy--;
               }
                break;
      case 'W':if(flag==1)
               {
                setcolor(BC);
        line(ball[0].x,ball[0].y,cx,cy);
        circle(cx,cy,r);
                line(cx-r,cy,cx+r,cy);
                line(cx,cy-r,cx,cy+r);
                cy-=5;
               }
                break;
      case 'a':if(flag==1)
               {
                setcolor(BC);
        line(ball[0].x,ball[0].y,cx,cy);
        circle(cx,cy,r);
                line(cx-r,cy,cx+r,cy);
                line(cx,cy-r,cx,cy+r);
        cx--;
               }

                break;
      case 'A':
           if(flag==1)
               {
                setcolor(BC);
        line(ball[0].x,ball[0].y,cx,cy);
        circle(cx,cy,r);
                line(cx-r,cy,cx+r,cy);
                line(cx,cy-r,cx,cy+r);
        cx-=5;
               }

                break;
      case 's':if(flag==1)
               {
                setcolor(BC);
        line(ball[0].x,ball[0].y,cx,cy);
        circle(cx,cy,r);
                line(cx-r,cy,cx+r,cy);
                line(cx,cy-r,cx,cy+r);
        cy++;
                }
                break;
      case 'S':if(flag==1)
               {
                setcolor(BC);
        line(ball[0].x,ball[0].y,cx,cy);
        circle(cx,cy,r);
                line(cx-r,cy,cx+r,cy);
                line(cx,cy-r,cx,cy+r);
        cy+=5;
                }
                break;
      case 'd':if(flag==1)
               {
                setcolor(BC);
        line(ball[0].x,ball[0].y,cx,cy);
        circle(cx,cy,r);
                line(cx-r,cy,cx+r,cy);
                line(cx,cy-r,cx,cy+r);
                cx++;
                }
                break;
      case 'D':if(flag==1)
               {
                setcolor(BC);
        line(ball[0].x,ball[0].y,cx,cy);
        circle(cx,cy,r);
                line(cx-r,cy,cx+r,cy);
                line(cx,cy-r,cx,cy+r);
                cx+=5;
                }
                break;
      case ' ': if(flag==1)
               {
                 go();
                }
        break;
      case '.': power++;
                if(power>20)power=20;
                break;
      case ',': power--;
                if(power<0)power=0;
                break;

      default:break;
     }

   }
   if(flag==1)
   {
      setcolor(8);
      line(ball[0].x,ball[0].y,cx,cy);
      circle(cx,cy,r);
      line(cx-r,cy,cx+r,cy);
      line(cx,cy-r,cx,cy+r);
   }
    if(ball[0].flag==0)
   {
      ball[0].flag=1;
      drawball(0,0);
      ball[0].x=160;
      ball[0].y=240;
      ball[0].dx=ball[0].dy=0;
  aa: for(i=1;i<16;i++)
      if(ball[i].flag==1)
      {
         if((pow(fabs(ball[i].x-ball[0].x),2)+pow(fabs(ball[i].y-ball[0].y),2))<=4*r*r)
         {
            ball[0].x++;
            goto aa;
         }
      }
   }
   for(i=0;i<16;i++)
   {
      if(ball[i].flag==0)continue;
      drawball(i,0);
      ball[i].x+=ball[i].dx;
      if(ball[i].x<=5+r)
      {
     ball[i].x=5+r ;
         bound(i,16);
      }
      if(ball[i].x>=635-r)
      {
     ball[i].x=635-r;
         bound(i,16);
      }
      ball[i].y+=ball[i].dy;
      if(ball[i].y<=80+r)
      {
     ball[i].y=80+r  ;
         bound(i,17);
      }
      if(ball[i].y>=400-r)
      {
     ball[i].y=400-r  ;
         bound(i,17);
      }
      for(j=0;j<16;j++)
      if(j!=i&&ball[j].flag==1)
      {
       if((pow(fabs(ball[i].x-ball[j].x),2)+pow(fabs(ball[i].y-ball[j].y),2))<=4*(r+1)*(r+1))
       {
     if(!(fabs(ball[i].dx)<zero&&fabs(ball[i].dy)<zero&&fabs(ball[j].dx)<zero&&fabs(ball[j].dy)<zero))
     {
       bound(i,j);

     }
       }
      }

      if(ball[i].flag==1)drawball(i,1);

      ball[i].dx*=0.994;
      ball[i].dy*=0.994;
      if(fabs(ball[i].dx)<0.1&&fabs(ball[i].dy)<0.1)
      {
     ball[i].dx=ball[i].dy=0;
      }
      for(j=0;j<6;j++)
      {
    if((pow(fabs(ball[i].x-hole[j][0]),2)+pow(fabs(ball[i].y-hole[j][1]),2))<50)
    {

          ball[i].flag=0;
          drawball(i,0);
           if(plball[player]!=0&&chang!=2)
           {
             if(i>=plball[player]&&i<=plball[player]+6)chang=0;
           }
           ok(i);
       break;
    }
      }

   }
   ff=1;
   for(i=0;i<16;i++)
   {
      if(!(fabs(ball[i].dx)<0.05&&fabs(ball[i].dy)<0.05)&&ball[i].flag==1)
      {
     ff=0;
         break;
      }
   }
   if(ff)
   {
     flag=1;
     if(chang)player=!player;
     chang=0;
   }
}

end:  getch();
  close();
  closegraph();
}

回复列表 (共52个回复)

21 楼

是的,这个问题我已经发现了,不只是白球 ,有时其它球也会出现不能相撞的问题 ,
出现这个问题 的原因我也不清楚,请大空帮忙找一找,这最近比较忙,没时间改了。

你说白球不能象正常中的一样沿着边沿穿过中洞,会掉入中袋的:
你也看到了,中袋在桌面的里边,(实际中应在外面,而且底洞也应在靠外一点)我这样作是简化了设计,若要在
外面还要在边缘设计几个45度的反弹面,这样才能比较象真实的,由于作的比较仓促,事后也没有作什么修改,所以怎么简单怎么来 了。

22 楼

我靠,你真的很强呀
要达到你这样的水平起码要几年呀?
我也是学计算机的,现在还是刚开始学,希望能得到你的指点
不胜感激呀!!

23 楼

楼主写的不错,只是我要提点意见,你的程序写的太乱,不够模块化。没有注释,一般人很难理解。

24 楼

我运行了第一个用键盘操作的,但出现BGI错误,Graphic没有初始化,要我用initgraph,但没有这个东东。请问怎么解决?

25 楼

好了,修改了PATH的宏定义就好了!真是牛人!

26 楼

楼主  

用c语言编制“碰撞”原理
1小球在大圆内部直线运动;
2小球与大圆内径发生碰撞符合碰撞的原理(反射定律)进行运动;
3程序循环直到有键盘输入为止。

大虾,上面的程序怎么做呀
我在线急等!求你们了!!!!!
今天就要啊
比起你的程序简单多了,帮我编一个吧!!
谢谢谢谢谢谢谢谢谢谢!!!!!!!!!!!!!!

27 楼

谢谢啦

28 楼

学多久了啊,我才刚学,看来得向你学习啊!
这么多人给你回帖,我看你是看不到我的了,不过没关系,我回帖是为了日后和你交流方便找你,希望你不要停滞不前才好[font=楷体_GB2312]GB2312[/font][size=6]6[/size][color=008000]008000[/color]

29 楼

好强。

30 楼

其中碰撞的函数是哪个?

我来回复

您尚未登录,请登录后再回复。点此登录或注册