0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用C語(yǔ)言實(shí)現(xiàn)國(guó)際象棋項(xiàng)目

C語(yǔ)言編程學(xué)習(xí)基地 ? 來(lái)源:C語(yǔ)言編程學(xué)習(xí)基地 ? 作者:C語(yǔ)言編程學(xué)習(xí)基地 ? 2021-11-21 16:40 ? 次閱讀

這篇文章主要為大家詳細(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)??;

源代碼示例:

#include  //要先安裝 easyX 到你的編譯器 #include 
#define SPACE  80
//記錄一個(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


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    商湯科技元蘿卜國(guó)際象棋機(jī)器人9月上市

    商湯科技旗下的家用機(jī)器人品牌“元蘿卜SenseRobot”近期推出了一款創(chuàng)新力作——元蘿卜AI下棋機(jī)器人國(guó)際象棋專業(yè)版。這款機(jī)器人不僅在技術(shù)上實(shí)現(xiàn)了突破,能夠精準(zhǔn)地通過(guò)機(jī)械爪拾取立體棋子,更在功能上實(shí)現(xiàn)了多元化,集人機(jī)對(duì)弈、人人
    的頭像 發(fā)表于 08-26 14:52 ?352次閱讀

    何用C語(yǔ)言實(shí)現(xiàn)高效查找(二分法)

    今天給分享一下使用C語(yǔ)言實(shí)現(xiàn)二分算法,主要包含以下幾部分內(nèi)容:二分查找算法介紹二分查找算法使用場(chǎng)景二分查找算法代碼實(shí)現(xiàn)二分查找算法實(shí)現(xiàn)過(guò)程用C
    的頭像 發(fā)表于 06-04 08:04 ?832次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言實(shí)現(xiàn)</b>高效查找(二分法)

    使用C語(yǔ)言實(shí)現(xiàn)的CRC計(jì)算單元的例子

    使用C語(yǔ)言實(shí)現(xiàn)的CRC計(jì)算單元的例子
    的頭像 發(fā)表于 05-16 16:16 ?756次閱讀

    嵌入式編程,如何用 C 語(yǔ)言實(shí)現(xiàn)狀態(tài)機(jī)設(shè)計(jì)?

    狀態(tài)機(jī)模式是一種行為模式,通過(guò)多態(tài)實(shí)現(xiàn)不同狀態(tài)的調(diào)轉(zhuǎn)行為的確是一種很好的方法,只可惜在嵌入式環(huán)境下,有時(shí)只能寫純C代碼,并且還需要考慮代碼的重入和多任務(wù)請(qǐng)求跳轉(zhuǎn)等情形,因此實(shí)現(xiàn)起來(lái)著實(shí)需要一番考慮
    發(fā)表于 04-23 11:00

    C語(yǔ)言實(shí)現(xiàn)Web參數(shù)傳遞

    電子發(fā)燒友網(wǎng)站提供《C語(yǔ)言實(shí)現(xiàn)Web參數(shù)傳遞.docx》資料免費(fèi)下載
    發(fā)表于 03-24 09:14 ?2次下載

    ADUC7061如何使用C語(yǔ)言實(shí)現(xiàn)EEPROM功能?

    我使用ADUC7061做的信號(hào)采集,現(xiàn)在客戶需要實(shí)現(xiàn)EEPROM功能來(lái)保存3-5個(gè)數(shù)據(jù),請(qǐng)問(wèn)如何使用C語(yǔ)言實(shí)現(xiàn)?不使用外部EEPROM 專用IC。
    發(fā)表于 01-12 06:56

    單軸PSO視覺(jué)飛拍與精準(zhǔn)輸出:EtherCAT超高速實(shí)時(shí)運(yùn)動(dòng)控制卡XPCIE1032H上位機(jī)C#開(kāi)發(fā)(七)

    正運(yùn)動(dòng)技術(shù)EtherCAT控制卡在VS平臺(tái)采用C#語(yǔ)言實(shí)現(xiàn)的各種PSO功能。
    的頭像 發(fā)表于 01-03 09:50 ?958次閱讀
    單軸PSO視覺(jué)飛拍與精準(zhǔn)輸出:EtherCAT超高速實(shí)時(shí)運(yùn)動(dòng)控制卡XPCIE1032H上位機(jī)<b class='flag-5'>C</b>#開(kāi)發(fā)(七)

    C語(yǔ)言構(gòu)建高效的嵌入式程序

    嵌入式工程師在編寫C語(yǔ)言程序時(shí),需要注重效率和清晰的思路。本文將通過(guò)解析經(jīng)典問(wèn)題“猴子選大王”來(lái)展示如何用C語(yǔ)言思維方式構(gòu)建高效、清晰的程序
    的頭像 發(fā)表于 12-21 09:27 ?569次閱讀

    visualc++怎么新建c語(yǔ)言文件

    Visual C++ 是一個(gè)集成開(kāi)發(fā)環(huán)境(IDE),用于開(kāi)發(fā) CC++ 程序。在 Visual C++ 中,新建一個(gè) C
    的頭像 發(fā)表于 11-27 15:57 ?3311次閱讀

    C語(yǔ)言實(shí)用程序150例

    電子發(fā)燒友網(wǎng)站提供《C語(yǔ)言實(shí)用程序150例.rar》資料免費(fèi)下載
    發(fā)表于 11-20 11:37 ?1次下載
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言實(shí)</b>用程序150例

    C語(yǔ)言何用/* */ 注釋?

    有些早期的C編譯器對(duì)這種注釋是不支持的。代碼要做到全平臺(tái)兼容,這點(diǎn)是必須要考慮的。 因此,老外定義的C語(yǔ)言軟件規(guī)范,無(wú)論是MISRA還是CMMI,一般都要求所有代碼注釋必須使用/**/。
    的頭像 發(fā)表于 11-13 12:33 ?568次閱讀

    blue-ethernet高性能FPGA網(wǎng)絡(luò)數(shù)據(jù)包處理項(xiàng)目簡(jiǎn)介

    blue-ethernet項(xiàng)目使用Bluespec SystemVerilog(BSV)硬件描述語(yǔ)言實(shí)現(xiàn)了一系列在FPGA上加速網(wǎng)絡(luò)數(shù)據(jù)包處理的硬件模塊。
    的頭像 發(fā)表于 11-13 10:44 ?1129次閱讀
    blue-ethernet高性能FPGA網(wǎng)絡(luò)數(shù)據(jù)包處理<b class='flag-5'>項(xiàng)目</b>簡(jiǎn)介

    何用C語(yǔ)言實(shí)現(xiàn)線程池

    線程池是一種多線程處理形式,大多用于高并發(fā)服務(wù)器上,它能合理有效的利用高并發(fā)服務(wù)器上的線程資源;線程與進(jìn)程用于處理各項(xiàng)分支子功能,我們通常的操作是:接收消息 ==> 消息分類 ==> 線程創(chuàng)建 ==> 傳遞消息到子線程 ==> 線程分離 ==> 在子線程中執(zhí)行任務(wù) ==> 任務(wù)結(jié)束退出; 對(duì)大多數(shù)小型局域網(wǎng)的通信來(lái)說(shuō),上述方法足夠滿足需求;但當(dāng)我們的通信范圍擴(kuò)大到廣域網(wǎng)或大型局域網(wǎng)通信中時(shí),我們將面臨大量消息頻繁請(qǐng)求服務(wù)器;在這種情況下,創(chuàng)
    的頭像 發(fā)表于 11-13 10:41 ?936次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言實(shí)現(xiàn)</b>線程池

    基于VHDL語(yǔ)言實(shí)現(xiàn)遠(yuǎn)程防盜報(bào)警設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《基于VHDL語(yǔ)言實(shí)現(xiàn)遠(yuǎn)程防盜報(bào)警設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 11-08 14:33 ?0次下載
    基于VHDL<b class='flag-5'>語(yǔ)言實(shí)現(xiàn)</b>遠(yuǎn)程防盜報(bào)警設(shè)計(jì)

    何用C語(yǔ)言開(kāi)發(fā)DSP嵌入式系統(tǒng)?

    何用C語(yǔ)言開(kāi)發(fā)DSP嵌入式系統(tǒng)? DSP嵌入式系統(tǒng)開(kāi)發(fā)是一個(gè)非常重要的領(lǐng)域,它涉及到設(shè)備的控制、數(shù)據(jù)的處理、系統(tǒng)的優(yōu)化等多種方面,因此,掌握這方面的技術(shù)非常重要。 在本文中,將詳細(xì)探討如何用
    的頭像 發(fā)表于 10-29 17:29 ?1129次閱讀