本游戏用到了图形界面库graphics.h,图形界面库下载安装:
下载链接: https://easyx.cn/downloads/.
下方有源码。
玩家对战,人机对战,音乐播放,重开,悔棋,投降等。
所以要完成上面的功能,我们要:
我们先设置窗口背景颜色,清理画布,然后设置文字颜色,设置窗口透明,设置文字大小,字体与内容
欢迎界面:
void hello()
{
initgraph(800, 600); //设置窗口大小
setbkcolor(WHITE); //设置背景为白色
cleardevice(); //清理画布
mciSendString(TEXT(" open 音乐.mp3 alias mysong"), NULL, 0, NULL); //选择音乐
mciSendString(TEXT("play mysong"), NULL, 0, NULL); //播放音乐
}
游戏界面:
initgraph(600, 800);
cleardevice();
settextcolor(RED); //设置文字颜色
setbkmode(TRANSPARENT); //设置窗口透明
settextstyle(128, 0, "宋体"); //设置字体大小、宽度、字体
outtextxy(100, 100, "五子棋");
setlinecolor(RED);
rectangle(150, 300, 450, 650);
rectangle(160, 310, 440, 640);
line(160, 420, 440, 420);
line(160, 530, 440, 530);
settextstyle(65, 0, "华文琥珀");
outtextxy(170, 340, "人机大战");
outtextxy(170, 450, "双人对战");
outtextxy(170, 560, "联系作者");
setlinecolor(WHITE);
settextcolor(WHITE);
settextstyle(23, 0, "华文琥珀");
outtextxy(527, 37, "音乐");
circle(550, 50, 25);
绘画出棋盘
棋盘绘制:
void board()
{
initgraph(1200, 800); //设置窗口大小
setbkcolor(BLACK);
cleardevice();
setlinecolor(WHITE);
for (int i = 50; i <= 750; i += 50) //使用for循环绘制棋盘
{
line(i, 50, i, 750);
line(50, i, 750, i);
}
for (int i = 200; i < 800; i += 400)
{
for (int j = 200; j < 800; j += 400)
fillcircle(i, j, 5);
}
}
棋子绘制:
setrop2(R2_COPYPEN); //二元光栅操作码:R2_COPYPEN当前颜色
setfillcolor(RED); //红方棋子
fillcircle(m.x, m.y, 20);
setfillcolor(WHITE); //白方棋子
fillcircle(m.x, m.y, 20);
定义鼠标,使用鼠标来模拟落子操作
MOUSEMSG m; // 定义鼠标消息
m = GetMouseMsg(); //获取鼠标消息
if (m.uMsg == WM_LBUTTONDOWN) // 使用鼠标左键进行操作
{
int x,y;
if (x >= 25) //锁定鼠标,使落子在棋盘中心
m.x = m.x - x + 50;
else
m.x = m.x - x;
if (y >= 25)
m.y = m.y - y + 50;
else
m.y = m.y - y;
}
重开:
即重绘棋盘,调用绘画棋盘函数board()即可。
悔棋:
使用数组定义落子位置,记录每次上次落子的位置,重新绘制即可。
int red[15][15],white[15][15],stick[15][15]; //设置红方落子,白方落子以及该位置是否落子
board();
投降:
判断现在是哪一方落子,点击投降即该方落败。
音乐播放/暂停:
int cont=0;
if (cont % 2 == 0)
{
mciSendString(TEXT("pause mysong"), NULL, 0, NULL);
cont++; //暂停音乐
}
else
{
mciSendString(TEXT("resume mysong"), NULL, 0, NULL);
cont++; //播放音乐
}
胜利判断:
因为开始使用数组进行标记,由返回值判断五子是否连成一线。
int success(int x[15][15])
{
int m, n;
for (m = 0; m < 15; m++)
{
for (n = 0; n < 15; n++)
{
if (x[m][n] == 1 && x[m][n + 1] == 1 && x[m][n + 2] == 1 && x[m][n + 3] == 1 && x[m][n + 4] == 1)return 1;
if (x[m][n] == 1 && x[m + 1][n] == 1 && x[m + 2][n] == 1 && x[m + 3][n] == 1 && x[m + 4][n] == 1)return 1;
if (x[m][n] == 1 && x[m + 1][n + 1] == 1 && x[m + 2][n + 2] == 1 && x[m + 3][n + 3] == 1 && x[m + 4][n + 4] == 1)return 1;
if (n > 3 && x[m][n] == 1 && x[m + 1][n - 1] == 1 && x[m + 2][n - 2] == 1 && x[m + 3][n - 3] == 1 && x[m + 4][n - 4] == 1)return 1;
}
}
return 0;
}
我这个AI的算法只是比较简单的,或者说是呆,如果大家想写一些NB一点的,对五子棋感兴趣的可以使用权值判断来编写人机代码。