這篇文章主要為大家詳細介紹了C語言實現——《國際象棋項目》,它和中國象棋可不一樣喲!文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小夥伴們可以參考一下!
遊戲介紹:
國際象棋(Chess),又稱西洋棋,是一種二人對弈的棋類遊戲。
棋盤為正方形,由64個黑白(深色與淺色)相間的格子組成;棋子分黑白(深色與淺色)兩方共32枚,每方各16枚。雖然漢語稱之為西洋棋或國際象棋,但是實際上它起源于亞洲,後由阿拉伯人傳入歐洲,成為國際通行棋種。
行棋規則國際象棋是雙方對下的,一方用白棋,一方用黑棋。對局由執白者先行,每次走一步,雙方輪流行棋,直到對局結束。各種棋子的一般走法如下:
王(K):橫、直、斜都可以走,但每次限走一步。王是不可以送吃的,即任何被敵方控制的格子,己方王都不能走進去。否則,算“送王”犯規,三次就要判負。
(1)除易位時外,王可走到不被對方棋子攻擊的任何相鄰格子,而且隻能走一步(着)。
(2)易位是由王和己方任何一個車一起進行的仍被視作王的一步(着)的走法。
後(Q):橫、直、斜都可以走,步數不受限制,但不能越子。
車(R):橫、豎均可以走,步數不受限制,不能斜走。除王車易位外不能越子。
象(B):隻能斜走。格數不限,不能越子。開局時每方有兩象,一個占白格,一個占黑格。
馬(N):每步棋先橫走或直走一格,然後再往外斜走一格;或者先斜走一格,最後再往外橫走或豎走一格(即走“日”字)。可以越子,沒有中國象棋中的“蹩馬腿”限制。
兵(P):隻能向前直走,每次隻能走一格。但走第一步時,可以走一格或兩格。兵的吃子方法與行棋方向不一樣,它是直走斜吃,即如果兵的斜進一格内有對方棋子,就可以吃掉它而占據該格。
行棋規則大家一定要理解,因為這個關系到你實現這個國際象棋項目的規則邏輯部分!
插件:圖形庫插件easyX,涉及圖片素材可以自行百度找也可以關注文末領取;
效果圖展示
配套講解教程:國際象棋遊戲教程——哔哩哔哩
源代碼示例:
#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/C 感興趣可以關注小編在後台私信我:【編程交流】一起來學習哦!可以領取一些C/C 的項目學習視頻資料哦!已經設置好了關鍵詞自動回複,自動領取就好了!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!