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

📄 movesbackup.cpp

📁 一个人工智能的国际象棋游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
						if (board[k][m]==0)
						{
							add(piece,j,i,m,k,0);
						}
						else
						{
							if (cond2(color,board[k][m]))
							{
								add(piece,j,i,m,k,1);
							}
							break;
						}
					}
					for (k=i-1,m=j+1;k>=0 && m<8;k--,m++)
					{
						if (board[k][m]==0)
						{
							add(piece,j,i,m,k,0);
						}
						else
						{
							if (cond2(color,board[k][m]))
							{
								add(piece,j,i,m,k,1);
							}
							
							break;
						}
					}
					for (k=i+1,m=j+1;k<8 && m<8;k++,m++)
					{
						if (board[k][m]==0)
						{
							add(piece,j,i,m,k,0);
						}
						else
						{
							if (cond2(color,board[k][m]))
							{
								add(piece,j,i,m,k,1);
							}
							
							break;	
						}
					}
					for (k=i+1,m=j-1;k<8  && m>=0;k++,m--)
					{
						if (board[k][m]==0)
						{
							add(piece,j,i,m,k,0);
						}
						else
						{
							if (cond2(color,board[k][m]))
							{
								add(piece,j,i,m,k,1);
							}
							break;
						}
					}
				}
			}
		}
		
	}

	void Moves::GenerateRookMoves(int board[8][8],int color)
	{
	
		int piece;int k;
		piece=(color==WHITE?WHITE_ROOK:BLACK_ROOK);
	
		for (int i=0;i<8 ;i++)
		{
			for (int j=0;j<8;j++)
			{
				if (board[i][j]==piece)
				{
					for (k=i-1;k>=0;k--)
					{
						if (board[k][j]==0)
						{
							add(piece,j,i,j,k,0);
							//MessageBox("Rook Move added");
						}
						else 
						{
							if ( cond2(color,board[k][j]))
							{
								add(piece,j,i,j,k,1);
								
							}
							break;
						}
					}
					for (k=i+1;k<8;k++)
					{
						if (board[k][j]==0)
						{
							add(piece,j,i,j,k,0);
							//MessageBox("Rook Move added");
						}
						else
						{
							if (cond2(color,board[k][j]))
							{
								add(piece,j,i,j,k,1);
								
							}
							break;
						}
					}
					for (k=j+1;k<8;k++)
					{
						if (board[i][k]==0)
						{
							add(piece,j,i,k,i,0);
							//MessageBox("Rook Move added");
						}
						else
						{
							if (cond2(color,board[i][k]))
							{
								add(piece,j,i,k,i,1);
								break;
							}
							break;
						}
					}
					for (k=j-1;k>=0;k--)
					{
						if (board[i][k]==0 )
						{
							add(piece,j,i,k,i,0);
							//MessageBox("Rook Move added");
						}
						else
						{
							if (cond2(color,board[i][k]))
							{
								add(piece,j,i,k,i,1);
								
							}
							break;
						}
					}
				}
			}
			
		}
		

	}
	
	void Moves::GenerateQueenMoves(int board[8][8],int color)
	{
		int piece; int k;
		piece=(color==WHITE?WHITE_QUEEN:BLACK_QUEEN);
		
		for (int i=0;i<8;i++)  
		{
			for (int j=0;j<8;j++)
			{
				if (board[i][j]==piece)
				{
					
					//Search moves straight, up,left,right and down
					for (k=i-1;k>=0;k--)
					{
						if (board[k][j]==0 )
						{
							add(piece,j,i,j,k,0);
							//MessageBox("Rook Move added");
						}
						else
						{
							if ( cond2(color,board[k][j]))
							{
								add(piece,j,i,j,k,1);
								
							}
							
							break;
						}
						
						
					}
					for (k=i+1;k<8;k++)
					{
						if (board[k][j]==0)
						{
							add(piece,j,i,j,k,0);
							//MessageBox("Rook Move added");
						}
						else
						{
							if (cond2(color,board[k][j]))
							{
								add(piece,j,i,j,k,1);
								
							}
							break;
						}
					}
					for (k=j+1;k<8;k++)
					{
						if (board[i][k]==0 )
						{
							add(piece,j,i,k,i,0);
							//MessageBox("Rook Move added");
						}
						else
						{
							if ( cond2(color,board[i][k]))
							{
								add(piece,j,i,k,i,1);
								
							}
							break;
						}
					}
					for (k=j-1;k>=0;k--)
					{
						if (board[i][k]==0)
						{
							add(piece,j,i,k,i,0);
							//MessageBox("Rook Move added");
						}
						else
						{
							if (cond2(color,board[i][k]))
							{
								add(piece,j,i,k,i,1);
								
							}
							break;
						}
						
					}
					
					int m;
					//Now search diagnols. Could have put this in a function (Bishop needs it too)
					for (k=i-1,m=j-1;k>=0 && m>=0;k--,m--)
					{
						if (board[k][m]==0 )
						{
							add(piece,j,i,m,k,0);
						}
						else
						{
							if (cond2(color,board[k][m]))
							{
								add(piece,j,i,m,k,1);
								
							}
							break;
						}
					}
					for (k=i-1,m=j+1;k>=0 && m<8;k--,m++)
					{
						if (board[k][m]==0 )
						{
							add(piece,j,i,m,k,0);
						}
						else
						{
							if (cond2(color,board[k][m]))
							{
								add(piece,j,i,m,k,1);
								
							}
							break;
						}
					}
					for (k=i+1,m=j+1;k<8 && m<8;k++,m++)
					{
						if (board[k][m]==0)
						{
							add(piece,j,i,m,k,0);
						}
						else
						{
							if (cond2(color,board[k][m]))
							{
								add(piece,j,i,m,k,1);
								
							}
							break;
						}
						
					}
					for (k=i+1,m=j-1;k<8 && m>=0;k++,m--)
					{
						if (board[k][m]==0)
						{
							add(piece,j,i,m,k,0);
						}
						else
						{
							if (cond2(color,board[k][m]))
							{
								add(piece,j,i,m,k,1);
								break;
							}
							break;
						}
					}
				}
					
			}
				
		}
			
	}

	void Moves::GenerateKingMoves(int board[8][8],int color)
	{
		int i,j;
		int found=0;
		int piece;
		piece=(color==WHITE?WHITE_KING:BLACK_KING);
		for (i=0;i<8 && !found;i++)
		{
			for (j=0;j<8;j++)
			{
				if (board[i][j]==piece)
				{
					found=1;
					break;
				}
			}
		}
		i--;
		
		if (found)
		{
			//MessageBox("King found at "+(CString)(itoa(posnx,buf,10))+","+(CString)(itoa(posny,buf,10)));
			//MessageBox(board[0][3]==WHITE_KING?"True":"False");
			if (i<7 && (gencond(color,board[i+1][j])))
			{
				
				//MessageBox("Added One King Move");
				add(piece,j,i,j,i+1,0);
			}
			if (i>0 && (gencond(color,board[i-1][j])))
			{
				//char buf[255];
				//MessageBox("Added One King Move, piece Follows");
				//MessageBox(itoa(board[i-1][j],buf,10));
				
				add(piece,j,i,j,i-1,0);
				//MessageBox("Added One King Move");
			}
			if (j<7 && (gencond(color,board[i][j+1])))
			{
				add(piece,j,i,j+1,i,0);
				
			}
			if (j>0 && (gencond(color,board[i][j-1])))
			{
				
				add(piece,j,i,j-1,i,0);
				//MessageBox("Added One King Move");
			}
			if (i<7 && j<7 && (gencond(color,board[i+1][j+1])))
			{
				add(piece,j,i,j+1,i+1,0);
				//MessageBox("Added One King Move");
			}
			if (i<7 && j>0 && (gencond(color,board[i+1][j-1])))
			{
				add(piece,j,i,j-1,i+1,0);
				//MessageBox("Added One King Move");
			}
			if (i>0 && j<7 && (gencond(color,board[i-1][j+1])))
			{
				add(piece,j,i,j+1,i-1,0);
				//MessageBox("Added One King Move");
			}
			if (i>0 && j>0 && (gencond(color,board[i-1][j-1])))
			{
				add(piece,j,i,j-1,i-1,0);
				//MessageBox("Added One King Move");
			}
			
		}
		

	}

	int Moves::GenerateAllMoves(int board[8][8],int color,int depth,int check_for_mate)
	{

	//char buf[255];
	
	//int check=0;
	
	/*TransTableEntry entry=table.LookUp(board);
	if (entry.valid && ((color==WHITE && entry.move.piece<10 && entry.move.piece>0) || (color==BLACK && entry.move.piece>10 && entry.move.piece<17)))
	{
		add(entry.move.piece,entry.move.sourcex,entry.move.sourcey,entry.move.destx,entry.move.desty,1);
	}*/
	
	
	//if ((color==WHITE && WHITE_BASE==0) || (color==BLACK && BLACK_BASE==0))
	
		if (search_firsttime==0)
		{
			if (movecount<80)
			{
				
				GenerateKnightMoves(board,color);
				
				GenerateBishopMoves(board,color);
				
				GeneratePawnMoves(board,color);
				GenerateRookMoves(board,color);
				
				GenerateQueenMoves(board,color);
				
				GenerateKingMoves(board,color);
			}
			else
			{
				GeneratePawnMoves(board,color);
				GenerateRookMoves(board,color);
				
				GenerateQueenMoves(board,color);
				
				
				GenerateKnightMoves(board,color);
				
				GenerateBishopMoves(board,color);
				
				
				GenerateKingMoves(board,color);
			}
			
			
			
			
			combine();
			if (depth<4 && depth>0 && !check_for_mate)
			{
				allmoves=new OneMove[size];
				//memmove(allmoves,head,size*sizeof(OneMove));
				OneMove *temp=head;
				temp=temp->next;
				for (int i=0;i<size;i++)
				{
					allmoves[i]=*temp;
					temp=temp->next;
				}
				movequeue.AddMoveList(allmoves,size);
			}
		}
		else
		{
			if (depth>=2 && !check_for_mate)
			{
				MessageBox(NULL,"Removing Head","",0);
				head=movequeue.RemoveMoveList();

			}
			else
			{

				if (movecount<80)
				{
				
					GenerateKnightMoves(board,color);
					
					GenerateBishopMoves(board,color);
					
					GeneratePawnMoves(board,color);
					GenerateRookMoves(board,color);
					
					GenerateQueenMoves(board,color);
					
					GenerateKingMoves(board,color);
				}
				else
				{
					GeneratePawnMoves(board,color);
					GenerateRookMoves(board,color);
					
					GenerateQueenMoves(board,color);
					
					
					GenerateKnightMoves(board,color);
					
					GenerateBishopMoves(board,color);
					
					
					GenerateKingMoves(board,color);
				}
						
				combine();
				if (depth<4 && !check_for_mate)
				{
					OneMove *allmoves=new OneMove[size];
					memmove(allmoves,head,size*sizeof(OneMove));
					movequeue.AddMoveList(allmoves,size);
				}





			
		
		
		
			}
		}




	return 1;	
	}







⌨️ 快捷键说明

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