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