這篇文章主要為大家詳細介紹了C語言實現——《國際象棋項目》,它和中國象棋可不一樣喲!文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下!
游戲介紹:
國際象棋(Chess),又稱西洋棋,是一種二人對弈的棋類游戲。
棋盤為正方形,由64個黑白(深色與淺色)相間的格子組成;棋子分黑白(深色與淺色)兩方共32枚,每方各16枚。雖然漢語稱之為西洋棋或國際象棋,但是實際上它起源于亞洲,后由阿拉伯人傳入歐洲,成為國際通行棋種。
行棋規則
國際象棋是雙方對下的,一方用白棋,一方用黑棋。對局由執白者先行,每次走一步,雙方輪流行棋,直到對局結束。各種棋子的一般走法如下:
王(K):橫、直、斜都可以走,但每次限走一步。王是不可以送吃的,即任何被敵方控制的格子,己方王都不能走進去。否則,算“送王”犯規,三次就要判負。
(1)除易位時外,王可走到不被對方棋子攻擊的任何相鄰格子,而且只能走一步(著)。
(2)易位是由王和己方任何一個車一起進行的仍被視作王的一步(著)的走法。
后(Q):橫、直、斜都可以走,步數不受限制,但不能越子。
車(R):橫、豎均可以走,步數不受限制,不能斜走。除王車易位外不能越子。
象(B):只能斜走。格數不限,不能越子。開局時每方有兩象,一個占白格,一個占黑格。
馬(N):每步棋先橫走或直走一格,然后再往外斜走一格;或者先斜走一格,最后再往外橫走或豎走一格(即走“日”字)。可以越子,沒有中國象棋中的“蹩馬腿”限制。
兵(P):只能向前直走,每次只能走一格。但走第一步時,可以走一格或兩格。兵的吃子方法與行棋方向不一樣,它是直走斜吃,即如果兵的斜進一格內有對方棋子,就可以吃掉它而占據該格。
行棋規則大家一定要理解,因為這個關系到你實現這個國際象棋項目的規則邏輯部分!
插件:圖形庫插件easyX,涉及圖片素材可以自行百度找也可以關注文末領??;
源代碼示例:
//記錄一個棋子落點
struct MyPoint{
int x;
int y;
};
//用來保存 單數次 鼠標左鍵點擊 和雙數次鼠標左鍵點擊
struct MyPoint set[2];
int n = 0;//記錄當前是第N次鼠標左鍵按下
//圖片變量
IMAGE 黑棋盤img, 白棋盤img, 卒子A黑img, 卒子B黑img, 車A黑img, 車B黑img, 國王A黑img, 國王B黑img, 馬A黑img, 馬B黑img, 象A黑img, 象B黑img, 皇后A黑img, 皇后B黑img, 卒子A白img, 卒子B白img, 車A白img, 車B白img, 國王A白img, 國王B白img, 馬A白img, 馬B白img, 象A白img, 象B白img, 皇后A白img, 皇后B白img;
//枚舉 為了代碼容易閱讀而寫
enum state{
黑棋盤, 白棋盤,
卒子A黑, 卒子B黑, 車A黑, 車B黑, 國王A黑, 國王B黑, 馬A黑, 馬B黑, 象A黑, 象B黑, 皇后A黑, 皇后B黑,
卒子A白, 卒子B白, 車A白, 車B白, 國王A白, 國王B白, 馬A白, 馬B白, 象A白, 象B白, 皇后A白, 皇后B白
};
//1 游戲初始化 做窗口 定義圖片變量 加載圖片 數據
void initGame();
//2 繪制界面
//2.1 圖形界面
void drawGame(int map[8][8]);
//2.2 命令行界面
void printGame(int map[8][8]);
//3 控制游戲
//3.1 鼠標控制下棋
void xiaqi(int map[8][8]);
//3.1 落子
void luozi(int map[8][8]);
int main(){
//地圖
int map[8][8] = {
{ 車B白, 馬B黑, 象B白, 國王B黑, 皇后B白, 象B黑, 馬B白, 車B黑 },
{ 卒子B黑, 卒子B白, 卒子B黑, 卒子B白, 卒子B黑, 卒子B白, 卒子B黑, 卒子B白 },
{ 白棋盤, 黑棋盤, 白棋盤, 黑棋盤, 白棋盤, 黑棋盤, 白棋盤, 黑棋盤 },
{ 黑棋盤, 白棋盤, 黑棋盤, 白棋盤, 黑棋盤, 白棋盤, 黑棋盤, 白棋盤 },
{ 白棋盤, 黑棋盤, 白棋盤, 黑棋盤, 白棋盤, 黑棋盤, 白棋盤, 黑棋盤 },
{ 黑棋盤, 白棋盤, 黑棋盤, 白棋盤, 黑棋盤, 白棋盤, 黑棋盤, 白棋盤 },
{ 卒子A白, 卒子A黑, 卒子A白, 卒子A黑, 卒子A白, 卒子A黑, 卒子A白, 卒子A黑 },
{ 車A黑, 馬A白, 象A黑, 皇后A白, 國王A黑, 象A白, 馬A黑, 車A白 }
};
initGame();
//創建線程 實時獲取鼠標情況 根據鼠標情況來修改界面
while (1){
drawGame(map);
printGame(map);
xiaqi(map); //獲取鼠標的坐標 和 鼠標是否按下 getMouseMsg 阻塞
//Sleep(20);
}
return 0;
}
//1 游戲初始化 做窗口 定義圖片變量 加載圖片 數據
void initGame(){
// 窗口寬 窗口高 自帶命令行窗口
initgraph(8 * SPACE, 8 * SPACE, SHOWCONSOLE);
//把素材放到和源程序文件一起(編譯器運行)
//把素材放到和可執行程序文件(*.exe)一起(直接雙擊運行)
loadimage(&黑棋盤img, L"黑棋盤.bmp", SPACE, SPACE, true);
loadimage(&白棋盤img, L"白棋盤.bmp", SPACE, SPACE, true);
loadimage(&卒子A黑img, L"卒子A黑.bmp", SPACE, SPACE, true);
loadimage(&卒子B黑img, L"卒子B黑.bmp", SPACE, SPACE, true);
loadimage(&車A黑img, L"車A黑.bmp", SPACE, SPACE, true);
loadimage(&車B黑img, L"車B黑.bmp", SPACE, SPACE, true);
loadimage(&國王A黑img, L"國王A黑.bmp", SPACE, SPACE, true);
loadimage(&國王B黑img, L"國王B黑.bmp", SPACE, SPACE, true);
loadimage(&馬A黑img, L"馬A黑.bmp", SPACE, SPACE, true);
loadimage(&馬B黑img, L"馬B黑.bmp", SPACE, SPACE, true);
loadimage(&象A黑img, L"象A黑.bmp", SPACE, SPACE, true);
loadimage(&象B黑img, L"象B黑.bmp", SPACE, SPACE, true);
loadimage(&皇后A黑img, L"皇后A黑.bmp", SPACE, SPACE, true);
loadimage(&皇后B黑img, L"皇后B黑.bmp", SPACE, SPACE, true);
loadimage(&卒子A白img, L"卒子A白.bmp", SPACE, SPACE, true);
loadimage(&卒子B白img, L"卒子B白.bmp", SPACE, SPACE, true);
loadimage(&車A白img, L"車A白.bmp", SPACE, SPACE, true);
loadimage(&車B白img, L"車B白.bmp", SPACE, SPACE, true);
loadimage(&國王A白img, L"國王A白.bmp", SPACE, SPACE, true);
loadimage(&國王B白img, L"國王B白.bmp", SPACE, SPACE, true);
loadimage(&馬A白img, L"馬A白.bmp", SPACE, SPACE, true);
loadimage(&馬B白img, L"馬B白.bmp", SPACE, SPACE, true);
loadimage(&象A白img, L"象A白.bmp", SPACE, SPACE, true);
loadimage(&象B白img, L"象B白.bmp", SPACE, SPACE, true);
loadimage(&皇后A白img, L"皇后A白.bmp", SPACE, SPACE, true);
loadimage(&皇后B白img, L"皇后B白.bmp", SPACE, SPACE, true);
}
//2 繪制界面
//2.1 圖形界面
void drawGame(int map[8][8]){
for (int i = 0; i < 8; i++){
for (int j = 0; j < 8; j++){
switch (map[i][j]){
case 黑棋盤:putimage(j*SPACE, i*SPACE, &黑棋盤img); break;
case 白棋盤:putimage(j*SPACE, i*SPACE, &白棋盤img); break;
case 卒子A黑:putimage(j*SPACE, i*SPACE, &卒子A黑img); break;
case 卒子B黑:putimage(j*SPACE, i*SPACE, &卒子B黑img); break;
case 車A黑: putimage(j*SPACE, i*SPACE, &車A黑img); break;
case 車B黑: putimage(j*SPACE, i*SPACE, &車B黑img); break;
case 國王A黑:putimage(j*SPACE, i*SPACE, &國王A黑img); break;
case 國王B黑:putimage(j*SPACE, i*SPACE, &國王B黑img); break;
case 馬A黑: putimage(j*SPACE, i*SPACE, &馬A黑img); break;
case 馬B黑: putimage(j*SPACE, i*SPACE, &馬B黑img); break;
case 象A黑: putimage(j*SPACE, i*SPACE, &象A黑img); break;
case 象B黑: putimage(j*SPACE, i*SPACE, &象B黑img); break;
case 皇后A黑:putimage(j*SPACE, i*SPACE, &皇后A黑img); break;
case 皇后B黑:putimage(j*SPACE, i*SPACE, &皇后B黑img); break;
case 卒子A白:putimage(j*SPACE, i*SPACE, &卒子A白img); break;
case 卒子B白:putimage(j*SPACE, i*SPACE, &卒子B白img); break;
case 車A白: putimage(j*SPACE, i*SPACE, &車A白img); break;
case 車B白: putimage(j*SPACE, i*SPACE, &車B白img); break;
case 國王A白:putimage(j*SPACE, i*SPACE, &國王A白img); break;
case 國王B白:putimage(j*SPACE, i*SPACE, &國王B白img); break;
case 馬A白: putimage(j*SPACE, i*SPACE, &馬A白img); break;
case 馬B白: putimage(j*SPACE, i*SPACE, &馬B白img); break;
case 象A白: putimage(j*SPACE, i*SPACE, &象A白img); break;
case 象B白: putimage(j*SPACE, i*SPACE, &象B白img); break;
case 皇后A白:putimage(j*SPACE, i*SPACE, &皇后A白img); break;
case 皇后B白:putimage(j*SPACE, i*SPACE, &皇后B白img); break;
default:break;
}
}
}
}
//2.2 命令行界面
void printGame(int map[8][8]){
//system("cls");//清屏
for (int i = 0; i < 8; i++){
for (int j = 0; j < 8; j++){
printf("%02d ", map[i][j]);
}
printf(" ");
}
}
void xiaqi(int map[8][8]){
//點兩下 //第一下 選中棋子 //第二下 落子
//偶數次 //奇數次
int idx = n % 2;
MOUSEMSG msg;
msg = GetMouseMsg();//獲取鼠標信息
if (msg.mkLButton){//鼠標左鍵按下
set[idx].x = msg.x /SPACE;
set[idx].y = msg.y / SPACE;
printf("坐標:%d %d 下標:%d %d ", msg.x, msg.y, set[idx].x, set[idx].y);
if (1 == idx){//落子
luozi(map);
}
n++;
}
}
//3.1 落子
void luozi(int map[8][8]){
switch (map[set[0].y][set[0].x]){//判斷 set[0] 位置是什么棋子
case 卒子A黑:
//判斷 能不能移動到 set[1]位置 如果能 就移動
if (set[0].y - set[1].y == 1){//往上走一格
map[set[0].y][set[0].x] = 黑棋盤;//本來位置變成黑棋盤
map[set[1].y][set[1].x] = 卒子A白;//目的地位置變成卒子A白
}
break;
case 卒子A白:
//判斷 能不能移動到 set[1]位置 如果能 就移動
if (set[0].y - set[1].y == 1){//往上走一格
map[set[0].y][set[0].x] = 白棋盤;//本來位置變成黑棋盤
map[set[1].y][set[1].x] = 卒子A黑;//目的地位置變成卒子A白
}
break;
}
}
未完成的棋子代碼,大家也可以自己先去想想試試,每一次的思考就是你進步的過程!
責任編輯:haq
-
C語言
+關注
關注
180文章
7614瀏覽量
137293 -
代碼
+關注
關注
30文章
4813瀏覽量
68837
原文標題:C語言項目實戰:《國際象棋》零基礎項目!200 行源代碼示例
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論