📄 mychess.cpp
字号:
// 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 + -