重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
五子棋是是一种两人对弈的纯策略型棋类游戏,通常双方分别使用黑白两色的棋子在棋盘交替下棋,先形成五子连线者获胜。此次课程设计主要目的是实现五子棋的双人对弈,对战双方通过鼠标点击进行对弈。
成都创新互联公司是一家从事企业网站建设、网站建设、网站设计、行业门户网站建设、网页设计制作的专业网站建设公司,拥有经验丰富的网站建设工程师和网页设计人员,具备各种规模与类型网站建设的实力,在网站建设领域树立了自己独特的设计风格。自公司成立以来曾独立设计制作的站点上千余家。二、系统实现游戏通过鼠标点击实现下棋,黑白子交替下棋。
三、关键技术 1、类定义程序通过使用easyx来实现图形界面,在程序中需要调用头文件#include
主要实现棋盘的建造,通过数学的坐标系知识进行建造。第一个for循环实现打印横线,第二个for循环实现打印竖线。rectangle函数实现加粗边框、通过solidcircle函数打印小圆点便于下棋定位,outtextxy函数打印游戏名称。
打印棋盘结果如图。
3、void chess::printchess()主要实现棋子的打印,通过for循环遍历数组找出值为-1的元素打印黑子,值为1的元素打印白子。棋子的打印通过solidcircle打印实心圆,通过setfillcolor改变棋子颜色。注意实心圆打印的位置要应用坐标系知识,实现棋盘坐标与窗口坐标的转换。
4、int chess::set1(int x,int y)与int chess::set2(int x, int y)通过两个函数访问chess数组元素,为元素赋值,再调用
void chess::printchess()函数实现下棋。
5、int chess::judge(int x, int y)通过for循环遍历数组,找到水平、竖直、斜向上、斜向下四个方向的五子连珠,注意i和j的增减问题。若判定为游戏胜负已分,则返回1.否则返回0。
6、主函数main主函数中定义类chess的一个变量为wuziqi。通过loadimage、putimage等函数实现窗口大小设定即窗口背景的打印。窗口背景图片应和项目放在一个文件夹,如图。再调用wuziqi.buildboard()实现完整的棋盘打印。程序下棋通过鼠标交互,在主函数中通过获取鼠标消息实现。运用坐标系知识,通过绝对值比较来坐标校准,实现鼠标指定点下棋。再通过flag的奇偶判定与wuziqi.set1(x, y)函数wuziqi.set2(x, y);函数的调用实现玩家交替下棋。调用wuziqi.judge(x,y) == 1函数判定游戏是否胜负已分,若游戏结束,则弹出窗口。窗口名为“恭喜”,窗口内容为“游戏结束,你赢了”,选项为“确定”。
四、源码分享#include#includeusing namespace std;
class chess {
public:
void buildboard(); //棋盘绘制
void printchess();
int set1(int x, int y);
int set2(int x, int y);
int judge(int x, int y);
private:
int chess[15][15]; //存储棋子状态,初始化为0,-1为黑子,1为白子
};
void chess::buildboard()
{
setlinecolor(WHITE); //设置线条颜色
setlinestyle(PS_SOLID, 2);
//线条间距为40
for (int i = 1; i< 16; i++) {
line(30, i * 40, 30 + 40 * 14, 40 * i);
}
for (int i = 0; i< 15; i++) {
line(30 + i * 40, 40, 30 + i * 40, 40 * 15);
}
//绘制边框与棋盘定点
setlinestyle(PS_SOLID, 4);
rectangle(30, 40, 30 + 14 * 40, 40 * 15);
setfillcolor(WHITE);
solidcircle(30 + 7 * 40, 40 * 8, 5); //中间
solidcircle(30 + 3 * 40, 40 * 4, 5); //左上
solidcircle(30 + 3 * 40, 40 * 12, 5); //左下
solidcircle(30 + 10 * 40, 40 * 4, 5); //右上
solidcircle(30 + 10 * 40, 40 * 12, 5); //右下
settextstyle(30, 0, "宋体");
outtextxy(600, 60, "五子棋游戏");
outtextxy(600, 100, "玩家一:黑子");
outtextxy(600, 140, "玩家二:白子");
}
void chess::printchess() {
for (int i = 0; i< 15; i++) {
for (int j = 0; j< 15; j++) {
if (chess[i][j] == -1) {
setfillcolor(BLACK);
solidcircle(30 + i * 40, 40 * (j + 1), 10);
}
else if (chess[i][j] == 1) {
setfillcolor(WHITE);
solidcircle(30 + i * 40, 40 * (j + 1), 10);
}
}
}
}
int chess::set1(int x, int y) {
chess[x][y] = -1;
chess::printchess();
return 0;
}
int chess::set2(int x, int y) {
chess[x][y] = 1;
chess::printchess();
return 0;
}
int chess::judge(int x, int y)
{
for (int i = 0; i< 15; i++) {
for (int j = 0; j< 15; j++) {
if (chess[i][j] == 1
&& chess[i][j + 1] == 1
&& chess[i][j + 2] == 1
&& chess[i][j + 3] == 1
&& chess[i][j + 4] == 1) {
return 1;
}
if (chess[i][j] == -1
&& chess[i][j + 1] == -1
&& chess[i][j + 2] == -1
&& chess[i][j + 3] == -1
&& chess[i][j + 4] == -1) {
return 1;
}
if (chess[i][j] == 1
&& chess[i + 1][j] == 1
&& chess[i + 2][j] == 1
&& chess[i + 3][j] == 1
&& chess[i + 4][j] == 1) {
return 1;
}
if (chess[i][j] == -1
&& chess[i + 1][j] == -1
&& chess[i + 2][j] == -1
&& chess[i + 3][j] == -1
&& chess[i + 4][j] == -1) {
return 1;
}
if (chess[i][j] == 1
&& chess[i + 1][j - 1] == 1
&& chess[i + 2][j - 2] == 1
&& chess[i + 3][j - 3] == 1
&& chess[i + 4][j - 4] == 1) {
return 1;
}
if (chess[i][j] == -1
&& chess[i + 1][j - 1] == -1
&& chess[i + 2][j - 2] == -1
&& chess[i + 3][j - 3] == -1
&& chess[i + 4][j - 4] == -1) {
return 1;
}
if (chess[i][j] == 1
&& chess[i + 1][j + 1] == 1
&& chess[i + 2][j + 2] == 1
&& chess[i + 3][j + 3] == 1
&& chess[i + 4][j + 4] == 1) {
return 1;
}
if (chess[i][j] == -1
&& chess[i + 1][j + 1] == -1
&& chess[i + 2][j + 2] == -1
&& chess[i + 3][j + 3] == -1
&& chess[i + 4][j + 4] == -1) {
return 1;
}
}
}
}
int main() {
chess wuziqi;
initgraph(800, 720); //绘图窗口样式默认为NULL
IMAGE background;
loadimage(&background, "beijin.jpg"); //从文件中读取图片
putimage(0, 0, &background); //输出图片
wuziqi.buildboard();
ExMessage m; //定义一个消息变量
int flag = 0;
while (1) {
m = getmessage(EX_MOUSE);//获取鼠标消息
int x = 0, y = 0;
for (int i = 0; i< 15; i++)
{
for (int j = 0; j< 15; j++)
{
if (abs(m.x - 30 - i * 40)< 20 && abs(m.y - 40 - j * 40)< 20) //将点击的范围内的值取整
{
x = i; //坐标
y = j;
}
}
}
if (m.message == WM_LBUTTONDOWN) {
flag++;
if (flag % 2 != 0) {
wuziqi.set1(x, y);
}
else {
wuziqi.set2(x, y);
}
if (wuziqi.judge(x, y) == 1) {
MessageBox(GetHWnd(), "游戏结束,你赢了", "提示", MB_OK); //窗口句柄,消息内容,消息标题,按钮类型
exit(1);
}
}
}
system("pause");
return 0;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧