首页
/
每日頭條
/
科技
/
用c語言編寫象棋的代碼
用c語言編寫象棋的代碼
更新时间:2024-05-02 20:40:38

這篇文章主要為大家詳細介紹了C語言實現——《國際象棋項目》它和中國象棋可不一樣喲!文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小夥伴們可以參考一下!

用c語言編寫象棋的代碼(國際象棋零基礎項目)1

遊戲介紹:

國際象棋(Chess),又稱西洋棋,是一種二人對弈的棋類遊戲。

棋盤為正方形,由64個黑白(深色與淺色)相間的格子組成;棋子分黑白(深色與淺色)兩方共32枚,每方各16枚。雖然漢語稱之為西洋棋或國際象棋,但是實際上它起源于亞洲,後由阿拉伯人傳入歐洲,成為國際通行棋種。

行棋規則

國際象棋是雙方對下的,一方用白棋,一方用黑棋。對局由執白者先行,每次走一步,雙方輪流行棋,直到對局結束。各種棋子的一般走法如下:

王(K):橫、直、斜都可以走,但每次限走一步。王是不可以送吃的,即任何被敵方控制的格子,己方王都不能走進去。否則,算“送王”犯規,三次就要判負。

(1)除易位時外,王可走到不被對方棋子攻擊的任何相鄰格子,而且隻能走一步(着)。

(2)易位是由王和己方任何一個車一起進行的仍被視作王的一步(着)的走法。

後(Q):橫、直、斜都可以走,步數不受限制,但不能越子。

車(R):橫、豎均可以走,步數不受限制,不能斜走。除王車易位外不能越子。

象(B):隻能斜走。格數不限,不能越子。開局時每方有兩象,一個占白格,一個占黑格。

馬(N):每步棋先橫走或直走一格,然後再往外斜走一格;或者先斜走一格,最後再往外橫走或豎走一格(即走“日”字)。可以越子,沒有中國象棋中的“蹩馬腿”限制。

兵(P):隻能向前直走,每次隻能走一格。但走第一步時,可以走一格或兩格。兵的吃子方法與行棋方向不一樣,它是直走斜吃,即如果兵的斜進一格内有對方棋子,就可以吃掉它而占據該格。

行棋規則大家一定要理解,因為這個關系到你實現這個國際象棋項目的規則邏輯部分!

插件:圖形庫插件easyX,涉及圖片素材可以自行百度找也可以關注文末領取;

效果圖展示

用c語言編寫象棋的代碼(國際象棋零基礎項目)2

配套講解教程:國際象棋遊戲教程——哔哩哔哩

源代碼示例:

#include <graphics.h> //要先安裝 easyX 到你的編譯器 #include <stdio.h> #define SPACE 80 //記錄一個棋子落點 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("d ", map[i][j]); } printf("\n"); } } 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\n", 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; } }

未完成的棋子代碼,大家也可以自己先去想想試試,每一次的思考就是你進步的過程!

如果學習的過程中有什麼問題,以及本項目有什麼不懂的地方,都可以來找我交流,我來幫你!

那麼今天的分享就到這裡了,後續會更新更多精彩項目的,大家要好好學C語言C 喲~

寫在最後:對于準備學習C/C 編程的小夥伴,如果你想更好的提升你的編程核心能力(内功)不妨從現在開始!

編程學習書籍分享:

用c語言編寫象棋的代碼(國際象棋零基礎項目)3

編程學習視頻分享:

用c語言編寫象棋的代碼(國際象棋零基礎項目)4

整理分享(多年學習的源碼、項目實戰視頻、項目筆記,基礎入門教程)

歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比自己琢磨更快哦!

對于C/C 感興趣可以關注小編在後台私信我:【編程交流】一起來學習哦!可以領取一些C/C 的項目學習視頻資料哦!已經設置好了關鍵詞自動回複,自動領取就好了!

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
Copyright 2023-2024 - www.tftnews.com All Rights Reserved