這篇文章主要為大家詳細介紹了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語言
+關注
關注
183文章
7644瀏覽量
145579 -
代碼
+關注
關注
30文章
4968瀏覽量
73960
原文標題:C語言項目實戰:《國際象棋》零基礎項目!200 行源代碼示例
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
C語言安全編碼指南:MISRA C、CERT C、CWE 與 C Secure 標準對比與Perforce QAC應用詳解
C語言來實現萬年歷
2026 CES 現象級焦點!元蘿卜全場景矩陣彰顯中國智造硬實力
C語言主要特點
如何用好 C 語言函數的返回值?
為什么單片機還在用C語言編程?
單片機C語言實例(350+例)
深入理解C語言:C語言循環控制
為什么學了C語言,卻寫不出像樣的項目?
如何用C語言實現國際象棋項目
評論