Qt中國象棋之棋子規則

2021-09-27 08:37:00 字數 2863 閱讀 2204

中國象棋中各棋子的規則

此棋子是中國象棋中棋力最強的棋子,每行一步棋可以上、下直線行走(進、退);左、右橫走(中間不隔棋子),且行棋步數不限,但不可以走對角線。不過車吃棋的話沒有其他條件限制,只要在他的行走範圍之內就可以被他吃掉。

車能否移動到目標位置(座標)

bool chessboard::canmoveche(int moveid, int targetid, int row, int col)

return false;

}

計算棋子到目標位置(座標)之間有多少個棋子,用於車和炮的移動

/*計算被選中棋子到目標座標之間棋子個數*/

int chessboard::getpiecescountatline(int id, int row, int col)

/*判斷兩個棋盤上的座標是否在同一條直線上(同一行或者同一列)*/

if(row1 != row && col1 != col)

/*記錄兩座標中間棋子個數*/

int count = 0;

/*兩個座標在同一行*/

if(row1 == row)

/*有沒蹩馬腿*/

if(r == 12)

} else

}return true;

}

此棋子不能越過河界走入對方的領地,「象走田『這是我們另乙個通俗的叫法,理解起也就是象必須走四個小格仔的對角線,但如果四個小格仔的中間有其他的棋子,象則不能走。象的主要任務是防守,所以不能越過河界,只能在己方這邊行走。

bool chessboard::canmovexiang(int moveid, int targetid, int row, int col)

/*象眼是否有棋子*/

int reye = (pieces[moveid].row+row)/2;

int ceye = (pieces[moveid].col+col)/2;

if(getpiecesid(reye, ceye) != -1)

/*象不能過河*/

if(pieces[moveid].isred)

} else

}return true;

}

士(仕)是帥(將)的貼身保衛,只能在九宮(畫了斜線的四個小格仔)之內行走,而且它每步只能走乙個小格仔的對角線,不能平移,可進可退。

bool chessboard::canmoveshi(int moveid, int targetid, int row, int col)

if(col<3 || col>5)

if(pieces[moveid].isred)

} else

}return true;

}

雖然名稱不同,但它們這都是對壘雙方的最高統帥,對壘的目的就是通過運用各自的棋子,想方設法將對方的首領將死,方為己方勝利。這兩位棋子的最高統帥,只能在九宮內行走,不得走出九宮外。行走的步法為:左、右橫走,上、下豎走都行,但每次只能行走一格。將和帥不准在同一直線上直接對面(中間無棋子),如一方已先佔據位置,則另一方必須迴避,否則就算輸了。

bool chessboard::canmovejiang(int moveid, int targetid, int row, int col)

}/*將在九宮內一步一步走*/

int r = qabs(pieces[moveid].row-row)*10 + qabs(pieces[moveid].col-col);

if(r != 1 && r != 10)

if(col<3 || col>5)

if(pieces[moveid].isred)

} else

}return true;

}

此棋的行棋規則和車(車)類似,橫平、豎直,只要前方沒有棋子的地方都能行走。但是,它的吃棋規則很特別,必須跳過乙個棋子(無論是己方的還是對方的)去吃掉對方的乙個棋子。

bool chessboard::canmovepao(int moveid, int targetid, int row, int col)

/*吃棋子*/

if(targetid != -1 && getpiecescountatline(moveid, row, col) == 1)

return false;

}

兵、卒是永遠不能後退的。在沒過河界之前,兵、卒只能一步一步往前走;過了河界之後,兵、卒可以選擇往前、左以及右行走。記住,兵卒每次只能行走一步。

bool chessboard::canmovebing(int moveid, int targetid, int row, int col)

if(pieces[moveid].isred)

/*沒過河不能左右走*/

if(pieces[moveid].row < 5 && pieces[moveid].row == row)

} else

if(pieces[moveid].row > 4 && pieces[moveid].row == row)

}return true;

}

(二)QT實現中國象棋(棋子實現)

簡介 第二部份主要功能是在棋盤上畫棋子,使用到幾個重要函式把陣列下標轉換為畫素等。1 工程中新增主要檔案如下所示 short num short x,short y,short size 將畫素轉化為陣列下標 else n 0 return n short posx short n,short si...

中國象棋 QT版

由於當時對象棋人工智慧非常感興趣,索性自己藉著實踐qt又重新開發了乙個。這個版本通過參考圖書館借的 c 中國象棋入門與提高 從頭到尾自己徹徹底底做了一遍,雖然到最後因為有別的事沒有把啟發式演算法寫入,總的來說打菜鳥還是很輕鬆的。其實工作量真的挺大的,ui 後台全由自己設計。演算法方面 1 棋子的走法...

Qt開發之中國象棋篇(四) 棋子移動(上)

有了前兩篇的象棋棋盤和象棋棋子的鋪墊,那麼基本的象棋的雛形就出來,接下來要完善各個棋子行走的規則就可以讓棋子移動起來,在貼 之前,讓我們回想一下象棋棋子的行走規則吧!在象棋中 士走斜線,象走田字格,馬走日子格,車和炮都能直接移動,兵只能前進,不能後退,過河不能左右移動,過河後可以移動,將只能在規定的...