# patishi

Member

92

212 Neutral

• Rank
Member
1. ## Best way to assert the king is not in check when generating moves in chess

Thank a lot my friend!    very much appreciated
2. ## Best way to assert the king is not in check when generating moves in chess

Thanks a lot for the very detailed answer.  Boy! do I still have a lot of work to do :)         I remember that i first need to try and play the hash move, capture moves, killer moves etc..   first, before i am going to play the quiet moves.   But I (stupidly) was going to generate all the possible moves fist and only play them in that order.     Thank you for correcting me, now i know that there is no point in generating usless moves if i am not going to actually play them ( or at least not sure about that).
3. ## Best way to assert the king is not in check when generating moves in chess

I am now working on generating moves in chess.  I am writing move generation function for every piece (pawn,knight,bishop...)and i currently generation all possible moves without any kind of filtering.      I wonder what is the preffered way to assert that the king is not in check after the move is played (e.g if the move is valid).    The way i see it,  I have to actually play the move on the board and only than can I know that the king is not exposed or attacked.     But should I make this valiadation in the alpha-beta function (in the actual evaluation stage) ?   or maybe "artificialy"  make the move inside the moves generation function and decide if i should add it to the list in the first place.       Also,  can you give me some tips on how to improve the move generation ?  maybe not generate all possible moves?    Thx.
4. ## Checking for offboard squares with bitboards (vs padded array)

Thank you very much my friend ! Very appreciated :)
5. ## Checking for offboard squares with bitboards (vs padded array)

I was planning to loop through each piece in every direction and check for available moves until i hit the edge of the board.. but i guess that i can simply get the available squares by means of bit operations on the relevant bitboards?
6. ## Checking for offboard squares with bitboards (vs padded array)

Thx for the responses. Alvaro, I read your comment but i'm having a little hard time to understand it completely. Let's say the white queen is on A8,now it can't move north anymore cause there is no more board left. I need to make some kind of validation.. If I try translate ir to bitboard terms, A8 is the 57th bit, and if I do <<8 I will get strange results. what am missing here?? Please bare with me , like you said..thinking OUTSIDE of the board requires a change in how you look at things. Thx
7. ## Checking for offboard squares with bitboards (vs padded array)

I am currently starting to work on a chess engine. With padded array it is easy to check for offboard squares,  but what if I want to use bitboards to represent the board, how should I make this validation?      should I keep a padded array (along with the bitboards)  for those checks or there are maybe another more effiecient / bitboard oriented solutions ?   Thx
8. ## Best approach for pattern recognition in Gomoku

Thanks!  I will explore this further
9. ## Best approach for pattern recognition in Gomoku

I am working on a little Gomoku engine, this project s mainly for learning and practicing in programming and the C language, and it is also fun I want to represent the board with Bit-Boards , so I can do pattern checking for the evalution function and checkWin function etc.    first thing,  because the board is huge (15x15), I need to hold more than one bit word for each player representing the board.     one idea I got from a forum member here is to have 15  16-bit words for each player,every word represents a row.  the board will look like this:   29   28   27   26   25   24 23 22 21 20 19 18 17 16 15  .... 14   13   12   11   10   9   8   7   6   5   4   3   2   1   0   But here comes my dillema.     let's say I want to check a certain row for a threat pattern that looks like this:   011110 (1E Hex, 30 Dec),  than i will go through every 6 bits in that row (and shift the row >> by 1 in every iteration) and with a & operation check if there is a match.   And I will do this for every threat pattern I want to check.    So far it sound good, and also pretty fast the way I see it.    But checking the rows is easy becuase I have them ready in bit sets.   but what about the columns and diagonals? (even harder then columns!)   How can check for a bit- pattern match if i don't have the columns and diagonals already in my disposal  (like the rows).  ?      The way i see it, I can "generate" a new 16 bit word each time I want to check for a certain column/diagonal, by means of starting from an empty number ( unsigned short y = 0) and than construct it one by one (with | operation or +...) by going through the rows at the right indexes.   and than, after i have a ready to go bit-word, i can again do the bit pattern checking to see if i have a threat someplace in that line.   just like i do for the rows.   Hope i am understood      But it seems like very ineffiecient and slow way to do this, because imagine that in the evaluation function i will have to do this "construction" operation for every vertical and diagonal line on the board  (unlike the check win function where i can just do this for the last played square!). So my way to get around this, is to just have the diagonal and columns already in my disposal,(every player with have 15 rows,15 columns,21 left diagonals and another 21 right diagonals)  so actually when i make a move on the board, I will have to play it on the row,columns and both diagonals for the played square (for each player!).     But than i can just go through all the lines and do the pattern checking.  The penalty will be a slightly slower make and unmake move functions ,but the evaluation function and check win functions the operation will be much much faster.   It seems like a good idea, But i wonder if you maybe can suggest me better approach,  Maybe there is a way to check for patterns on bit boards in a more clever way than this naive way.     My first considertion is performance ofcourse, so ican search for a deeper depth in less time.  The search space in Gomoku is huge already! Thx
10. ## Generate moves in Gomoku

Oh..that's ok :) just wanted to make sure i am not missing something.   Thx a lot !
11. ## Generate moves in Gomoku

I don't understand something in the second option.    let's say i played a move on the board, and than raised the relevant indexes in the neighbor_count array.     shouldn't I mark squares that are already been played at?  (e.g make them not valuable).    right now, I just keep the counter in the neighbor_count array as it is for squres that were valuable in the past and are not anymore.      when i pass through the neighbor_count array looking for playable squares, i don't want to play in a square that has already been played.     Or maybe I should check if  board[square] == 0  also?   I hope i made myself clear
12. ## Generate moves in Gomoku

Thank you very much,  great ideas!
13. ## Generate moves in Gomoku

I wonder if any of you can suggest a better and faster way to do the "valuable square" checking routine that i do.    what i do is, i pass through all the 225 squares on the board,and check if a certain square is "valuable" .  a "valuable" square is a square that is no more than two steps away from an existing token on the board..computer's or opponent's.   And it is also has to be empty.        I  am using a single dimension array in size 225 for the board representation, and this is how it looks like: 0   1   2   3   4   5   6   7   8   9   10   11   12   13   14 15 16 17...   and 13 more rows like this     My  checkValuableSquare(int square)   method is as follows:   I simply pass thourgh all possible 8 directions away from the square, and if i stumble upon a player i return true (e.g 1).     int isValuableSquare(int square){     if(board[square] != 0){       //  0 is an empty square,  1 for computer player and -1 for human opponent.          return 0;                        // if square != 0 that means that it is not playable so i return 0;     }     else{         int point;         point = square;         //check left        while(!isBorder(point,LEFT) && point > square-2){             point--;             if(board[point] != 0){                 return 1;             }         }           point = square;         //check right         while(!isBorder(point,RIGHT) && point < square+2){             point++;             if(board[point] != 0){                 return 1;             }         }           point = square;         //check top        while(!isBorder(point,TOP) && point > square-30){             point-=15;             if(board[point] != 0){                 return 1;             }         }           point = square;         //check bottom         while(!isBorder(point,BOTTOM) && point < square+30){             point+=15;             if(board[point] != 0){                 return 1;             }         }           point = square;         //check up left         while(!isBorder(point,TOP) && !isBorder(point,LEFT) && point > square-32){             point-=16;             if(board[point] != 0){                 return 1;             }         }           point = square;         //check up right        while(!isBorder(point,TOP) && !isBorder(point,RIGHT) && point > square-28){             point-=14;             if(board[point] != 0){                 return 1;             }         }           point = square;         //check down right        while(!isBorder(point,BOTTOM) && !isBorder(point,RIGHT) && point < square+32){             point+=16;             if(board[point] != 0){                 return 1;             }         }           point = square;         //check down left         while(!isBorder(point,BOTTOM) && !isBorder(point,LEFT) && point < square+28){             point+=14;             if(board[point] != 0){                 return 1;             }         }           return 0;     } }      I have another function that tells me if a certain square is a border square.  this is the isBorder()  function:  it takes the square and an  enum Direction {TOP,BOTTOM,LEFT,RIGHT}  as parameters.   int isBorder(int square,Direction direction){     switch(direction){         case TOP:             return square/15 == 0;         case BOTTOM:             return square/15 == 14;         case LEFT:             return square%15 == 0;         case RIGHT:             return square%15 == 14;     } }   I hope that this code is not too messy..I would like to get better suggestions and corrections for this method.  thx!
14. ## Killer moves heuristic question

Yeah..you are right :)   thx!

Thank you!