回 帖 发 新 帖 刷新版面

主题: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个回复)

11 楼

厉害拿回去研究 呵呵[em5][em6][em11]

12 楼

希望加点注释.

13 楼

aliu:

     你说提示打不开文件mouse.h.
实在不行你可以把#include"mouse.h"去掉,然后把mouse.h中的内容放在程序中的合适的地方,

14 楼

真棒!!!
你们几年经验了??

15 楼

楼主我早就自己像那样做了,你的游戏很好玩。如果能和电脑打,那就更棒了!
还有你的游戏里面的球,当两个球挨得很近时可以重叠一部分,你肯定知道是什么意思!你可以改进一下。
    如果你是业余的爱好者,你是绝对的高手,应该向你好好学习!

16 楼

aliu:
  你很细心,其实这个问题我也发现了,出现这个问题的原因是这样:
  当一个球有一定的速度时,在每次循环中其位置:X,Y将有一个增量dx,dy,当速度比较快时,dx,dy将比较大,最大可达到6以上,也就是说,最快时一次可移动6个象素,这时就会出现这种情况:在某次循环中,两 个球还没有相撞,但在下一次中,它的位置移动了6个象素,
这样有可能会出现交差;解决的办法是限止dx,dy 的最大值,如不超过1。但这样的话球的速 度就会很慢,也许是我的图形处理的方法不好所以才很慢。
     我现在是大三的学生,大一时学过C 语言,对编程很有兴趣,所以经常编一些程序。
希望大家多指教。

17 楼

长~~~~~~~~~~~~

18 楼

上面的程序需要一个mouse.h的头文件,
将以下内容保存为 mouse.h放在TC的include目录下即可.楼主我按你说的方法去做怎么提示打不开文件mouse.h.请楼主回复一下,麻烦你了,谢谢!

你重新编辑啦
或许是你的mouse.h文件搞错了,
照上面的,
把内容复制到一个记事本中。
再把记事本改名为mouse.h就可以了。
注意是连文件扩展出名一起改哦。

19 楼

一个字  强!

20 楼

楼主,我是几天前才发现你的游戏的,玩了几次,发现点小问题,就是有时白球打不住球,明明描的时候都挨着大半块了,但最后还是没有动。有点可惜。还有白球不能想正常中的一样沿着边沿穿过中洞,会掉入中袋的。希望能改进

我来回复

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