国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

C/C++游戲項目:中國程序員一定要會的中國象棋教程

kamushin233 / 2234人閱讀

摘要:中國象棋是中國一種流傳十分廣泛的游戲。宣布認輸的一方算輸。今天我就用語言帶大家一步步去完成好玩有趣學會就能和朋友對弈的中國象棋小游戲。

? ? ? ?中國象棋是中國一種流傳十分廣泛的游戲。 下棋雙方根據自己對棋局形式的理解和對棋藝規律的掌握,調動車馬,組織兵力,協調作戰在棋盤這塊特定的戰場上進行著象征性的軍事戰斗。 象棋,亦作“象碁”,為了區別“國際象棋”也作“中國象棋”,中國象棋在中國有著悠久的歷史,屬于二人對抗性游戲的一種,由于用具簡單,趣味性強,成為流行極為廣泛的棋藝活動。

游戲規則

行棋規則:

棋子行棋規則帥/將移動范圍:只能在九宮內移動移動規則:每一步只可以水平或垂直移動一點特殊規則:帥和將不準在同一直線上直接對面(中間無棋子),如一方已先占據位置,則另一方必須回避,否則就算輸仕/士移動范圍:只能在九宮內移動移動規則:每一步只可以沿對角線方向移動一點相/象移動范圍:河界的一側移動規則:每一步只可以沿對角線方向移動兩點,可使用漢字中的田字形象地表述:田字格的對角線,俗稱相(象)走田字。當相(象)行走路線中,即田字中心有棋子時(無論己方或是對方棋子),則不允許走過去,俗稱:塞相(象)眼。馬移動范圍:任何位置移動規則:每一步只可以水平或垂直移動一點,再按對角線方面向左或者右移動。可使用漢字中的日字來形容馬的行走方式,俗稱:馬走日字(斜對角線)。當馬行走時,第一步直行或橫行處有別的棋子(無論己方或是對方棋子)擋住,則不許走過去,俗稱:蹩馬腿。車移動范圍:任何位置移動規則:可以水平或垂直方向移動任意個無阻礙的點炮/砲移動范圍:任何位置移動規則:移動起來和車很相似,但它必須跳過一個棋子來吃掉對方棋子。兵/卒移動范圍:任何位置移動規則:過河界前,每步只能向前移動一點。過河界后,增加了向左右移動的能力,兵(卒)不允許向后移動。

吃子規則:

無論什么棋子,通常只要根據行棋規則能走到的部位有對方的棋子就能吃掉對方的棋子。

唯一例外的是炮的吃棋方法,比較特殊,需要中間隔有棋子(無論是己方或對方棋子)才能吃掉對方的棋子。

勝負判定:

帥(將)被對方“將死”或“困斃”一方算輸。

宣布認輸的一方算輸。

今天我就用C語言帶大家一步步去完成好玩有趣學會就能和朋友對弈的中國象棋小游戲。

PS:要安裝easyx圖形庫哦 #include?? ?

開發工具為VS2013

在此之前呢,和大家說明一下,因為這是一個比較大的項目了,所以展示所有代碼會有些困難,所以我裁剪了主要的大部分代碼,主要目的是讓大家明白實現這個項目的邏輯思路,希望大家可以理解,完整代碼文章最下方獲取哦

第一步:創建一個項目,并將準備好的素材資源放到同級目錄下(素材可以在文章最下方領取)如圖:

第二步:接下來就是我們的主要函數main.Cpp了,創建一個窗口再貼上棋盤圖,加上雙緩沖繪圖防止閃屏:

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;			//是否過了河};

第四步:宏定義#define ROW 10? #define COL 9 繪制十列九行的地圖,并初始化數據,設置棋子的特殊移動規則:

//游戲地圖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;		}	}}

中國象棋的教程就到此結束啦,有興趣的同學可以嘗試寫出來,后續我會發布更多的項目源碼以及學習資料,希望大家可以持續關注,想要C/C++學習資料以及完整源碼素材圖形庫開發工具等的可以加群【639681529】了解,或者有問題也可以在評論區或者進群提問希望大家可以在這里得到自己想要的知識,也希望如果對你有所幫助的話可以多多關注點贊評論,有建議也可以在評論區提出,謝謝大家的支持!

點擊下方鏈接進群:

進群領取項目源碼素材及圖形庫哦~還有各種學習資料等你!http://點擊鏈接加入群聊【C語言/C++學習答疑交流】:https://jq.qq.com/?_wv=1027&k=9UocdboWhttp://xn--c-14ts39jerazz506etjubj1ayhbm86c60et16a/C++%E5%AD%A6%E4%B9%A0%E7%AD%94%E7%96%91%E4%BA%A4%E6%B5%81%E3%80%91%EF%BC%9Ahttps://jq.qq.com/?_wv=1027&k=9UocdboW

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/123682.html

相關文章

  • “互聯網+”帶給云計算的機遇

    摘要:今年月,互聯網行動計劃出爐。互聯網帶給云計算的機會互聯網下的傳統行業轉型將百花齊放,但云計算的使命卻相當明確首先要為傳統行業提供一個互聯網化的基礎平臺,其次要針對具體行業打造上層應用。  今年3月,互聯網+行動計劃出爐。政府明確提出,要借助互聯網提升全社會的創新力和生產力,形成更廣泛的以互聯網為基礎設施和實現工具的經濟發展新形態。顯然,互聯網+新業態需要互聯網與傳統行業的融合與創新,而作為互...

    fxp 評論0 收藏0
  • 2018前端值得關注的技術

    摘要:年前端有哪些領域,技術值得關注,哪些技術會興起,哪些技術會沒落。自從谷歌提出后,就持續的獲得了業界的關注,熱度可見一斑。就在今年,谷歌也宣布將獲得與安卓原生應用同等的待遇與權限。但是無論都值得關注。 1.前言 2017悄然過去,2018已經來到。人在進步,技術在發展。2018年前端有哪些領域,技術值得關注,哪些技術會興起,哪些技術會沒落。下面就我個人的判斷進行一個預測判斷,希望能對大家...

    xiao7cn 評論0 收藏0
  • 2018前端值得關注的技術

    摘要:年前端有哪些領域,技術值得關注,哪些技術會興起,哪些技術會沒落。自從谷歌提出后,就持續的獲得了業界的關注,熱度可見一斑。就在今年,谷歌也宣布將獲得與安卓原生應用同等的待遇與權限。但是無論都值得關注。 1.前言 2017悄然過去,2018已經來到。人在進步,技術在發展。2018年前端有哪些領域,技術值得關注,哪些技術會興起,哪些技術會沒落。下面就我個人的判斷進行一個預測判斷,希望能對大家...

    用戶84 評論0 收藏0
  • 專訪Zynga CTO Cadir Lee,談談Zynga的云計算與核心價值觀

    摘要:我們使用了很多的公共云資源,自己也建立了私有的云計算中心。那你們會給騰訊提供一些這方面的建議嗎會的,我們跟他們合作密切,我們之間的交流很頻繁。 Cadir Lee,現任Zynga CTO,統管公司的技術平臺和海量基礎架構的研發和創新。他管理數據分析、網絡運維、安全等方面的團隊。在加入Zynga之前,他擔任Support.com的CTO11年之久,而Support.com也是他和Zynga創始...

    ThinkSNS 評論0 收藏0

發表評論

0條評論

kamushin233

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<