摘要:中國象棋是中國一種流傳十分廣泛的游戲。宣布認輸的一方算輸。今天我就用語言帶大家一步步去完成好玩有趣學會就能和朋友對弈的中國象棋小游戲。
棋子行棋規則帥/將移動范圍:只能在九宮內移動移動規則:每一步只可以水平或垂直移動一點特殊規則:帥和將不準在同一直線上直接對面(中間無棋子),如一方已先占據位置,則另一方必須回避,否則就算輸仕/士移動范圍:只能在九宮內移動移動規則:每一步只可以沿對角線方向移動一點相/象移動范圍:河界的一側移動規則:每一步只可以沿對角線方向移動兩點,可使用漢字中的田字形象地表述:田字格的對角線,俗稱相(象)走田字。當相(象)行走路線中,即田字中心有棋子時(無論己方或是對方棋子),則不允許走過去,俗稱:塞相(象)眼。馬移動范圍:任何位置移動規則:每一步只可以水平或垂直移動一點,再按對角線方面向左或者右移動。可使用漢字中的日字來形容馬的行走方式,俗稱:馬走日字(斜對角線)。當馬行走時,第一步直行或橫行處有別的棋子(無論己方或是對方棋子)擋住,則不許走過去,俗稱:蹩馬腿。車移動范圍:任何位置移動規則:可以水平或垂直方向移動任意個無阻礙的點炮/砲移動范圍:任何位置移動規則:移動起來和車很相似,但它必須跳過一個棋子來吃掉對方棋子。兵/卒移動范圍:任何位置移動規則:過河界前,每步只能向前移動一點。過河界后,增加了向左右移動的能力,兵(卒)不允許向后移動。
無論什么棋子,通常只要根據行棋規則能走到的部位有對方的棋子就能吃掉對方的棋子。
唯一例外的是炮的吃棋方法,比較特殊,需要中間隔有棋子(無論是己方或對方棋子)才能吃掉對方的棋子。
帥(將)被對方“將死”或“困斃”一方算輸。
宣布認輸的一方算輸。
開發工具為VS2013
在此之前呢,和大家說明一下,因為這是一個比較大的項目了,所以展示所有代碼會有些困難,所以我裁剪了主要的大部分代碼,主要目的是讓大家明白實現這個項目的邏輯思路,希望大家可以理解,完整代碼文章最下方獲取哦
int main(){ //創建圖形窗口 initgraph(740, 820,EW_SHOWCONSOLE); //設置背景模式 setbkmode(TRANSPARENT); //貼棋盤 IMAGE img_board; loadimage(&img_board, "./res/ChessBoard.png"); init(); //雙緩沖繪圖,防止閃屏 BeginBatchDraw(); while (true) { cleardevice(); putimage(0, 0, &img_board); draw(); mouseEvent(); FlushBatchDraw(); } EndBatchDraw(); getchar(); return 0;}
enum Pieces //棋子{ NONE = -1, 車, 馬, 象, 士, 將, 砲, 卒, 俥, 馬, 相, 仕, 帥, 炮, 兵, BEGIN, END,};//給id賦值enum Pieces redChess[] = { 車, 馬, 象, 士, 將, 砲, 卒 };enum Pieces blackChess[] = { 俥, 馬, 相, 仕, 帥, 炮, 兵 };//繪制時轉化成字符串const char* ChessName[] = { "車","馬","象","士","將","砲","卒","俥", "馬", "相", "仕", "帥", "炮", "兵" };//每一個棋子的屬性struct Chess{ enum Pieces id; //棋子名稱 DWORD type; //棋子類型,紅?黑? short x; short y; bool isRiver; //是否過了河};
//游戲地圖struct Chess map[ROW][COL];struct State{ int begr; int begc; int endr; int endc; int state;}state = {-1,-1,-1,-1,BEGIN};void chessMove();//打印數組void show(){ for (size_t i = 0; i < ROW; i++) { for (size_t k = 0; k < COL; k++) { printf("%2d ", map[i][k].id); } printf("/n"); }}//初始化數據void init(){ //遍歷地圖 for (size_t i = 0; i < ROW; i++) { size_t temp = 0; for (size_t k = 0; k < COL; k++) { map[i][k].id = NONE; //先把棋子置為沒有 if (i <= 4) //黑棋子 { map[i][k].type = BLACK; if (i == 0) //放置第一行的棋子 { //0 1 2 3 4 if (k <= 4) { temp = k; } // 3 2 1 0 else { // k == 5 temp = 4 - (k - 4); /* 4 - (5-4) //3 4 - (6-4) //2 4 - (7-4) //1 4 - (8-4) //0 */ } map[i][k].id = blackChess[temp]; } //設置炮 if (i == 2 && (k == 1 || k == 7)) { map[i][k].id = blackChess[5]; } //設置兵 if (i == 3 && k % 2 == 0) { map[i][k].id = blackChess[6]; } } else //紅棋 { map[i][k].type = RED; if (i == 9) //放置第一行的棋子 { //0 1 2 3 4 if (k <= 4) { temp = k; } // 3 2 1 0 else { // k == 5 temp = 4 - (k - 4); /* 4 - (5-4) //3 4 - (6-4) //2 4 - (7-4) //1 4 - (8-4) //0 */ } map[i][k].id = redChess[temp]; } //設置炮 if (i == 7 && (k == 1 || k == 7)) { map[i][k].id = redChess[5]; } //設置兵 if (i == 6 && k % 2 == 0) { map[i][k].id = redChess[6]; } } map[i][k].isRiver = false; map[i][k].x = k * GRID_SIZE + INTERVAL; map[i][k].y = i * GRID_SIZE + INTERVAL; } }}//繪制void draw(){ setfillcolor(RGB(252, 215, 162)); setlinestyle(PS_SOLID, 2); //設置文字的樣式 settextstyle(30, 0, "楷體"); for (size_t i = 0; i < ROW; i++) { for (size_t k = 0; k < COL; k++) { if (map[i][k].id == NONE) continue; settextcolor(map[i][k].type); 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); outtextxy(map[i][k].x - 15, map[i][k].y - 15, ChessName[map[i][k].id]); } }}
//鼠標操作void mouseEvent(){ ExMessage msg; //定義消息結構體變量 if(peekmessage(&msg, EM_MOUSE)) { if (msg.message == WM_LBUTTONDOWN) //鼠標左鍵按下 { //通過鼠標坐標得出點擊的數組的下標 //k * GRID_SIZE + INTERVAL = x; int col = (msg.x - INTERVAL) / GRID_SIZE; int row = (msg.y - INTERVAL) / GRID_SIZE; //下標校準 if (msg.x > map[row][col].x + 30 && msg.y < map[row][col].y + 30) { col++; } if (msg.x < map[row][col].x + 30 && msg.y > map[row][col].y + 30) { row++; } if (msg.x > map[row][col].x + 30 && msg.y > map[row][col].y + 30) { row++; col++; } //printf("(%d %d)/n", row, col); if (state.state == BEGIN) { state.begr = row; state.begc = col; state.state = END; } else if (state.state == END) { state.endr = row; state.endc = col; state.state = BEGIN; } chessMove(); } }}int hasBlock(struct State* state){ int cnt = 0; state->begr; state->begc; state->endr; state->endc; */ return cnt;}
//移動棋子void chessMove(){ printf("beg(%d %d) end(%d %d)/n", state.begr, state.begc, state.endr, state.endc); bool canMove = false; //什么情況下能夠移動棋子 if (!(state.begr == state.endr && state.begc == state.endc) && //點擊的不是同一個棋子 state.endr!=-1 && state.begr!=-1&& //下標必須合法 map[state.begr][state.begc].id != NONE//沒有棋子不能移動 /*&&map[state.begr][state.begc].type != map[state.endr][state.endc].type*/) //不能自己吃自己 { switch (map[state.begr][state.begc].id) { case 車: case 俥: if (state.begr == state.endr || state.begc == state.endc) { //起始點和結束點之間是否有阻礙 if (hasBlock(&state)) { canMove = true; } } break; case 馬: case 馬: break; case 象: case 相: break; case 士: case 仕: break; case 將: case 帥: break; case 砲: case 炮: break; case 卒: case 兵: break; default: break; } if (canMove) { printf("canMove/n"); map[state.endr][state.endc].id = map[state.begr][state.begc].id; map[state.begr][state.begc].id = NONE; map[state.endr][state.endc].isRiver = map[state.begr][state.begc].isRiver; map[state.endr][state.endc].type = map[state.begr][state.begc].type; } }}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/123682.html
摘要:今年月,互聯網行動計劃出爐。互聯網帶給云計算的機會互聯網下的傳統行業轉型將百花齊放,但云計算的使命卻相當明確首先要為傳統行業提供一個互聯網化的基礎平臺,其次要針對具體行業打造上層應用。 今年3月,互聯網+行動計劃出爐。政府明確提出,要借助互聯網提升全社會的創新力和生產力,形成更廣泛的以互聯網為基礎設施和實現工具的經濟發展新形態。顯然,互聯網+新業態需要互聯網與傳統行業的融合與創新,而作為互...
摘要:年前端有哪些領域,技術值得關注,哪些技術會興起,哪些技術會沒落。自從谷歌提出后,就持續的獲得了業界的關注,熱度可見一斑。就在今年,谷歌也宣布將獲得與安卓原生應用同等的待遇與權限。但是無論都值得關注。 1.前言 2017悄然過去,2018已經來到。人在進步,技術在發展。2018年前端有哪些領域,技術值得關注,哪些技術會興起,哪些技術會沒落。下面就我個人的判斷進行一個預測判斷,希望能對大家...
摘要:年前端有哪些領域,技術值得關注,哪些技術會興起,哪些技術會沒落。自從谷歌提出后,就持續的獲得了業界的關注,熱度可見一斑。就在今年,谷歌也宣布將獲得與安卓原生應用同等的待遇與權限。但是無論都值得關注。 1.前言 2017悄然過去,2018已經來到。人在進步,技術在發展。2018年前端有哪些領域,技術值得關注,哪些技術會興起,哪些技術會沒落。下面就我個人的判斷進行一個預測判斷,希望能對大家...
摘要:我們使用了很多的公共云資源,自己也建立了私有的云計算中心。那你們會給騰訊提供一些這方面的建議嗎會的,我們跟他們合作密切,我們之間的交流很頻繁。 Cadir Lee,現任Zynga CTO,統管公司的技術平臺和海量基礎架構的研發和創新。他管理數據分析、網絡運維、安全等方面的團隊。在加入Zynga之前,他擔任Support.com的CTO11年之久,而Support.com也是他和Zynga創始...
閱讀 2235·2021-11-18 10:02
閱讀 3491·2021-11-15 11:36
閱讀 1122·2019-08-30 14:03
閱讀 733·2019-08-30 11:08
閱讀 2766·2019-08-29 13:20
閱讀 3291·2019-08-29 12:34
閱讀 1380·2019-08-28 18:30
閱讀 1645·2019-08-26 13:34