Пример #1
0
  bool DDLIndexPopulator::checkConstraints( const IdxTuple& data, const erydbSystemCatalog::ColType& ctype, int i, int column)
  {

    switch( fConstraint )
    {
      case DDL_INVALID_CONSTRAINT:
	return true;

      case DDL_UNIQUE:
      case DDL_PRIMARY_KEY:
	if ((size_t)column + 1 < fColNames.size() )
		return true;
	return checkUnique( i, ctype );

      case DDL_NOT_NULL:
	return checkNotNull( data, ctype );

      case DDL_CHECK:
	return checkCheck( data, ctype );

      default:
	return true; //?
    }

  }
Пример #2
0
void Board::rmbad(int x, int y) {
  if(check==0)return;
  set<int>::iterator it;
  set<int> tempmoves = poss;
  it = tempmoves.begin();
  while(it != tempmoves.end()) {
    //cout << (*it) << endl;
    int i = (*it)/10;
    int j = (*it)%10;
    //move for each
    cout << "testing: " << x << ", " << y << ", " << i << ", " << j << endl;
    movePiece(x, y, i, j);
    if(checkCheck()) {
      tempmoves.erase(it);
      it=tempmoves.begin();
      cout << "failed" << endl;
    }
    else cout << "isgood" << endl;
    undo();
    if(it != tempmoves.begin())
      it++;
    //if(it++ == tempmoves.end()) break;
  }
  poss = tempmoves;
}
Пример #3
0
void t_chessCli::run()
{
   for (;;)
   {
      t_message message;

      {
         boost::unique_lock<boost::mutex> lock(sharedData.gameMutex);

         if (sharedData.gameBuffer.empty())
         {
            sharedData.gameCondition.wait(lock);
         }

         message = sharedData.gameBuffer.back();
         sharedData.gameBuffer.pop_back();

      }

      std::cout<<"I have recieved a message"<<std::endl;

      switch (message.id)
      {

      case BOARD_CLICKED:
      {
         t_myVector2 pos = message.boardClicked.pos;
         std::cout<<"It was clicked at "<<pos<<std::endl;

         t_message newMessage;
         newMessage.id = HIGHLIGHT_SPACE;


         if (selected)
         {
            if (pos == selectedPos)
            {
               selected = 0;
               newMessage.highlightSpace.pos = selectedPos;
               newMessage.highlightSpace.color = 0;
               {
                  boost::unique_lock<boost::mutex> lock(sharedData.clientMutex);

                  sharedData.clientBuffer.push_front(newMessage);

                  for (auto iter = move.begin(); iter != move.end(); iter++)
                  {
                     newMessage.highlightSpace.pos = *iter;
                     newMessage.highlightSpace.color = 0;

                     sharedData.clientBuffer.push_front(newMessage);
                  }

                  for (auto iter = hit.begin(); iter != hit.end(); iter++)
                  {
                     newMessage.highlightSpace.pos = *iter;
                     newMessage.highlightSpace.color = 0;

                     sharedData.clientBuffer.push_front(newMessage);
                  }

                  for (auto iter = castle.begin(); iter != castle.end(); iter++)
                  {
                     newMessage.highlightSpace.pos = *iter;
                     newMessage.highlightSpace.color = 0;

                     sharedData.clientBuffer.push_front(newMessage);
                  }
               }

               move.clear();
               hit.clear();
               castle.clear();
            }

            else if (std::find(move.begin(), move.end(), pos) != move.end())
            {
               if (checkCheck(pos,selectedPos))
               {
                  std::cout<<"I am in check"<<std::endl;
                  break;
               }

               if (turn == 0)
               {
                  whitePieces.erase(selectedPos);
                  whitePieces.insert(pos);
               }

               else
               {
                  blackPieces.erase(selectedPos);
                  blackPieces.insert(pos);
               }

               removeCastle(pos,selectedPos);

               selected = 0;
               newMessage.highlightSpace.pos = selectedPos;
               newMessage.highlightSpace.color = 0;
               
               {
                  boost::unique_lock<boost::mutex> lock(sharedData.clientMutex);

                  sharedData.clientBuffer.push_front(newMessage);

                  for (auto iter = move.begin(); iter != move.end(); iter++)
                  {
                     newMessage.highlightSpace.pos = *iter;
                     newMessage.highlightSpace.color = 0;

                     sharedData.clientBuffer.push_front(newMessage);
                  }

                  for (auto iter = hit.begin(); iter != hit.end(); iter++)
                  {
                     newMessage.highlightSpace.pos = *iter;
                     newMessage.highlightSpace.color = 0;

                     sharedData.clientBuffer.push_front(newMessage);
                  }

                  for (auto iter = castle.begin(); iter != castle.end(); iter++)
                  {
                     newMessage.highlightSpace.pos = *iter;
                     newMessage.highlightSpace.color = 0;

                     sharedData.clientBuffer.push_front(newMessage);
                  }

                  newMessage.id = MOVE_PIECE;
                  newMessage.movePiece.pos = pos;
                  newMessage.movePiece.oldPos = selectedPos;

                  sharedData.clientBuffer.push_front(newMessage);
               }

               move.clear();
               hit.clear();
               castle.clear();

               board[pos.y][pos.x] = board[selectedPos.y][selectedPos.x];
               board[selectedPos.y][selectedPos.x] = 0;

               turn = !turn;

               if (checkCheckmate())
               {
                  std::cout<<"I win"<<std::endl;
               }
            }

            else if (std::find(hit.begin(), hit.end(), pos) != hit.end())
            {
               if (checkCheck(pos,selectedPos))
               {
                  std::cout<<"I am in check"<<std::endl;
                  break;
               }

               if (turn == 0)
               {
                  whitePieces.erase(selectedPos);
                  whitePieces.insert(pos);

                  blackPieces.erase(pos);
               }

               else
               {
                  blackPieces.erase(selectedPos);
                  blackPieces.insert(pos);

                  whitePieces.erase(pos);
               }

               removeCastle(pos,selectedPos);

               selected = 0;
               newMessage.highlightSpace.pos = selectedPos;
               newMessage.highlightSpace.color = 0;
               
               {
                  boost::unique_lock<boost::mutex> lock(sharedData.clientMutex);

                  sharedData.clientBuffer.push_front(newMessage);

                  for (auto iter = move.begin(); iter != move.end(); iter++)
                  {
                     newMessage.highlightSpace.pos = *iter;
                     newMessage.highlightSpace.color = 0;

                     sharedData.clientBuffer.push_front(newMessage);
                  }

                  for (auto iter = hit.begin(); iter != hit.end(); iter++)
                  {
                     newMessage.highlightSpace.pos = *iter;
                     newMessage.highlightSpace.color = 0;

                     sharedData.clientBuffer.push_front(newMessage);
                  }

                  for (auto iter = castle.begin(); iter != castle.end(); iter++)
                  {
                     newMessage.highlightSpace.pos = *iter;
                     newMessage.highlightSpace.color = 0;

                     sharedData.clientBuffer.push_front(newMessage);
                  }

                  newMessage.id = CAPTURE_PIECE;
                  newMessage.movePiece.pos = pos;
                  newMessage.movePiece.oldPos = selectedPos;

                  sharedData.clientBuffer.push_front(newMessage);
               }

               move.clear();
               hit.clear();
               castle.clear();

               board[pos.y][pos.x] = board[selectedPos.y][selectedPos.x];
               board[selectedPos.y][selectedPos.x] = 0;

               turn = !turn;

               if (checkCheckmate())
               {
                  std::cout<<"I win"<<std::endl;
               }
            }

            else if (std::find(castle.begin(), castle.end(), pos) != castle.end())
            {
               if (checkCheck(pos,selectedPos))
               {
                  std::cout<<"I am in check"<<std::endl;
                  break;
               }

               if (turn == 0)
               {
                  whitePieces.erase(selectedPos);
                  whitePieces.insert(pos);
               }

               else
               {
                  blackPieces.erase(selectedPos);
                  blackPieces.insert(pos);
               }

               removeCastle(pos,selectedPos);

               selected = 0;
               newMessage.highlightSpace.pos = selectedPos;
               newMessage.highlightSpace.color = 0;
               
               {
                  boost::unique_lock<boost::mutex> lock(sharedData.clientMutex);

                  sharedData.clientBuffer.push_front(newMessage);

                  for (auto iter = move.begin(); iter != move.end(); iter++)
                  {
                     newMessage.highlightSpace.pos = *iter;
                     newMessage.highlightSpace.color = 0;

                     sharedData.clientBuffer.push_front(newMessage);
                  }

                  for (auto iter = hit.begin(); iter != hit.end(); iter++)
                  {
                     newMessage.highlightSpace.pos = *iter;
                     newMessage.highlightSpace.color = 0;

                     sharedData.clientBuffer.push_front(newMessage);
                  }

                  for (auto iter = castle.begin(); iter != castle.end(); iter++)
                  {
                     newMessage.highlightSpace.pos = *iter;
                     newMessage.highlightSpace.color = 0;

                     sharedData.clientBuffer.push_front(newMessage);
                  }

                  newMessage.id = MOVE_PIECE;
                  newMessage.movePiece.pos = pos;
                  newMessage.movePiece.oldPos = selectedPos;

                  sharedData.clientBuffer.push_front(newMessage);

                  if (pos.x == 2) //left castle
                  { 
                     newMessage.movePiece.pos.x = 3;
                     newMessage.movePiece.oldPos.x = 0;
                  }

                  else
                  {
                     newMessage.movePiece.pos.x = 5;
                     newMessage.movePiece.oldPos.x = 7;
                  }
                     sharedData.clientBuffer.push_front(newMessage);
               }

               move.clear();
               hit.clear();
               castle.clear();

               board[pos.y][pos.x] = board[selectedPos.y][selectedPos.x];
               board[selectedPos.y][selectedPos.x] = 0;

               if (pos.x == 2) //left
               {
                  pos.x = 3;
                  selectedPos.x = 0;

                  board[pos.y][3] = board[selectedPos.y][0];
                  board[selectedPos.y][0] = 0;
               }
               
               else 
               {
                  pos.x = 5;
                  selectedPos.x = 7;

                  board[pos.y][5] = board[selectedPos.y][7];
                  board[selectedPos.y][7] = 0;
               }

               if (turn == 0)
               {
                  whitePieces.erase(selectedPos);
                  whitePieces.insert(pos);
               }

               else
               {
                  blackPieces.erase(selectedPos);
                  blackPieces.insert(pos);
               }

               turn = !turn;


               if (checkCheckmate())
               {
                  std::cout<<"I win"<<std::endl;
               }
            }



         }

         else if (board[pos.y][pos.x] && board[pos.y][pos.x]/8 == turn)
         {
            selected = 1;
            selectedPos = pos;
            newMessage.highlightSpace.pos = pos;
            newMessage.highlightSpace.color = 1;

            generateMoves(pos);

            {
               boost::unique_lock<boost::mutex> lock(sharedData.clientMutex);

               sharedData.clientBuffer.push_front(newMessage);

               for (auto iter = move.begin(); iter != move.end(); iter++)
               {
                  newMessage.highlightSpace.pos = *iter;
                  newMessage.highlightSpace.color = 2;

                  sharedData.clientBuffer.push_front(newMessage);
               }

               for (auto iter = hit.begin(); iter != hit.end(); iter++)
               {
                  newMessage.highlightSpace.pos = *iter;
                  newMessage.highlightSpace.color = 3;

                  sharedData.clientBuffer.push_front(newMessage);
               }

               for (auto iter = castle.begin(); iter != castle.end(); iter++)
               {
                  newMessage.highlightSpace.pos = *iter;
                  newMessage.highlightSpace.color = 4;

                  sharedData.clientBuffer.push_front(newMessage);
               }

            }


         }



         break;
      }

      case QUIT_MESSAGE:
         std::cout<<"It told me to quit"<<std::endl;
         return;

      default:
         std::cout<<"And I do not know what it was"<<std::endl;

      }
   }
}
Пример #4
0
double ChessAI::findBestMove(bool playIt, int iter)
{
	PieceColor color=colorToMove;
	Square s, e;
	MoveHolder moves(settings.checkWidth);
	
	if (checkForBoringTie())
	{
		//err << "\n\n\n		BORING TIE FOUND\n\n\n" << err; 
		return 0.5;
	}
	
	for (int i=((color==WHITE)?0:16); i<((color==WHITE)?16:32); ++i)
	{
		if (pieces[i].alive)
		{
			s=pieces[i].square;
			
			for (e.y=0; e.y<8; ++e.y)
			{
				for (e.x=0; e.x<8; ++e.x)
				{
					bool path=checkMovePath(s, e);
					
					bool check=checkCheck(colorToMove, s, e);
					
					if (path && check)
					{
						forceMove(s, e);
						moves.add(MoveData(s, e, eval(color)));
						undo();
						
						checkBoard();
					}
				}
			}
		}
	}
	
	if (moves.size()<1)
	{
		if (checkCheck(color, kings[color]->square, kings[color]->square))
			return 0.5;
		else
			return 0.0;
	}
	
	MoveData bestMove;
	
	bestMove.score=-1;
	
	for (auto i=moves.begin(); i!=moves.end(); ++i)
	{
		for (int j=settings.checkDepth; j>iter; --j)
			err << "    ";
		
		err << pieceColor2Name(color) << " " << pieceType2Name(board((*i).s)->type) << " from " << (*i).s.str() << " to " << (*i).e.str() << err;
		
		forceMove((*i).s, (*i).e);
		
		double score=0;
		
		if (iter<=0)
		{
			score=eval(color);
		}
		else
		{
			score=1-findBestMove(false, iter-1);
		}
		
		undo();
		
		for (int j=settings.checkDepth+1; j>iter; --j)
			err << "    ";
	
		err << "best score for " << pieceColor2Name(myColor) << ": " << ((myColor==color)?score:1-score) << err;
		
		if (score>bestMove.score)
		{
			bestMove.s=(*i).s;
			bestMove.e=(*i).e;
			bestMove.score=score;
		}
	}
	
	if (playIt)
	{
		return game->playMove(bestMove.s, bestMove.e);
	}
	else
	{
		return bestMove.score;
	}
}