⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wuzi.cpp

📁 一个在tc3.0下面写的棋类游戏 很经典 值得好好研究
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		 mark.one--;
		 lthorf++;
		 break;
	       }
	  else if(matrix[i+count2+1][j-count2-1]==0
	     &&matrix[i-count1-1][j+count1+1]==0
	     &&matrix[i-count1-2][j+count1+2]==who
	     &&matrix[i-count1-3][j+count1+3]==who
	     &&matrix[i-count1-4][j+count1+4]==0
	     ||matrix[i-count1-1][j+count1+1]==0
	     &&matrix[i+count2+1][j-count2-1]==0
	     &&matrix[i+count2+2][j-count2-2]==who
	     &&matrix[i+count2+3][j-count2-3]==who
	     &&matrix[i+count2+4][j-count2-4]==0)
		{
		  mark.livethree++;
		  mark.one--;
		  lthorf++;
		  break;
		}

      break;
      }

      mark.mark=mark.five*FIVE;
      mark.mark+=mark.livefour*LIVEFOUR;
      mark.mark+=mark.crackfour*CRACKFOUR;
 //     mark.mark+=mark.hopfour*HOPFOUR;
      mark.mark+=mark.livethree*LIVETHREE;
 //     mark.mark+=mark.hopthree*HOPTHREE;
      mark.mark+=mark.crackthree*CRACKTHREE;
      mark.mark+=mark.livetwo*LIVETWO;
      mark.mark+=mark.cracktwo*CRACKTWO;
      mark.mark+=mark.one*ONE;
     // mark.livethree=3;
  /*    if(lthorf>=2)
       mark.mark+=2500;
       */
       if(mark.crackfour>=1&&mark.livethree>=1)
	 mark.mark+=3000;
       else if(lthorf>=2)
	 mark.mark+=2500;
      mark.i=i;
      mark.j=j;
   return (mark);
}

/* ______----------------------------- ////////////////////////
  ///   A function which can do the thinking part ?!
       BUT THE AI IS A FOOL!
//////////////////// --------------------------------- */
int ai(int depth,int who)
{
  int i,j,besti=1,bestj=1,li,lj,fi,fj,flagwin;
    int besti1=3,bestj1=5,besti2=1,bestj2=1,howdepth=0,howdepth2=0;
    MARK mark,mark1,mark2,bestmark,bestmark1,bestmark2;
    mark=initialmark(mark);
    mark1=initialmark(mark2);
    mark2=initialmark(mark2);
    bestmark=initialmark(bestmark);
    bestmark1=initialmark(bestmark1);
    bestmark2=initialmark(bestmark2);

       randomize();
 if(depth==1)
      {

      /*seach for the area for ai*/
       for(i=1;i<=15;i++)
	 for(j=1;j<=15;j++)
	   {
	    if(matrix[i][j]!=0)
	       if(j<=fj)
		 { fj=j;
		   break;
		 }

	   }
      for(j=1;j<=15;j++)
	  for(i=1;i<=15;i++)
	     {
	     if(matrix[i][j]!=0)
	       if(fi>=i)
		 { fi=i;
		 break;
		 }
	     }
     for(i=15;i>=1;i--)
	for(j=15;j>=1;j--)
	 {
	 if(matrix[i][j]!=0)
	   if(j>=lj)
	    {
	     lj=j;
	     break;
	    }
	 }
    for(j=15;j>=1;j--)
       for(i=15;i>=1;i--)
	{
	if(matrix[i][j]!=0)
	 if(i>=li)
	 {
	   li=i;
	   break;
	 }
	}

	if((fi-OUTSTEP)>=1)
	  fi-=OUTSTEP;
	if((fj-OUTSTEP)>=1)
	  fj-=OUTSTEP;
	if((li+OUTSTEP)<=15)
	  li+=OUTSTEP;
	if((lj+OUTSTEP)<=15)
	  lj+=OUTSTEP;
       /*-----------------*/

 //printf("fi=%d li=%d fj=%d lj=%d",fi,li,fj,lj);
	 bestmark.mark=0;
       for(i=fi;i<=li;i++)
	for(j=fj;j<=lj;j++)
	 {
	 if(matrix[i][j]==0)
	   {
	    mark1=evaluate(i,j,who);
	    mark2=evaluate(i,j,-who);
	    mark2.mark-=100;
	    // mark=(mark1.mark>=mark2.mark)?mark1:mark2;
		if(mark1.mark>bestmark1.mark)
		    bestmark1=mark1;
		else if(mark.mark==bestmark1.mark&&random(2))
		    bestmark1=mark1;
		if(mark2.mark>bestmark2.mark)
		    bestmark2=mark2;
		 else if(mark.mark==bestmark2.mark&&random(2))
		    bestmark2=mark2;

		if(mark1.mark>LIVETHREE&&mark1.mark<LIVEFOUR)
		 //  if(mark1.livethree>=1||mark1.crackfour>=1)
			{
			 matrix[i][j]=who;
			 howdepth=ai(depth+1,-who);
			 matrix[i][j]=0;
			   if(howdepth>0)
			      mark1.mark+=(LIVETHREE/2);
			}
		if(mark2.mark<LIVEFOUR)
		   if(mark2.livethree>=1||mark2.crackfour>=1)
		       {
			matrix[i][j]=-who;
			howdepth=ai(depth+1,who);
			matrix[i][j]=0;
			   if(howdepth>0)
			      mark2.mark+=(LIVETHREE/2);
		       }



	   }
	}


	   //bestmark=(bestmark1.mark>=bestmark2.mark)?bestmark1:bestmark2;
	   if(bestmark1.mark>=bestmark2.mark)
	     {
	      bestmark=bestmark1;
	     }
	   else
	      {
		 bestmark=bestmark2;
	      }

      /*if the step isn't the one which must be put*/

     matrix[bestmark.i][bestmark.j]=who;

      /*-------------------------------------------*/
     if(stepnum==1&&whofirst==1)
      {
	bestmark.i=(QIPANWIDTH/20)/2+1;
	bestmark.j=(QIPANHEIGHT/20)/2+1;
      }
       int x,y;
       x=bestmark.i*20+QIPANX-20;
       y=bestmark.j*20+QIPANY-20;
       paint_qizi(x,y,who);
       if(iffive(bestmark.i,bestmark.j,who))
	  paintnow=FALSE;
       stepnum++;
       return (1);
      }

 if(depth>1)
  {
   int nextstep,fi,fj,i,j;
   MARK bestmark1,bestmark2,bestmark;
   bestmark1.mark=0;
   bestmark2.mark=0;
   bestmark.mark=0;
 //  printf("enter digui depth=%d",depth);
   if(depth>MAXDEPTH)
      return(0);
  /*-----------------seach for the area for ai------------------------*/
       for(i=1;i<=15;i++)
	 for(j=1;j<=15;j++)
	   {
	    if(matrix[i][j]!=0)
	       if(fj>=j)
		 { fj=j;
		   break;
		 }

	   }
      for(j=1;j<=15;j++)
	  for(i=1;i<=15;i++)
	     {
	     if(matrix[i][j]!=0)
	       if(fi>=i)
		 { fi=i;
		 break;
		 }
	     }
     for(i=15;i>=1;i--)
	for(j=15;j>=1;j--)
	 {
	 if(matrix[i][j]!=0)
	   if(lj<=j)
	    {
	     lj=j;
	     break;
	    }
	 }
    for(j=15;j>=1;j--)
       for(i=15;i>=1;i--)
	{
	if(matrix[i][j]!=0)
	 if(li<=i)
	 { li=i;
	   break;
	 }
	}

	if((fi-OUTSTEP)>=1)
	  fi-=OUTSTEP;
	if((fj-OUTSTEP)>=1)
	  fj-=OUTSTEP;
	if((li+OUTSTEP)<=15)
	  li+=OUTSTEP;
	if((lj+OUTSTEP)<=15)
	  lj+=OUTSTEP;
 /*----------------------------------------------------------------------*/
    for(i=fi;i<=li;i++)
      for(j=fj;j<=lj;j++)
	 {
	   if(matrix[i][j]==0)
	      {
		mark1=evaluate(i,j,who);
		mark2=evaluate(i,j,-who);
	     if(depth/2==(depth+1)/2)
		    {
  /*If your oppenent formed a aggresive situaition ,you would be stopped*/
		    if(mark1.mark>=LIVETHREE&&mark2.mark<LIVEFOUR)
			return(0);
		    }
	    else
	      {
	      /*    You must keep attacking     */
	      if(mark1.mark<LIVETHREE)
		return(0);
	 /*     if(mark1.five>=1)
		return(depth);
	  */
		if(mark1.mark>=LIVETHREE*2)
		 return(depth);
	      }

	     mark=(mark1.mark>=mark2.mark)?mark1:mark2;

		 if(mark1.mark>bestmark1.mark)
		   bestmark1=mark1;
		 if(mark2.mark>bestmark2.mark)
		   bestmark2=mark2;

	      }
       }
	      matrix[bestmark.i][bestmark.j]=who;
	      nextstep=ai(depth+1,-who);

	      if(nextstep!=0)
		{
		  matrix[bestmark.i][bestmark.j]=0;
		  return(nextstep);
		}
	      else
	       {
		  matrix[bestmark.i][bestmark.j]=0;
		  return(0);
	       }


   }

}

void StartBtn_clicked()
{

  int i,j;
  paintnow=TRUE;
  setup_screen();
  for(i=1;i<=15;i++)
    for(j=1;j<=15;j++)
     matrix[i][j]=0;
  for(i=0,j=0;j<=18;j++)
      matrix[i][j]=3;
  for(i=18,j=0;j<=18;j++)
      matrix[i][j]=3;
  for(j=0,i=0;i<=18;i++)
      matrix[i][j]=3;
  for(j=18,i=0;i<=18;i++)
      matrix[i][j]=3;

  stepnum=1;
}
void RegretBtn_clicked(void)
{
  int i,j,empty=1;
   for(i=1;i<=15;i++)
     for(j=1;j<=15;j++)
      if(oldmatrix1[i][j]!=0)
	    empty=0;
   if(empty)
     printf("stop regret!");
   else
     {
	setup_screen();
     for(i=1;i<=15;i++)
       for(j=1;j<=15;j++)
	  {
	   matrix[i][j]=oldmatrix1[i][j];
	   oldmatrix1[i][j]=oldmatrix2[i][j];
	   oldmatrix2[i][j]=0;
	   if(matrix[i][j]!=0)
	     paint_qizi(i*20+QIPANX-20,QIPANY+j*20-20,matrix[i][j]);
	  }

     }


}
void anytoprocess(int x,int y,int f)
{
 if (f==LEFT)
   {
	if(x>=QIPANX&&x<=QIPANX+QIPANWIDTH&&y>=QIPANY&&y<=QIPANY+QIPANHEIGHT&&Manandcom==1)
	    if(paintnow==TRUE)
		   { int  xx,yy,tx,ty;
		       xx=(int)(((float)x/20)+0.5)*20;
		       yy=(int)(((float)y/20)+0.5)*20;

		       tx=(xx-QIPANX+20)/20;
		       ty=(yy-QIPANY+20)/20;
		     if(matrix[tx][ty]==0)
			 {   int i,j;
			   for(i=0;i<=18;i++)
			    for(j=0;j<=18;j++)
			      {
				oldmatrix2[i][j]=oldmatrix1[i][j];
				oldmatrix1[i][j]=matrix[i][j];
			      }
			   if(paint_qizi(x,y,-whofirst))
    /*when whofirst'value is 1 it means computer use the black first*/
				 {
				     int c;
				    paintnow=FALSE;
				    c=ai(1,whofirst);
				    paintnow=TRUE;
				 }
		    }
		}
	    if(x>=QIPANX&&x<=QIPANX+QIPANWIDTH&&y>=QIPANY&&y<=QIPANY+QIPANHEIGHT&&Manandcom==-1)
	       {
		    if(paintnow==TRUE)
		   { int  xx,yy,tx,ty;
		       xx=(int)(((float)x/20)+0.5)*20;
		       yy=(int)(((float)y/20)+0.5)*20;

		       tx=(xx-QIPANX+20)/20;
		       ty=(yy-QIPANY+20)/20;
		     if(matrix[tx][ty]==0)
			 {   int i,j;
			   for(i=0;i<=18;i++)
			    for(j=0;j<=18;j++)
			      {
				oldmatrix2[i][j]=oldmatrix1[i][j];
				oldmatrix1[i][j]=matrix[i][j];
			      }
			   if(paint_qizi(x,y,man))
    /*when whofirst'value is 1 it means computer use the black first*/
				 {
				    man*=-1;
				    paintnow=TRUE;
				 }
		    }
		}


	       }
  if(x>=StartBtn.x&&x<=StartBtn.x+StartBtn.width&&y>=StartBtn.y&&y<=StartBtn.y+StartBtn.height)
    {
     ButtonDown(StartBtn);
     StartBtn_clicked();
    if(whofirst==1)
       if(ai(1,1));
     }
   else if (x>=ChangeBtn.x&&x<=StartBtn.x+ChangeBtn.width&&y>=ChangeBtn.y&&y<=ChangeBtn.y+ChangeBtn.height)
     {
      ButtonDown(ChangeBtn);
      whofirst=-whofirst;
     }
    else if (x>=RegretBtn.x&&x<=RegretBtn.x+RegretBtn.width&&y>=RegretBtn.y&&y<=RegretBtn.y+RegretBtn.height)
      {
       ButtonDown(RegretBtn);
       RegretBtn_clicked();
      }
   else if(x>=ManandcomBtn.x&&x<=ManandcomBtn.x+ManandcomBtn.width&&y>=ManandcomBtn.y&&y<=ManandcomBtn.y+ManandcomBtn.height)
      {
       ButtonDown(ManandcomBtn);
       Manandcom*=-1;
      }
   else if (x>=ExitBtn.x&&x<=ExitBtn.x+ExitBtn.width&&y>=ExitBtn.y&&y<=ExitBtn.y+ExitBtn.height)
    {
      ButtonDown(ExitBtn);
      flag=1;
     }
 }

}

void wuzi()
{
 setup_screen();
 showmouse();
 int x,y,f=1;
 do{
 readmouse(&f,&x,&y);
 delay(100);
 anytoprocess(x,y,f);
    }while(flag!=1);
 hidemouse();
 flag=0;
 cleardevice();
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -