最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 中國(guó)象棋的實(shí)現(xiàn)流程詳解

 更新時(shí)間:2021年11月19日 14:27:34   作者:MAX在碼字  
中國(guó)象棋是起源于中國(guó)的一種棋,屬于二人對(duì)抗性游戲的一種,在中國(guó)有著悠久的歷史。由于用具簡(jiǎn)單,趣味性強(qiáng),成為流行極為廣泛的棋藝活動(dòng)

中國(guó)象棋的中國(guó)棋文化,也是中華民族的文化瑰寶,它源遠(yuǎn)流長(zhǎng),趣味濃厚,基本規(guī)則簡(jiǎn)明易懂。中國(guó)象棋在中國(guó)的群眾中基礎(chǔ)遠(yuǎn)遠(yuǎn)超過(guò)圍棋,是普及最廣的棋類(lèi)項(xiàng)目,中國(guó)象棋已流傳到十幾個(gè)國(guó)家和地區(qū)。 中國(guó)象棋使用方形格狀棋盤(pán),圓形棋子共有32個(gè),紅黑二色各有16個(gè)棋子,擺放和活動(dòng)在交叉點(diǎn)上。雙方交替行棋,先把對(duì)方的將(帥)“將死”的一方獲勝。

我們今天就來(lái)看看我們自己能不能寫(xiě)出這樣一個(gè)游戲呢?

今天就不話不多說(shuō)了,先說(shuō)一下,今天我們做的是一個(gè)簡(jiǎn)易版的單機(jī)中國(guó)象棋,希望大家理解,聯(lián)網(wǎng)對(duì)弈的話需要用到的知識(shí)過(guò)多,數(shù)據(jù)庫(kù)以及網(wǎng)絡(luò)協(xié)議這些大部分同學(xué)都沒(méi)有學(xué),所以我們今天就簡(jiǎn)單的實(shí)現(xiàn)《中國(guó)象棋》的簡(jiǎn)單對(duì)弈,主要是希望同學(xué)們可以理解其中的邏輯關(guān)系,之后就可以更好的去完善

行吧,我們現(xiàn)在就開(kāi)始吧?。?!

今天先出場(chǎng)的就不是我們的老朋友結(jié)構(gòu)體了,而是我們的新朋友枚舉類(lèi)型

enum Pieces //棋子
{
	NONE = -1,
	車(chē), 馬, 象, 士, 將, 砲, 卒,
	俥, 馬, 相, 仕, 帥, 炮, 兵,
	BEGIN, END,
};
//給id賦值
enum Pieces redChess[] = { 車(chē), 馬, 象, 士, 將, 砲, 卒 };
enum Pieces blackChess[] = { 俥, 馬, 相, 仕, 帥, 炮, 兵 };
//繪制時(shí)轉(zhuǎn)化成字符串
const char* ChessName[] = { "車(chē)","馬","象","士","將","砲","卒","俥", "馬", "相", "仕", "帥", "炮", "兵" };

接下來(lái)出場(chǎng)的是我們的老朋友結(jié)構(gòu)體

//每一個(gè)棋子的屬性
struct Chess
{
	enum Pieces id;		//棋子名稱(chēng)
	DWORD type;			//棋子類(lèi)型,紅?黑?
	short x;
	short y;
	bool  isRiver;			//是否過(guò)了河
};
 
//游戲地圖
struct Chess map[ROW][COL];
 
struct State
{
	int begr;
	int begc;
	int endr;
	int endc;
	int state;
}state = {-1,-1,-1,-1,BEGIN};

我們的初始化函數(shù),一定要想好其中的邏輯

//初始化數(shù)據(jù)
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;	//先把棋子置為沒(méi)有
			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];
				}
				//設(shè)置炮
				if (i == 2 && (k == 1 || k == 7))
				{
					map[i][k].id = blackChess[5];
				}
				//設(shè)置兵
				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];
			}
			//設(shè)置炮
			if (i == 7 && (k == 1 || k == 7))
			{
				map[i][k].id = redChess[5];
			}
			//設(shè)置兵
			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;
		}
	}
}

接下來(lái)是我們的繪制函數(shù)

//繪制
void draw()
{
	setfillcolor(RGB(252, 215, 162));
	setlinestyle(PS_SOLID, 2);
	//設(shè)置文字的樣式
	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]);
		}
	}
}

后面是我們的重點(diǎn),鼠標(biāo)控制函數(shù),以后類(lèi)似的游戲項(xiàng)目都會(huì)有這樣的函數(shù),好好理解

//鼠標(biāo)操作
void mouseEvent()
{
	ExMessage msg;	//定義消息結(jié)構(gòu)體變量
	if(peekmessage(&msg, EM_MOUSE))
	{
		if (msg.message == WM_LBUTTONDOWN)	//鼠標(biāo)左鍵按下
		{
			//通過(guò)鼠標(biāo)坐標(biāo)得出點(diǎn)擊的數(shù)組的下標(biāo)
			//k * GRID_SIZE + INTERVAL = x;
			int col = (msg.x - INTERVAL) / GRID_SIZE;
			int row = (msg.y - INTERVAL) / GRID_SIZE;
 
			//下標(biāo)校準(zhǔn)
			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();
		}
	}
}

重點(diǎn)中的重點(diǎn),棋子的移動(dòng)函數(shù),游戲的規(guī)則也就在這里體現(xiàn)出來(lái)

//移動(dòng)棋子
void chessMove()
{
	printf("beg(%d %d) end(%d %d)\n", state.begr, state.begc, state.endr, state.endc);
	bool canMove = false;
	//什么情況下能夠移動(dòng)棋子
	if (!(state.begr == state.endr && state.begc == state.endc) &&	//點(diǎn)擊的不是同一個(gè)棋子
		state.endr!=-1 && state.begr!=-1&&		//下標(biāo)必須合法
		map[state.begr][state.begc].id != NONE//沒(méi)有棋子不能移動(dòng)
		/*&&map[state.begr][state.begc].type != map[state.endr][state.endc].type*/)	//不能自己吃自己
	{
 
		switch (map[state.begr][state.begc].id)
		{
		case 車(chē):
		case 俥:
			if (state.begr == state.endr || state.begc == state.endc)
			{
				//起始點(diǎn)和結(jié)束點(diǎn)之間是否有阻礙
				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;
		}
	}
}

最后就是我們的主函數(shù),進(jìn)行調(diào)用,讓項(xiàng)目運(yùn)行起來(lái)

int main()
{
	//創(chuàng)建圖形窗口
	initgraph(740, 820,EW_SHOWCONSOLE);
	//設(shè)置背景模式
	setbkmode(TRANSPARENT);
	//貼棋盤(pán)
	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;
}

這樣一個(gè)簡(jiǎn)易版的《中國(guó)象棋》游戲項(xiàng)目就解決啦,重點(diǎn)就是邏輯,一定要想清楚,想要實(shí)現(xiàn)聯(lián)網(wǎng)的同學(xué)就要更加的去想清楚,以及去提高自己的能力,好啦,希望可以讓大家從中感受到編程的快樂(lè)吧,也希望大家可以給UP主一個(gè)關(guān)注,非常感謝大家了!?。?/p>

到此這篇關(guān)于C++ 中國(guó)象棋的實(shí)現(xiàn)流程詳解的文章就介紹到這了,更多相關(guān)C++ 中國(guó)象棋內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • visual studio 2013中配置opencv圖文教程 Opencv2.4.9安裝配置教程

    visual studio 2013中配置opencv圖文教程 Opencv2.4.9安裝配置教程

    這篇文章主要為大家詳細(xì)介紹了Opencv2.4.9安裝教程,以及在visualstudio 2013中opencv的配置步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 淺談c++性能測(cè)試工具google benchmark

    淺談c++性能測(cè)試工具google benchmark

    本文將會(huì)介紹如何使用模板以及參數(shù)生成器來(lái)批量生成測(cè)試用例,簡(jiǎn)化繁瑣的性能測(cè)試代碼
    2021-06-06
  • C++?MiniZip實(shí)現(xiàn)目錄壓縮與解壓的示例詳解

    C++?MiniZip實(shí)現(xiàn)目錄壓縮與解壓的示例詳解

    Zlib是一個(gè)開(kāi)源的數(shù)據(jù)壓縮庫(kù),提供了一種通用的數(shù)據(jù)壓縮和解壓縮算法,本文主要為大家詳細(xì)介紹了如何利用Zlib實(shí)現(xiàn)目錄壓縮與解壓,需要的小伙伴可以參考下
    2023-11-11
  • C++設(shè)計(jì)類(lèi)不能被繼承的方法實(shí)例講解

    C++設(shè)計(jì)類(lèi)不能被繼承的方法實(shí)例講解

    在Java 中定義了關(guān)鍵字final,被final修飾的類(lèi)不能被繼承,C++中如何實(shí)現(xiàn),下面我們來(lái)看一個(gè)例子
    2013-12-12
  • C++開(kāi)發(fā)之CRC校驗(yàn)實(shí)例詳解

    C++開(kāi)發(fā)之CRC校驗(yàn)實(shí)例詳解

    這篇文章主要介紹了C++開(kāi)發(fā)之CRC校驗(yàn)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • 如何讓C++函數(shù)返回值死心塌地為你工作

    如何讓C++函數(shù)返回值死心塌地為你工作

    這篇文章主要介紹了如何讓C++函數(shù)返回值死心塌地為你工作,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • C++全面細(xì)致講解復(fù)數(shù)類(lèi)

    C++全面細(xì)致講解復(fù)數(shù)類(lèi)

    本文章向大家介紹C++ 標(biāo)準(zhǔn)庫(kù)中的復(fù)數(shù)類(lèi),主要包括C++ 標(biāo)準(zhǔn)庫(kù)中的復(fù)數(shù)類(lèi)使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-06-06
  • 淺析C++中的多線程編程

    淺析C++中的多線程編程

    這篇文章主要為大家詳細(xì)介紹了C++中的多線程編程,包括創(chuàng)建線程、同步線程、傳遞數(shù)據(jù)給線程以及異常處理等方面,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • C語(yǔ)言中單目操作符++、–的實(shí)例講解

    C語(yǔ)言中單目操作符++、–的實(shí)例講解

    C語(yǔ)言的操作符共分為算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符,逗號(hào)表達(dá)式,下表引用、函數(shù)調(diào)用和結(jié)構(gòu)成員這10大類(lèi),這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中單目操作符++、–的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • C++實(shí)現(xiàn)RSA加密解密算法是示例代碼

    C++實(shí)現(xiàn)RSA加密解密算法是示例代碼

    非對(duì)稱(chēng)加密方式可以使通信雙方無(wú)需事先交換密鑰就可以建立安全通信,因此被廣泛應(yīng)用于身份認(rèn)證、數(shù)字簽名、等信息交換領(lǐng)域。其中最具有代表性的非對(duì)稱(chēng)加密方式就是RSA公鑰密碼體制。本文將用C++實(shí)現(xiàn)RSA加密解密算法,需要的可以參考一下
    2022-09-09

最新評(píng)論

嵩明县| 策勒县| 大连市| 九寨沟县| 丰原市| 梧州市| 石棉县| 洞口县| 易门县| 阜新| 颍上县| 邹平县| 新建县| 济阳县| 毕节市| 太和县| 五台县| 望都县| 铁岭县| 桐庐县| 巴楚县| 科技| 弥勒县| 什邡市| 卢湾区| 宁津县| 堆龙德庆县| 吉林市| 浪卡子县| 克拉玛依市| 睢宁县| 新竹县| 金坛市| 铁岭县| 巩义市| 来宾市| 广平县| 白城市| 公主岭市| 台南县| 玉田县|