displaylink-宽带连接线

电脑单机象棋
2023年4月6日发(作者:英雄联盟体验服转换器)

CC++游戏项⽬详细教程:《中国象棋》

中国象棋是起源于中国的⼀种棋,属于⼆⼈对抗性游戏的⼀种,在中国有着悠久的历史。

由于⽤具简单,趣味性强,成为流⾏极为⼴泛的棋艺活动。

中国象棋的中国棋⽂化,也是中华民族的⽂化瑰宝,它源远流长,趣味浓厚,基本规则简明

易懂。中国象棋在中国的群众中基础远远超过围棋,是普及最⼴的棋类项⽬,中国象棋已流

传到⼗⼏个国家和地区。

中国象棋使⽤⽅形格状棋盘,圆形棋⼦共有32个,红⿊⼆⾊各有16个棋⼦,摆放和活动在交

叉点上。双⽅交替⾏棋,先把对⽅的将(帅)“将死”的⼀⽅获胜。

我们今天就来看看我们⾃⼰能不能写出这样⼀个游戏呢?

今天就不话不多说了,先说⼀下,今天我们做的是⼀个简易版的单机中国象棋,希望⼤家理解,联⽹对弈的话需要⽤到的知识过多,数据库

以及⽹络协议这些⼤部分同学都没有学,所以我们今天就简单的实现《中国象棋》的简单对弈,主要是希望同学们可以理解其中的逻辑关

系,之后就可以更好的去完善

⾏吧,我们现在就开始吧

今天先出场的就不是我们的⽼朋友结构体了,⽽是我们的新朋友枚举类型

enumPieces//棋⼦

{

NONE=-1,

⾞,⾺,象,⼠,将,砲,卒,

俥,马,相,仕,帥,炮,兵,

BEGIN,END,

};

//给id赋值

enumPiecesredChess[]={⾞,⾺,象,⼠,将,砲,卒};

enumPiecesblackChess[]={俥,马,相,仕,帥,炮,兵};

//绘制时转化成字符串

constchar*ChessName[]={"⾞","⾺","象","⼠","将","砲","卒","俥","马","相","仕","帥","炮","兵"};

接下来出场的是我们的⽼朋友结构体

//每⼀个棋⼦的属性

structChess

{

enumPiecesid;//棋⼦名称

DWORDtype;//棋⼦类型,红?⿊?

shortx;

shorty;

boolisRiver;//是否过了河

};

//游戏地图

structChessmap[ROW][COL];

structState

{

intbegr;

intbegc;

intendr;

intendc;

intstate;

}state={-1,-1,-1,-1,BEGIN};

我们的初始化函数,⼀定要想好其中的逻辑

//初始化数据

voidinit()

{

//遍历地图

for(size_ti=0;i

{

size_ttemp=0;

for(size_tk=0;k

{

map[i][k].id=NONE;//先把棋⼦置为没有

if(i<=4)//⿊棋⼦

{

map[i][k].type=BLACK;

if(i==0)//放置第⼀⾏的棋⼦

{

//01234

if(k<=4)

{

temp=k;

}

//3210

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)//放置第⼀⾏的棋⼦

{

//01234

if(k<=4)

{

temp=k;

}

//3210

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;

}

}

}

接下来是我们的绘制函数

//绘制

voiddraw()

{

setfillcolor(RGB(252,215,162));

setlinestyle(PS_SOLID,2);

//设置⽂字的样式

settextstyle(30,0,"楷体");

for(size_ti=0;i

{

for(size_tk=0;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]);

}

}

}

后⾯是我们的重点,⿏标控制函数,以后类似的游戏项⽬都会有这样的函数,好好理解

//⿏标操作

voidmouseEvent()

{

ExMessagemsg;//定义消息结构体变量

if(peekmessage(&msg,EM_MOUSE))

{

if(e==WM_LBUTTONDOWN)//⿏标左键按下

{

//通过⿏标坐标得出点击的数组的下标

//k*GRID_SIZE+INTERVAL=x;

intcol=(msg.x-INTERVAL)/GRID_SIZE;

introw=(msg.y-INTERVAL)/GRID_SIZE;

//下标校准

if(msg.x>map[row][col].x+30&&msg.y

{

col++;

}

if(msg.xmap[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(==BEGIN)

{

=row;

=col;

=END;

}

elseif(==END)

{

=row;

=col;

=BEGIN;

}

chessMove();

}

}

}

重点中的重点,棋⼦的移动函数,游戏的规则也就在这⾥体现出来

//移动棋⼦

voidchessMove()

{

printf("beg(%d%d)end(%d%d)n",,,,);

boolcanMove=false;

//什么情况下能够移动棋⼦

if(!(==&&==)&&//点击的不是同⼀个棋⼦

!=-1&&!=-1&&//下标必须合法

map[][].id!=NONE//没有棋⼦不能移动

/*&&map[][].type!=map[][].type*/)//不能⾃⼰吃⾃⼰

{

switch(map[][].id)

{

case⾞:

case俥:

if(==||==)

{

//起始点和结束点之间是否有阻碍

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("canMoven");

map[][].id=map[][].id;

map[][].id=NONE;

map[][].isRiver=map[][].isRiver;

map[][].type=map[][].type;

}

}

}

最后就是我们的主函数,进⾏调⽤,让项⽬运⾏起来

intmain()

{

//创建图形窗⼝

initgraph(740,820,EW_SHOWCONSOLE);

//设置背景模式

setbkmode(TRANSPARENT);

//贴棋盘

IMAGEimg_board;

loadimage(&img_board,"./res/");

init();

//双缓冲绘图,防⽌闪屏

BeginBatchDraw();

while(true)

{

cleardevice();

putimage(0,0,&img_board);

draw();

mouseEvent();

FlushBatchDraw();

}

EndBatchDraw();

getchar();

return0;

}

这样⼀个简易版的《中国象棋》游戏项⽬就解决啦,重点就是逻辑,⼀定要想清楚,想要实

现联⽹的同学就要更加的去想清楚,以及去提⾼⾃⼰的能⼒,好啦,希望可以让⼤家从中感

受到编程的快乐吧,也希望⼤家可以给UP主⼀个关注,⾮常感谢⼤家了

后续UP主还会发布更多的项⽬源码以及学习资料,希望⼤家可以持续关注,有什么问题可以

回帖留⾔,我尽量回答。想要C/C++学习资料以及其他项⽬的源码的可以加群

【1083227756】了解。想要对程序员的未来发展有兴趣的也可加群闲聊。也可以关注微信公

众号:【狐狸的编码时光】,希望和⼤家⼀起学习进步

点击下⽅链接进群更快拿到学习资料以及项⽬素材

更多推荐

电脑单机象棋