91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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-19 10:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)——《中國(guó)象棋項(xiàng)目》,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下!

游戲介紹:

中國(guó)象棋是由兩人輪流走子,在戰(zhàn)法上遵循古代孫子兵法中的“不戰(zhàn)而屈人之兵,善之善者也”的作戰(zhàn)思想,以“將死”或“困斃”對(duì)方將(帥)為勝的一種二人對(duì)抗性游戲。對(duì)局時(shí),由執(zhí)紅棋的一方先走,雙方輪流各走一招,直至分出勝、負(fù)、和,對(duì)局即終了。在棋戰(zhàn)中,人們可以從攻與防、虛與實(shí)、整體與局部等復(fù)雜關(guān)系的變化中提升思維能力。

每種棋子的行棋規(guī)則大家如果有不懂的地方,可以去了解一下,都很簡(jiǎn)單。你想要做出本項(xiàng)目,了解規(guī)則是必不可少的。

本項(xiàng)目編譯環(huán)境:VS2019/VS2013;

插件:圖形庫(kù)插件easyX,涉及圖片素材可以自行百度找也可以關(guān)注文末領(lǐng)?。?/p>

效果圖展示

配套講解教程:中國(guó)象棋游戲教程——嗶哩嗶哩

源代碼示例:

#include#include#define INTERVAL 50  //前面的間隔#define CHESS_GRID_SIZE 70  //格子寬度#define ROW  10#define COL  9enum PIECES//枚舉棋子{  車,馬,象,士,將,砲,卒,  俥,馬,相,仕,帥,炮,兵,  SPACE,BEGIN,END};//紅黑方棋子、int redChess[] = { 車, 馬, 象, 士, 將, 砲, 卒};int blackChess[] = { 俥, 馬, 相, 仕, 帥, 炮, 兵 };const char*chessName[] = { "車", "馬", "象", "士", "將", "砲", "卒", "俥", "馬", "相", "仕", "帥", "炮", "兵" };struct Chess//棋子屬性{  int x;  int y;  int id;//哪個(gè)棋子  int type;//是哪一方的棋子 紅,黑?  bool river;//判斷小兵是否過(guò)了河};struct Chess  map[ROW][COL];//結(jié)構(gòu)體數(shù)組,用來(lái)保存每一個(gè)點(diǎn)的信息POINT begin = { -1, -1 }, end = { -1, -1 };//保存前后兩次點(diǎn)擊的數(shù)組下標(biāo)int state = BEGIN;//初始化游戲數(shù)據(jù)void GameInit(){  for (int i = 0; i < ROW; i++)  {    for (int k = 0; k < COL; k++)    {      int chessname = SPACE;      int mcolor = BLACK;      //黑棋      if (i <= 4)      {        mcolor = BLACK;        //初始化第一行的棋子,        if (i == 0)        {          if (k <= 4)          {            chessname = blackChess[k];          }          else          {            chessname = blackChess[8-k];          }        }        //設(shè)置炮        if (i == 2 && (k == 1 || k == 7))        {          chessname = blackChess[砲];        }        //設(shè)置小兵        if (i == 3 && k % 2 == 0)        {          chessname = blackChess[卒];        }
      }      //紅棋      else       {        mcolor = RED;        //初始化第一行的棋子,        if (i == 9)        {          if (k <= 4)          {            chessname = redChess[k];          }          else          {            chessname = redChess[8 - k];          }        }        //設(shè)置炮        if (i == 7 && (k == 1 || k == 7))        {          chessname = redChess[炮];        }        //設(shè)置小兵        if (i == 6 && k % 2 == 0)        {          chessname = redChess[兵];        }      }      map[i][k].id = chessname;      map[i][k].river = false;      map[i][k].type = mcolor;      map[i][k].x = k*CHESS_GRID_SIZE + INTERVAL;      map[i][k].y = i*CHESS_GRID_SIZE + INTERVAL;    }  }}//游戲的繪制函數(shù)void GameDraw(){  //設(shè)置背景顏色 red black   setbkcolor(RGB(252, 215, 162));  cleardevice();
  //繪制棋盤  setlinecolor(BLACK);  setlinestyle(PS_SOLID, 2);  for (int i = 0; i < 10; i++)  {    //畫橫線    line(INTERVAL, i*CHESS_GRID_SIZE + INTERVAL, 8 * CHESS_GRID_SIZE + INTERVAL, i*CHESS_GRID_SIZE + INTERVAL);    //畫豎線    if (i < 9)    {      line(i*CHESS_GRID_SIZE + INTERVAL, INTERVAL, i*CHESS_GRID_SIZE + INTERVAL, 9 * CHESS_GRID_SIZE + INTERVAL);    }  }  rectangle(INTERVAL - 5, INTERVAL - 5, 8 * CHESS_GRID_SIZE + INTERVAL+5, 5+9 * CHESS_GRID_SIZE + INTERVAL);  //楚河漢界顯示  setfillcolor(RGB(252, 215, 162));  fillrectangle(INTERVAL, 4 * CHESS_GRID_SIZE + INTERVAL, 8 * CHESS_GRID_SIZE + INTERVAL, 5 * CHESS_GRID_SIZE + INTERVAL);  //顯示文字  char river[20] = "楚河        漢界";  settextstyle(50, 0, "楷體");  settextcolor(BLACK);  setbkmode(TRANSPARENT);  outtextxy(INTERVAL+100, 4 * CHESS_GRID_SIZE + INTERVAL+10, river);  //畫九宮格    //畫上面  line(3 * CHESS_GRID_SIZE + INTERVAL, INTERVAL, 5 * CHESS_GRID_SIZE + INTERVAL, 2 * CHESS_GRID_SIZE + INTERVAL);  line(3 * CHESS_GRID_SIZE + INTERVAL, 2 * CHESS_GRID_SIZE + INTERVAL, 5 * CHESS_GRID_SIZE + INTERVAL, INTERVAL);     //畫下面  line(3 * CHESS_GRID_SIZE + INTERVAL, 7 * CHESS_GRID_SIZE + INTERVAL, 5 * CHESS_GRID_SIZE + INTERVAL, 9 * CHESS_GRID_SIZE + INTERVAL);  line(3 * CHESS_GRID_SIZE + INTERVAL, 9 * CHESS_GRID_SIZE+INTERVAL,5*CHESS_GRID_SIZE+INTERVAL,7*CHESS_GRID_SIZE+INTERVAL);  //畫棋子  settextstyle(30, 0, "楷體");  for (int i = 0; i < ROW; i++)  {    for (int k = 0; k < COL; k++)    {      if (map[i][k].id != SPACE)      {        setlinecolor(map[i][k].type);        fillcircle(map[i][k].x, map[i][k].y, 30);        fillcircle(map[i][k].x, map[i][k].y, 25);        settextcolor(map[i][k].type);        outtextxy(map[i][k].x-10, map[i][k].y-10, chessName[map[i][k].id]);      }          }  }}void MouseControl(){  if (MouseHit())  {    MOUSEMSG msg = GetMouseMsg();    if (msg.uMsg == WM_LBUTTONDOWN)    {      //獲取鼠標(biāo)點(diǎn)擊的數(shù)組的下標(biāo)      int row = (msg.y-INTERVAL)/CHESS_GRID_SIZE;      int col = (msg.x-INTERVAL)/CHESS_GRID_SIZE;      if (state == BEGIN)      {        state = END;        begin.x = row;        begin.y = col;      }      else if (state == END)      {        state = BEGIN;        begin.x = row;        begin.y = col;      }      printf("%d,%d  %d
", row, col, state);    }  }}void chessMove(){  if (begin.x != -1 && end.x != -1 && !(begin.x == end.x &&begin.y == end.y))  {    map[end.x][end.y].id = map[begin.x][begin.y].id;    map[end.x][end.y].type = map[begin.x][begin.y].type;    map[end.x][end.y].river = map[begin.x][begin.y].river;    map[begin.x][begin.y].id = SPACE;  }
}int main555(){    //創(chuàng)建一個(gè)圖形窗口  initgraph(800,800,SHOWCONSOLE);  GameInit();  printf("歡迎來(lái)到頑石老師課堂,中國(guó)象棋");  BeginBatchDraw();  while (1)  {    GameDraw();    FlushBatchDraw();    MouseControl();    chessMove();  }  return 0;}

責(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)注

    183

    文章

    7644

    瀏覽量

    145667
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4970

    瀏覽量

    74019

原文標(biāo)題:C語(yǔ)言項(xiàng)目實(shí)戰(zhàn):《中國(guó)象棋》零基礎(chǔ)項(xiàng)目!210 行源代碼示例

文章出處:【微信號(hào):cyuyanxuexi,微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    講解C語(yǔ)言代碼的實(shí)現(xiàn)過(guò)程

    重點(diǎn)講解C語(yǔ)言代碼的實(shí)現(xiàn)過(guò)程,算法的C語(yǔ)言實(shí)現(xiàn)過(guò)程具有一般性,通過(guò)PID算法的C
    發(fā)表于 01-21 07:58

    C語(yǔ)言來(lái)實(shí)現(xiàn)萬(wàn)年歷

    C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷程序的代碼如下:#include int year(int y) { if ((y%4==0) (y%100!=0) || y%400==0) return 366
    發(fā)表于 01-16 08:02

    C語(yǔ)言實(shí)現(xiàn)PID算法介紹

    PID 是 Proportional(比例)、Integral(積分)、Differential(微分)的首字母縮寫;是一種結(jié)合比例、積分和微分三種環(huán)節(jié)于一體的閉環(huán)控制算法。PID 控制的實(shí)質(zhì)是對(duì)目標(biāo)值和實(shí)際值誤差進(jìn)行比例、積分、微分運(yùn)算后的結(jié)果用來(lái)作用在輸出上。 比例 (P) 比例控制是最簡(jiǎn)單的一種控制方式,成比例的反應(yīng)控制系統(tǒng)中輸入與輸出的偏差信號(hào),只要偏差一旦產(chǎn)生,就立即產(chǎn)生控制的作用來(lái)減小產(chǎn)生的誤差。比例控制器的輸出與輸入成正比關(guān)系,能夠迅速的反應(yīng)偏差,偏差減小的速度取決于比例系數(shù) Kp,Kp 越大偏差減小的就越快,但是極易引起震蕩;Kp 減小發(fā)生震蕩的可能性減小,但是調(diào)節(jié)的速度變慢,單純的比例控制存在不能消除的靜態(tài)誤差,這里就需要積分來(lái)控制。 積分(I) 在比例控制環(huán)節(jié)產(chǎn)生了靜態(tài)誤差,在積分環(huán)節(jié)中,主要用于就是消除靜態(tài)誤差提高系統(tǒng)的無(wú)差度。積分作用的強(qiáng)弱,取決于積分時(shí)間常數(shù) Ti,Ti 越大積分作用越弱,反之則越強(qiáng)。積分控制作用的存在與偏差 e(t) 的存在時(shí)間有關(guān),只要系統(tǒng)存在著偏差,積分環(huán)節(jié)就會(huì)不斷起作用,對(duì)輸入偏差進(jìn)行積分,使控制器的輸出及執(zhí)行器的開(kāi)度不斷變化,產(chǎn)生控制作用以減小偏差。在積分時(shí)間足夠的情況下,可以完全消除靜差,這時(shí)積分控制作用將維持不變。Ti 越小,積分速度越快,積分作用越強(qiáng)。積分作用太強(qiáng)會(huì)使系統(tǒng)超調(diào)加大,甚至使系統(tǒng)出現(xiàn)振蕩。 微分(D) 微分環(huán)節(jié)的作用是反應(yīng)系統(tǒng)偏差的一個(gè)變化趨勢(shì),也可以說(shuō)是變化率,可以在誤差來(lái)臨之前提前引入一個(gè)有效的修正信號(hào),有利于提高輸出響應(yīng)的快速性, 減小被控量的超調(diào)和增加系統(tǒng)的穩(wěn)定性,雖然積分環(huán)節(jié)可以消除靜態(tài)誤差但是降低了系統(tǒng)的響應(yīng)速度,所以引入微分控制器就顯得很有必要,尤其是具有較大慣性的被控對(duì)象使用 PI 控制器很難得到很好的動(dòng)態(tài)調(diào)節(jié)品質(zhì),系統(tǒng)會(huì)產(chǎn)生較大的超調(diào)和振蕩,這時(shí)可以引入微分作用。在偏差剛出現(xiàn)或變化的瞬間,不僅根據(jù)偏差量作出及時(shí)反應(yīng)(即比例控制作用),還可以根據(jù)偏差量的變化趨勢(shì)(速度)提前給出較大的控制作用(即微分控制作用),將偏差消滅在萌芽狀態(tài),這樣可以大大減小系統(tǒng)的動(dòng)態(tài)偏差和調(diào)節(jié)時(shí)問(wèn),使系統(tǒng)的動(dòng)態(tài)調(diào)節(jié)品質(zhì)得以改善。微分環(huán)節(jié)有助于系統(tǒng)減小超調(diào),克服振蕩,加快系統(tǒng)的響應(yīng)速度,減小調(diào)節(jié)時(shí)間,從而改善了系統(tǒng)的動(dòng)態(tài)性能,但微分時(shí)間常數(shù)過(guò)大,會(huì)使系統(tǒng)出現(xiàn)不穩(wěn)定。微分控制作用一個(gè)很大的缺陷是容易引入高頻噪聲,所有在干擾信號(hào)比較嚴(yán)重的流量控制系統(tǒng)中不宜引入微分控制作用。
    發(fā)表于 01-16 07:24

    何用軟件實(shí)現(xiàn)系統(tǒng)的復(fù)位?

    看門狗的工作過(guò)程是怎樣的? 如何用軟件實(shí)現(xiàn)系統(tǒng)的復(fù)位?
    發(fā)表于 01-08 06:15

    C語(yǔ)言主要特點(diǎn)

    指針類型數(shù)據(jù),使用十分靈活和多樣化,能用來(lái)實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(如鏈表、樹(shù)、棧等)的運(yùn)算。 4.具有結(jié)構(gòu)化的控制語(yǔ)句。用函數(shù)作為程序的模塊單位,便于實(shí)現(xiàn)程序的模塊化。C語(yǔ)言是完全模塊
    發(fā)表于 01-05 07:41

    何用C 語(yǔ)言函數(shù)的返回值?

    基本上,沒(méi)有人會(huì)將大段的C語(yǔ)言代碼全部塞入 main() 函數(shù)。更好的做法是按照復(fù)用率高、耦合性低的原則,盡可能的將代碼拆分不同的功能模塊,并封裝成函數(shù)。 C語(yǔ)言代碼的組合千變?nèi)f化,因
    發(fā)表于 12-25 07:17

    單片機(jī)C語(yǔ)言編程的心得

    規(guī)范程序結(jié)構(gòu)化設(shè)計(jì)的需要,既可以實(shí)現(xiàn)大型程序的模塊化,又可以實(shí)現(xiàn)根各模塊的連接調(diào)試。 1、.H文件介紹: 在單片機(jī)C程序設(shè)計(jì)中,項(xiàng)目一般按功能模塊化進(jìn)行結(jié)構(gòu)化設(shè)計(jì)。將一個(gè)
    發(fā)表于 12-08 07:44

    為什么單片機(jī)還在用C語(yǔ)言編程?

    的缺陷 高級(jí)語(yǔ)言存在的目的是可以實(shí)現(xiàn)更為優(yōu)化的算法,更多的是為了方便的執(zhí)行方案,但是,高級(jí)語(yǔ)言對(duì)程序存儲(chǔ)空間的占用要比匯編和C語(yǔ)言多很多。
    發(fā)表于 11-28 07:37

    請(qǐng)問(wèn)如何用C語(yǔ)言列舉當(dāng)前所有網(wǎng)口?

    何用C語(yǔ)言列舉當(dāng)前所有網(wǎng)口?
    發(fā)表于 11-25 07:23

    C語(yǔ)言特性

    數(shù)據(jù),實(shí)現(xiàn)對(duì)設(shè)備的精準(zhǔn)控制,同時(shí)降低功耗,延長(zhǎng)設(shè)備的使用壽命。 2、可移植性:跨平臺(tái)的通行證 C 語(yǔ)言具有良好的可移植性,這意味著用 C 語(yǔ)言
    發(fā)表于 11-24 07:01

    C++ 與 Python:樹(shù)莓派上哪種語(yǔ)言更優(yōu)?

    Python是樹(shù)莓派上的首選編程語(yǔ)言,我們的大部分教程都使用它。然而,C++在物聯(lián)網(wǎng)項(xiàng)目中同樣廣受歡迎且功能強(qiáng)大。那么,在樹(shù)莓派項(xiàng)目中選擇哪種語(yǔ)言
    的頭像 發(fā)表于 07-24 15:32 ?968次閱讀
    <b class='flag-5'>C</b>++ 與 Python:樹(shù)莓派上哪種<b class='flag-5'>語(yǔ)言</b>更優(yōu)?

    單片機(jī)C語(yǔ)言實(shí)例(350+例)

    350+單片機(jī)C語(yǔ)言實(shí)例! 純分享帖,需要者可點(diǎn)擊附件免費(fèi)獲取完整資料~~~【免責(zé)聲明】本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)第一時(shí)間告知,刪除內(nèi)容!
    發(fā)表于 05-22 21:47

    深入理解C語(yǔ)言C語(yǔ)言循環(huán)控制

    C語(yǔ)言編程中,循環(huán)結(jié)構(gòu)是至關(guān)重要的,它可以讓程序重復(fù)執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進(jìn)入無(wú)限循環(huán),C語(yǔ)言提供了多種循環(huán)控制語(yǔ)句,如break、continue和
    的頭像 發(fā)表于 04-29 18:49 ?2068次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>循環(huán)控制

    為什么學(xué)了C語(yǔ)言,卻寫不出像樣的項(xiàng)目?

    在學(xué)習(xí)編程的路上,C語(yǔ)言幾乎是每個(gè)程序員的“必修課”。不管你是打算從事嵌入式開(kāi)發(fā)、系統(tǒng)編程,還是想要深入理解操作系統(tǒng)的底層原理,C語(yǔ)言都是一塊重要的基石。然而許多人在學(xué)習(xí)
    的頭像 發(fā)表于 03-14 17:37 ?927次閱讀
    為什么學(xué)了<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>,卻寫不出像樣的<b class='flag-5'>項(xiàng)目</b>?

    單片機(jī)C語(yǔ)言編程寶典大全,初學(xué)必備【強(qiáng)推下載!】

    資料介紹:包含 1. 51單片機(jī)入門教程 2. 初學(xué)者適用:?jiǎn)纹瑱C(jī)C語(yǔ)言實(shí)例100例(代碼及釋義) 3. 51單片機(jī)C語(yǔ)言快速上手 4. 51單片機(jī)
    發(fā)表于 03-14 11:03