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

📄 mychess.cpp

📁 围棋游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MyChess.cpp: implementation of the MyChess class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "chess.h"
#include "MyChess.h"
#include <stdio.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

MyChess::MyChess()
{
  int i,j;
  BlackOrWhite=UserBW;
  ChessCount=0;
  ChainCount=0;
  for(i=0;i<15;i++){
	  for(j=0;j<15;j++)State[i][j]=0;
  }
}
MyChess::~MyChess()
{
  int i,j;
  BlackOrWhite=1;
  for(i=1;i<=ChessCount;i++)ChessStep[i].No=0;ChessStep[i].p.x=0;ChessStep[i].p.y=0;
  ChessCount=0;
  ChainCount=0;
  for(i=0;i<15;i++){
	  for(j=0;j<15;j++)State[i][j]=0;
  }
}

void MyChess::AddChain(CPoint p, int bw)
{
	int i,j;
	bool t;
	t=0;
	if(ChainCount!=0){
		CheAndCreChain(p);
		for(i=0;i<ChainCount;i++){
			if(chaintab[i].IfInMe(p,bw)==0){
				if(i<ChainCount-1){
					for(j=i+1;j<ChainCount;j++){
					   if(chaintab[i].VHState==chaintab[j].VHState){
						   if(chaintab[j].IfInMe(p,bw)==0){
							   UnionChain(chaintab[i].ChainID,chaintab[j].ChainID);
							   t=1;
						   if(chaintab[i].IfInMe(p,bw)!=0)break;
						   }
					   }
					}
				}
             if(t==0)chaintab[i].AddMember(p);
             t=0;
			}
		}
	}
	else CheAndCreChain(p);
	CheckChain();
}

void MyChess::UnionChain(int ID1,int ID2)
{
  int i,j,it1,it2;
  CPoint t;
  for(i=0;i<ChainCount;i++){
	  for(j=0;j<ChainCount;j++){
		  if(chaintab[i].ChainID==ID1&&chaintab[j].ChainID==ID2){
			  it1=i;it2=j;
         	  t=chaintab[i].FirstP;
			  if(t.x>chaintab[j].FirstP.x||(t.x==chaintab[j].FirstP.x&&t.y>chaintab[j].FirstP.y)){
		           it1=j;it2=i;t=chaintab[i].FirstP;
				   break;
			  }
		  }
	  }
  }
  chaintab[it1].ChainLenth+=chaintab[it2].ChainLenth+1;
  if(chaintab[it1].EnaAdd!=chaintab[it2].EnaAdd){//if equal means both are addable
	  if(chaintab[it2].EnaAdd==1){//only left addable
		  if(chaintab[it1].EnaAdd==2)chaintab[it1].EnaAdd=0;
	  }
  }
  DelChain(chaintab[it2].ChainID);
}

void MyChess::CreChain(CPoint p,int vhstate,int edgecase)
{
	int i,j,temp;
	chaintab[ChainCount].BorW=BlackOrWhite;
	chaintab[ChainCount].FirstP=p;
	chaintab[ChainCount].ChainLenth=1;
	chaintab[ChainCount].VHState=vhstate;
	switch(edgecase){
	case 0:
		chaintab[ChainCount].EnaAdd=3;break;
	case 1:
	     chaintab[ChainCount].EnaAdd=2;break;
	case 2:
		 if(vhstate==1)chaintab[ChainCount].EnaAdd=1;
		 else chaintab[ChainCount].EnaAdd=2;
		 break;
    case 3:
		chaintab[ChainCount].EnaAdd=1;break;
	case 4:
		if(vhstate==1)chaintab[ChainCount].EnaAdd=2;
		else chaintab[ChainCount].EnaAdd=1;
		break;
	case 5:
		if(vhstate==1)chaintab[ChainCount].EnaAdd=3;
		else chaintab[ChainCount].EnaAdd=2;
		break;
	case 6:
		if(vhstate==0)chaintab[ChainCount].EnaAdd=3;
		if(vhstate==3)chaintab[ChainCount].EnaAdd=2;
		if(vhstate==1||vhstate==2)chaintab[ChainCount].EnaAdd=1;
		break;
	case 7:
        if(vhstate==1)chaintab[ChainCount].EnaAdd=3;
		else chaintab[ChainCount].EnaAdd=1;
		break;
	case 8:
		if(vhstate==0)chaintab[ChainCount].EnaAdd=3;
		if(vhstate==3)chaintab[ChainCount].EnaAdd=1;
		if(vhstate==1||vhstate==2)chaintab[ChainCount].EnaAdd=2;
		break;
	}
	j=1;temp=0;
	while(temp==0){
      temp=1;
      for(i=0;i<ChainCount;i++){
		  if(chaintab[i].ChainID==ChainCount+j){
			  temp=0;j++;break;
		  }
	  }
    }
   chaintab[ChainCount].ChainID=ChainCount+j;
ChainCount++;
}

int MyChess::PushChess(int i, int j)
{
	CPoint p,t;
	p.x=i+1;p.y=j+1;
	if(State[i][j]==0&&p.x>0&&p.x<16&&p.y>0&&p.y<16){
		switch(BlackOrWhite){
		  case 1:
		    BlackOrWhite=0;State[i][j]=1;break;
          case 0:
		    BlackOrWhite=1;State[i][j]=2;break;
		}
		ChessStep[ChessCount+1].No=ChessCount+1;
        t.x=i;t.y=j;
		ChessStep[ChessCount+1].p=t;
		ChessCount++;
		AddChain(p,BlackOrWhite);
        return(1);	 
	}
		return(0);
}

void MyChess::CheAndCreChain(CPoint p)
{
	switch(p.x){
	case 1:
		switch(p.y){
		case 1:
           if(State[0][1]==0)CreChain(p,1,1);
		   if(State[1][0]==0)CreChain(p,0,1);
           if(State[1][1]==0)CreChain(p,2,1);
		   break;
        case 15:
		   if(State[0][13]==0)CreChain(p,1,2);
		   if(State[1][14]==0)CreChain(p,0,2);
		   if(State[1][13]==0)CreChain(p,3,2);
		   break;
	    default:
			if(State[0][p.y-2]!=State[0][p.y-1]&&State[0][p.y]!=State[0][p.y-1]){
			  if(State[0][p.y-2]==0||State[0][p.y]==0)CreChain(p,1,5);
			}
		    if(State[1][p.y-1]==0)CreChain(p,0,5);
		    if(State[1][p.y-2]==0)CreChain(p,3,5);
		    if(State[1][p.y]==0)CreChain(p,2,5);
		 }
		break;
	case 15:
		switch(p.y){
		case 1:
           if(State[14][1]==0)CreChain(p,1,4);
		   if(State[13][0]==0)CreChain(p,0,4);
           if(State[13][1]==0)CreChain(p,3,4);
		   break;
        case 15:
		   if(State[14][13]==0)CreChain(p,1,3);
		   if(State[13][14]==0)CreChain(p,0,3);
		   if(State[13][13]==0)CreChain(p,2,3);
		   break;
		default:
			if(State[14][p.y-2]!=State[14][p.y-1]&&State[14][p.y]!=State[14][p.y-1]){
			  if(State[14][p.y-2]==0||State[14][p.y]==0)CreChain(p,1,7);
			}
		    if(State[13][p.y-1]==0)CreChain(p,0,7);
		    if(State[13][p.y-2]==0)CreChain(p,2,7);
		    if(State[13][p.y]==0)CreChain(p,3,7);
	    }
		break;
   default:
     switch(p.y){
	 case 1:
		if(State[p.x-2][0]!=State[p.x-1][0]&&State[p.x][0]!=State[p.x-1][0]){
			if(State[p.x-2][0]==0||State[p.x][0]==0)CreChain(p,0,8);
		}
		if(State[p.x-1][1]==0)CreChain(p,1,8);
		if(State[p.x-2][1]==0)CreChain(p,3,8);
		if(State[p.x][1]==0)CreChain(p,2,8);
		break;
	 case 15:
        if(State[p.x-2][14]!=State[p.x-1][14]&&State[p.x-2][14]!=State[p.x-1][14]){
			if(State[p.x-2][14]==0||State[p.x][14]==0)CreChain(p,0,6);
		}
		if(State[p.x-1][13]==0)CreChain(p,1,6);
		if(State[p.x-2][13]==0)CreChain(p,2,6);
		if(State[p.x][13]==0)CreChain(p,3,6);
		break;
	 default:
		  if(State[p.x-2][p.y-1]!=State[p.x-1][p.y-1]&&State[p.x][p.y-1]!=State[p.x-1][p.y-1]){
		     if(State[p.x-2][p.y-1]==0||State[p.x][p.y-1]==0)CreChain(p,0,0);
		  }
	      if(State[p.x-1][p.y-2]!=State[p.x-1][p.y-1]&&State[p.x-1][p.y]!=State[p.x-1][p.y-1]){
		     if(State[p.x-1][p.y-2]==0||State[p.x-1][p.y]==0)CreChain(p,1,0);
		  }
          if(State[p.x-2][p.y-2]!=State[p.x-1][p.y-1]&&State[p.x][p.y]!=State[p.x-1][p.y-1]){
		       if(State[p.x-2][p.y-2]==0||State[p.x][p.y]==0)CreChain(p,2,0);
		  }
          if(State[p.x-2][p.y]!=State[p.x-1][p.y-1]&&State[p.x][p.y-2]!=State[p.x-1][p.y-1]){
		     if(State[p.x-2][p.y]==0||State[p.x][p.y-2]==0)CreChain(p,3,0);
		  }
	 }
	}
}

void MyChess::CheckChain()
{
	int i;
	for(i=0;i<ChainCount;i++){
		switch(chaintab[i].EnaAdd){
		case 1://left or up addable
			switch(chaintab[i].VHState){
			case 0://horizen
				if(State[chaintab[i].FirstP.x-2][chaintab[i].FirstP.y-1]==1){//black
					if(chaintab[i].BorW==1)chaintab[i].EnaAdd=0;
				}
				else{//white
					if(State[chaintab[i].FirstP.x-2][chaintab[i].FirstP.y-1]==2){
						if(chaintab[i].BorW==0)chaintab[i].EnaAdd=0;
					}
				}
				break;
			case 1://vertical
                if(State[chaintab[i].FirstP.x-1][chaintab[i].FirstP.y-2]==1){//black
					if(chaintab[i].BorW==1)chaintab[i].EnaAdd=0;
				}
				else{//white
					if(State[chaintab[i].FirstP.x-1][chaintab[i].FirstP.y-2]==2){
						if(chaintab[i].BorW==0)chaintab[i].EnaAdd=0;
					}
				}
				break;
			case 2://lu-rd
				if(State[chaintab[i].FirstP.x-2][chaintab[i].FirstP.y-2]==1){//black
					if(chaintab[i].BorW==1)chaintab[i].EnaAdd=0;
				}
				else{//white
					if(State[chaintab[i].FirstP.x-2][chaintab[i].FirstP.y-2]==2){
						if(chaintab[i].BorW==0)chaintab[i].EnaAdd=0;
					}
				}
				break;
			case 3://ld-ru
				if(State[chaintab[i].FirstP.x-2][chaintab[i].FirstP.y]==1){//black
					if(chaintab[i].BorW==1)chaintab[i].EnaAdd=0;
				}
				else{//white
					if(State[chaintab[i].FirstP.x-2][chaintab[i].FirstP.y]==2){
						if(chaintab[i].BorW==0)chaintab[i].EnaAdd=0;
					}
				}
				break;
			}
			break;
	     case 2://right or down addable
            switch(chaintab[i].VHState){
			case 0://horizen
				if(State[chaintab[i].FirstP.x+chaintab[i].ChainLenth-1][chaintab[i].FirstP.y-1]==1){//black
					if(chaintab[i].BorW==1)chaintab[i].EnaAdd=0;
				}
				else{//white
					if(State[chaintab[i].FirstP.x+chaintab[i].ChainLenth-1][chaintab[i].FirstP.y-1]==2){
						if(chaintab[i].BorW==0)chaintab[i].EnaAdd=0;
					}
				}

⌨️ 快捷键说明

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