项目仓库:https://gitee.com/siwenzhi/gobang
#include
#include
#include
#include
#include
#include
#include
#include
#pragma comment(lib,"Winmm.lib")
using namespace std;
const int xx = 260;
const int yy = 200;
int box[18][18];
void menu();
void ai_game();
void go_game();
void game_help();
void game_about();
void game_out();
void draw();
void mousetest(); //字符串定位用
void yiyan();
int judge(int x, int y, int f);
char geyan[6][1000] = { {"先手要攻,后手要守"},{"以攻为守,以守待攻"},{"初盘争二,终局抢三"},
{"留三不冲,变化万千"},{"连三连四,易见为明"} };
int main()
{
menu();
return 0;
}
void menu()
{
char g_n[] = "2.双人游戏", g_h[] = "3.游戏帮助";
char g_a[] = "4.关于我们", g_o[] = "5.退出游戏";
HWND hwnd = initgraph(700, 700);
SetWindowTextA(hwnd, "五子棋游戏-升达");
setbkcolor(RGB(255, 205, 150)); //设置当前设备绘图背景色。
cleardevice(); //用当前背景色清空画布
settextcolor(BLACK); //字体颜色
settextstyle(30, 22, _T("Consolas")); //字体高宽比(像素) 30/22 最佳
outtextxy(xx, yy - 80, "1.人机对战");
outtextxy(xx, yy, g_n); // (247,192) (495,240) 左上 右下 坐标
outtextxy(xx, yy + 80, g_h); //(247,273) (495,315)
outtextxy(xx, yy + 160, g_a); //(247,355) (495,394)
outtextxy(xx, yy + 240, g_o); //(247,437) (495,476)
yiyan();/
MOUSEMSG m; // 获取鼠标信息
while (true)
{
m = GetMouseMsg();
if ((m.x >= 247 && m.x <= 495) && (m.y >= 114 && m.y <= 152) && !m.mkLButton)
{
setcolor(YELLOW);
line(247, 114, 272, 114); //左上
line(247, 114, 247, 139);
line(495, 152, 495, 127); //右下
line(495, 152, 470, 152);
}
else if ((m.x >= 247 && m.x <= 495) && (m.y >= 114 && m.y <= 152) && m.mkLButton)
{
ai_game(); break;
}
else
{
setcolor(RED);
line(247, 114, 272, 114); //左上
line(247, 114, 247, 139);
line(495, 152, 495, 127); //右下
line(495, 152, 470, 152);
}
if ((m.x >= 247 && m.x <= 495) && (m.y >= 192 && m.y <= 240) && !m.mkLButton)
{
setcolor(YELLOW);
line(247, 192, 272, 192); //左上
line(247, 192, 247, 217);
line(495, 240, 470, 240); //右下
line(495, 215, 495, 240);
}
else if ((m.x >= 247 && m.x <= 495) && (m.y >= 192 && m.y <= 240) && m.mkLButton)
{
go_game(); break;
}
else
{
setcolor(RED);
line(247, 192, 272, 192); //左上
line(247, 192, 247, 217);
line(495, 240, 470, 240); //右下
line(495, 215, 495, 240);
}
if ((m.x >= 247 && m.x <= 495) && (m.y >= 280 && m.y <= 315) && !m.mkLButton)
{
setcolor(YELLOW);
line(247, 273, 272, 273); //左上
line(247, 273, 247, 298);
line(495, 315, 495, 290); //右下
line(495, 315, 470, 315);
}
else if ((m.x >= 247 && m.x <= 495) && (m.y >= 280 && m.y <= 315) && m.mkLButton)
{
game_help(); break; //游戏帮助页
}
else
{
setcolor(RED);
line(247, 273, 272, 273); //左上
line(247, 273, 247, 298);
line(495, 315, 495, 290); //右下
line(495, 315, 470, 315);
}
if ((m.x >= 247 && m.x <= 495) && (m.y >= 355 && m.y <= 394) && !m.mkLButton)
{
setcolor(YELLOW);
line(247, 355, 247, 380); //左上
line(247, 355, 272, 355);
line(495, 394, 495, 369); //右下
line(495, 394, 470, 394);
}
else if ((m.x >= 247 && m.x <= 495) && (m.y >= 355 && m.y <= 394) && m.mkLButton)
{
game_about(); break; //关于游戏页
}
else
{
setcolor(RED);
line(247, 355, 247, 380); //左上
line(247, 355, 272, 355);
line(495, 394, 495, 369); //右下
line(495, 394, 470, 394);
}
if ((m.x >= 247 && m.x <= 495) && (m.y >= 437 && m.y <= 476) && !m.mkLButton)
{
setcolor(YELLOW);
line(247, 437, 247, 462); //左上
line(247, 437, 272, 437);
line(495, 476, 495, 451); //右下
line(495, 476, 470, 476);
}
else if ((m.x >= 247 && m.x <= 495) && (m.y >= 437 && m.y <= 476) && m.mkLButton)
{
game_out(); break; //退出页
}
else
{
setcolor(RED);
line(247, 437, 247, 462); //左上
line(247, 437, 272, 437);
line(495, 476, 495, 451); //右下
line(495, 476, 470, 476);
}
if ((m.x >= 100 && m.x <= 642) && (m.y >= 599 && m.y <= 622) && m.mkLButton)
{
yiyan();
}
}
closegraph();
}
void ai_game()
{
draw();
memset(box, 0, sizeof(box)); //棋盘初始化 重要!!!!
int yinyue = 0;
int year1, year2, month1, month2, day1, day2, hour1, hour2, min1, min2, sec1, sec2;
char charyear[10], charmonth[10], charday[10], charhour[10], charmin[10], charsec[10];
time_t rawtime;
struct tm* getime;
time(&rawtime);
getime = localtime(&rawtime);
year1 = getime->tm_year + 1900;
month1 = getime->tm_mon + 1;
day1 = getime->tm_mday;
hour1 = getime->tm_hour;
min1 = getime->tm_hour;
sec1 = getime->tm_sec;
settextstyle(15, 10, _T("Consolas"));
outtextxy(590, 182, "-人机对战-");
outtextxy(599, 242, "开启音乐");
outtextxy(599, 292, "返回菜单");
outtextxy(599, 342, "退出游戏");
int a, b, a1, b1,c=0,d=0,k=0,f=1; //行列坐标及其备份 k用来判断是否落子 以相应选择框 f=1 为黑 简单版固定为用户先落子
setcolor(WHITE); settextstyle(30, 22, _T("Consolas"));
outtextxy(210, 630, "玩家执黑先行~");
MOUSEMSG m, t;
while (1)
{
m = GetMouseMsg();
if ((m.x >= 40 && m.x <= 580) && (m.y >= 40 && m.y <= 580) && f )//判定鼠标位置在棋盘内 且 轮到玩家落子
{
a=(m.x + 18)/36; b=(m.y+18)/36; //行列坐标
a1=a; b1=b;
if (box[a][b] == 0 && f)
{
a = a * 36 + 4; b = b * 36 + 4; //精确到十字线
setcolor(YELLOW); //黄色选择框
line(a - 8, b - 8, a - 13, b - 8); //左上
line(a - 8, b - 8, a - 8, b - 13);
line(a + 8, b - 8, a + 13, b - 8); //右上
line(a + 8, b - 8, a + 8, b - 13);
line(a - 8, b + 8, a - 13, b + 8); //左下
line(a - 8, b + 8, a - 8, b + 13);
line(a + 8, b + 8, a + 13, b + 8); //右下
line(a + 8, b + 8, a + 8, b + 13);
setcolor(RGB(255, 205, 150));
if ((c != a || d != b) && (!k)) //没有落子则用原色覆盖选择框
{
line(c - 8, d - 8, c - 13, d - 8);//左上
line(c - 8, d - 8, c - 8, d - 13);
line(c + 8, d - 8, c + 13, d - 8); //右上
line(c + 8, d - 8, c + 8, d - 13);
line(c - 8, d + 8, c - 13, d + 8); //左下
line(c - 8, d + 8, c - 8, d + 13);
line(c + 8, d + 8, c + 13, d + 8);//右下
line(c + 8, d + 8, c + 8, d + 13);
}
c = a; d = b; //分别复制a,b 响应选择框
if (m.mkLButton)
{
setlinecolor(BLACK); setfillcolor(BLACK); f = 0;
fillcircle(a, b, 16);
box[a1][b1] = 1;
k = 1;
int r = judge(a1, b1, 0);
if (r==1)
{
srand((int)time(0));
int suiji = rand() % 5;
settextstyle(22, 18, _T("Consolas"));
setcolor(RGB(255, 205, 150));
setfillcolor(RGB(255, 205, 150));
fillrectangle(210, 630, 460, 670);
setcolor(YELLOW);
outtextxy(80, 630, "小口诀-->");
outtextxy(260, 630, geyan[suiji]);
setcolor(YELLOW);
setbkcolor(RGB(255, 205, 150));
fillrectangle(184, 120, 436, 440);//绘制结算框
outtextxy(245, 125, "对局结束");
settextstyle(22, 18, _T("Consolas"));
outtextxy(243, 165, "玩家获胜");
setcolor(BLACK);
settextstyle(15, 10, _T("Consolas"));
outtextxy(238, 200, "★★★对局详情★★★");
time(&rawtime);
getime = localtime(&rawtime);
year2 = getime->tm_year + 1900;
month2 = getime->tm_mon + 1;
day2 = getime->tm_mday;
hour2 = getime->tm_hour;
min2 = getime->tm_hour;
sec2 = getime->tm_sec;
int dhour = 0, dmin = 0, dsec = 0, t1, t2;
t1 = hour1 * 3600 + min1 * 60 + sec1;
t2 = hour2 * 3600 + min2 * 60 + sec2;
t2 = t2 - t1;
dhour = t2 / 3600; dmin = (t2 - dhour * 3600) / 60; dsec = t2 - dhour * 3600 - dmin * 60;
sprintf_s(charhour, "%02d:", dhour);
sprintf_s(charmin, "%02d:", dmin);
sprintf_s(charsec, "%02d", dsec);
outtextxy(215, 230, "对局用时:");
outtextxy(307, 230, charhour);
outtextxy(340, 230, charmin);
outtextxy(373, 230, charsec);
outtextxy(215, 260, "开始时间:");
sprintf_s(charyear, "%d.", year1);
sprintf_s(charmonth, "%02d.", month1);
sprintf_s(charday, "%02d", day1);
sprintf_s(charhour, "%02d:", hour1);
sprintf_s(charmin, "%02d:", min1);
sprintf_s(charsec, "%02d", sec1);
outtextxy(307, 260, charyear);
outtextxy(355, 260, charmonth);
outtextxy(385, 260, charday);
outtextxy(307, 280, charhour);
outtextxy(340, 280, charmin);
outtextxy(373, 280, charsec);
outtextxy(215, 310, "结束时间:");
sprintf_s(charyear, "%d.", year2);
sprintf_s(charmonth, "%02d.", month2);
sprintf_s(charday, "%02d", day2);
sprintf_s(charhour, "%02d:", hour2);
sprintf_s(charmin, "%02d:", min2);
sprintf_s(charsec, "%02d", sec2);
outtextxy(307, 310, charyear);
outtextxy(355, 310, charmonth);
outtextxy(385, 310, charday);
outtextxy(307, 330, charhour);
outtextxy(340, 330, charmin);
outtextxy(373, 330, charsec);
settextstyle(16, 13, _T("Consolas"));
outtextxy(260, 364, "再来一局");
outtextxy(260, 401, "退出游戏");
break;
}
else
{
settextstyle(30, 22, _T("Consolas"));
setcolor(WHITE); setfillcolor(WHITE);
outtextxy(190, 630, "请等待电脑落子~");
}
}
else
k = 0;
}
}
else if(!f)//该电脑落子了 a1,b1 是用户最后一个落子 这里要先判断用户是否已经连续三个子 及时围堵
{
f = 1;
int nx, ny;
//int ne[8][2] = { {0,1},{0,-1},{1,0},{-1,0},{-1,-1},{1,1},{-1,1},{1,-1} };
int fff=0;
if ( (a1 - 1 <= 0) || box[a1 - 1][b1] == 0) fff++;
if ( (a1 + 1 > 16) || box[a1 + 1][b1] == 0) fff++;
if ( (b1 - 1 <= 0) || box[a1][b1 - 1] == 0) fff++;
if ( (b1 + 1 > 16) || box[a1][b1 + 1] == 0) fff++;
if ((a1 - 1 <= 0) || (b1 - 1 <= 0) || box[a1 - 1][b1 - 1] == 0) fff++; //左上
if ((a1 - 1 <= 0) || (b1 + 1 > 16) || box[a1 - 1][b1 + 1] == 0) fff++; //左下
if ((a1 + 1 > 16) || (b1 + 1 > 16) || box[a1 + 1][b1 + 1] == 0) fff++; //右下
if ((a1 + 1 > 16) || (b1 - 1 <= 0) || box[a1 + 1][b1 + 1] == 0) fff++; //右上
if (fff == 8 && (a1-1>0) ) //右
{
box[a1 - 1][b1] = 2;
nx = a1 - 1; ;
ny = b1 ;
}
else if (fff == 8 && (a1 + 1 <= 16)) //左
{
box[a1 + 1][b1] = 2;
nx = a1 + 1;
ny = b1 ;
}
else if (fff == 8 && (b1 - 1 > 0)) //上
{
box[a1][b1 - 1] = 2;
ny = b1 - 1;
nx = a1;
}
else if (fff == 8 && (b1 + 1 <= 16)) //下
{
box[a1][b1 + 1] = 2;
ny = b1 + 1;
nx = a1 ;
}
else if (fff == 8 && (a1 - 1 > 0) && (b1 - 1 > 0)) //左上
{
box[a1 - 1][b1 - 1] = 2;
nx = a1 - 1;
ny = b1 - 1;
}
else if (fff == 8 && (a1 - 1 > 0) && (b1 + 1 <= 16)) //左下
{
box[a1 - 1][b1 + 1] = 2;
nx = a1 - 1;
ny = b1 + 1;
}
else if (fff == 8 && (a1 + 1 <= 16) && (b1 - 1 > 0)) //右上
{
box[a1 + 1][b1 - 1] = 2;
nx = a1 + 1;
ny = b1 - 1;
}
else if (fff == 8 && (a1 + 1 <= 16) && (b1 + 1 <= 16)) //右下
{
box[a1 + 1][b1 + 1] = 2;
nx = a1 + 1;
ny = b1 + 1;
}
if (fff == 8)
{
int nx1=nx, ny1=ny;
setlinecolor(WHITE); setfillcolor(WHITE);
nx = nx * 36 + 4; ny = ny * 36 + 4;
fillcircle(nx, ny, 16);
int r = judge(nx1, ny1, f);
if (r == 1)
{
srand((int)time(0));
int suiji = rand() % 5;
settextstyle(22, 18, _T("Consolas"));
setcolor(RGB(255, 205, 150));
setfillcolor(RGB(255, 205, 150));
fillrectangle(210, 630, 460, 670);
setcolor(YELLOW);
outtextxy(80, 630, "小口诀-->");
outtextxy(260, 630, geyan[suiji]);
setcolor(YELLOW);
setbkcolor(RGB(255, 205, 150));
fillrectangle(184, 120, 436, 440);//绘制结算框
outtextxy(245, 125, "对局结束");
settextstyle(22, 18, _T("Consolas"));
outtextxy(243, 165, "电脑获胜");
setcolor(BLACK);
settextstyle(15, 10, _T("Consolas"));
outtextxy(238, 200, "★★★对局详情★★★");
time(&rawtime);
getime = localtime(&rawtime);
year2 = getime->tm_year + 1900;
month2 = getime->tm_mon + 1;
day2 = getime->tm_mday;
hour2 = getime->tm_hour;
min2 = getime->tm_hour;
sec2 = getime->tm_sec;
int dhour = 0, dmin = 0, dsec = 0, t1, t2;
t1 = hour1 * 3600 + min1 * 60 + sec1;
t2 = hour2 * 3600 + min2 * 60 + sec2;
t2 = t2 - t1;
dhour = t2 / 3600; dmin = (t2 - dhour * 3600) / 60; dsec = t2 - dhour * 3600 - dmin * 60;
sprintf_s(charhour, "%02d:", dhour);
sprintf_s(charmin, "%02d:", dmin);
sprintf_s(charsec, "%02d", dsec);
outtextxy(215, 230, "对局用时:");
outtextxy(307, 230, charhour);
outtextxy(340, 230, charmin);
outtextxy(373, 230, charsec);
outtextxy(215, 260, "开始时间:");
sprintf_s(charyear, "%d.", year1);
sprintf_s(charmonth, "%02d.", month1);
sprintf_s(charday, "%02d", day1);
sprintf_s(charhour, "%02d:", hour1);
sprintf_s(charmin, "%02d:", min1);
sprintf_s(charsec, "%02d", sec1);
outtextxy(307, 260, charyear);
outtextxy(355, 260, charmonth);
outtextxy(385, 260, charday);
outtextxy(307, 280, charhour);
outtextxy(340, 280, charmin);
outtextxy(373, 280, charsec);
outtextxy(215, 310, "结束时间:");
sprintf_s(charyear, "%d.", year2);
sprintf_s(charmonth, "%02d.", month2);
sprintf_s(charday, "%02d", day2);
sprintf_s(charhour, "%02d:", hour2);
sprintf_s(charmin, "%02d:", min2);
sprintf_s(charsec, "%02d", sec2);
outtextxy(307, 310, charyear);
outtextxy(355, 310, charmonth);
outtextxy(385, 310, charday);
outtextxy(307, 330, charhour);
outtextxy(340, 330, charmin);
outtextxy(373, 330, charsec);
settextstyle(16, 13, _T("Consolas"));
outtextxy(260, 364, "再来一局");
outtextxy(260, 401, "退出游戏");
break;
}
else
{
settextcolor(WHITE);
outtextxy(190, 630, " 请玩家落子~");
continue; /注意这里直接结束了
}
}
struct aluo {
int sum = 0, f; // 0横 1竖 2左上右下 3右上左下
}aii[4];
int ss;
aii[0].f = 0; aii[0].sum = 0; ss = 0; //横
for (int i = a1 - 3; i <= a1 + 3; i++)
{
if (i <= 0) continue;
if (i > 16)
{
aii[0].sum = max(aii[0].sum, ss);
ss = 0;
break;
}
if (box[i][b1] == 1) ss++;
else
{
aii[0].sum = max(aii[0].sum, ss);
ss = 0;
}
}
aii[1].f = 1; aii[1].sum = 0; ss = 0; //竖
for (int i = b1 - 3; i <= b1 + 3; i++)
{
if (i <= 0) continue;
if (i > 16)
{
aii[1].sum = max(aii[1].sum, ss);
ss = 0;
break;
}
if (box[a1][i] == 1) ss++;
else
{
aii[1].sum = max(aii[1].sum, ss);
ss = 0;
}
}
aii[2].f = 2; aii[2].sum = 0; ss = 0;//左上右下
for (int i = a1 - 3, j = b1 - 3; i <= a1 + 3; i++, j++)
{
if (i <= 0 || j <= 0 ) continue;
if (i > 16 || j > 16)
{
aii[2].sum = max(aii[2].sum, ss);
ss = 0;
continue;
}
if (box[i][j] == 1) ss++;
else
{
aii[2].sum = max(aii[2].sum, ss);
ss = 0;
}
}
aii[3].f = 3; aii[3].sum = 0; ss = 0; //左下右上
for (int i = a1 - 3, j = b1 + 3; i <= a1 + 3; i++, j--)
{
if (i <= 0 || j <= 0) continue;
if (i > 16 || j > 16)
{
aii[3].sum = max(aii[3].sum, ss);
ss = 0;
continue;
}
if (box[i][j] == 1) ss++;
else
{
aii[3].sum = max(aii[3].sum, ss);
ss = 0;
}
}
for (int i = 0; i < 4; i++)
{
for (int j = i + 1; j < 4; j++)
{
if (aii[i].sum < aii[j].sum)
swap(aii[i], aii[j]);
}
}
int ff = 1; // 0横 1竖 2左上右下 3右上左下
for (int k = 0; k < 4; k++)
{
if (aii[k].f == 0)
{
for (int i = a1 - 1; i >= a1 - 3; i--)
{
if (i <= 0) break;
if (box[i][b1] == 2) break;
if (box[i][b1] == 0)
{
box[i][b1] = 2;
nx = i; ny = b1;
ff = 0;
break;
}
}
if (ff)
{
for (int i = a1 + 1; i <= a1 + 3; i++)
{
if (i > 16) break;
if (box[i][b1] == 2) break;
if (box[i][b1] == 0)
{
box[i][b1] = 2;
nx = i; ny = b1;
ff = 0;
break;
}
}
}
if (ff == 0) break;
}
else if (aii[k].f == 1)
{
for (int i = b1 - 1; i >= b1 - 3; i--)
{
if (i <= 0) break;
if (box[a1][i] == 2) break;
if (box[a1][i] == 0)
{
box[a1][i] = 2;
nx = a1; ny = i;
ff = 0;
break;
}
}
if (ff)
{
for (int i = b1 + 1; i <= b1 + 3; i++)
{
if (i > 16) break;
if (box[a1][i] == 2) break;
if (box[a1][i] == 0)
{
box[a1][i] = 2;
nx = a1; ny = i;
ff = 0;
break;
}
}
}
if (ff == 0) break;
}
else if (aii[k].f == 2)
{
for (int i = a1 - 1, j = b1 - 1; i >= a1 - 3; i--, j--)
{
if (i <= 0 || j <= 0) continue;
if (box[i][j] == 2) break;
if (box[i][j] == 0)
{
box[i][j] = 2;
nx = i; ny = j;
ff = 0;
break;
}
}
if (ff)
{
for (int i = a1 + 1, j = b1 + 1; i <= a1 + 3; i++, j++)
{
if (i > 16 || j > 16) continue;
if (box[i][j] == 2) break;
if (box[i][j] == 0)
{
box[i][j] = 2;
nx = i; ny = j;
ff = 0;
break;
}
}
}
if (ff == 0) break;
}
else if (aii[k].f == 3)
{
for (int i = a1 - 1, j = b1 + 1; i >= a1 - 3; i--, j++)
{
if (i <= 0 || j > 16) continue;
if (box[i][j] == 2) break;
if (box[i][j] == 0)
{
box[i][j] = 2;
nx = i; ny = j;
ff = 0;
break;
}
}
if (ff)
{
for (int i = a1 + 1, j = b1 - 1; i <= a1 + 3; i++, j--)
{
if (i > 16 || j <= 0) continue;
if (box[i][j] == 2) break;
if (box[i][j] == 0)
{
box[i][j] = 2;
nx = i; ny = j;
ff = 0;
break;
}
}
}
if (ff == 0) break;
}
}
if (ff == 0) //说明找到了合适的落子位置
{
int nx1 = nx, ny1 = ny;
nx = nx * 36 + 4; ny = ny * 36 + 4;
setlinecolor(WHITE); setfillcolor(WHITE);
fillcircle(nx, ny, 16);
int r = judge(nx1, ny1, f);
if (r == 1)
{
srand((int)time(0));
int suiji = rand() % 5;
settextstyle(22, 18, _T("Consolas"));
setcolor(RGB(255, 205, 150));
setfillcolor(RGB(255, 205, 150));
fillrectangle(210, 630, 460, 670);
setcolor(YELLOW);
outtextxy(80, 630, "小口诀-->");
outtextxy(260, 630, geyan[suiji]);
setcolor(YELLOW);
setbkcolor(RGB(255, 205, 150));
fillrectangle(184, 120, 436, 440);//绘制结算框
outtextxy(245, 125, "对局结束");
settextstyle(22, 18, _T("Consolas"));
outtextxy(243, 165, "电脑获胜");
setcolor(BLACK);
settextstyle(15, 10, _T("Consolas"));
outtextxy(238, 200, "★★★对局详情★★★");
time(&rawtime);
getime = localtime(&rawtime);
year2 = getime->tm_year + 1900;
month2 = getime->tm_mon + 1;
day2 = getime->tm_mday;
hour2 = getime->tm_hour;
min2 = getime->tm_hour;
sec2 = getime->tm_sec;
int dhour = 0, dmin = 0, dsec = 0, t1, t2;
t1 = hour1 * 3600 + min1 * 60 + sec1;
t2 = hour2 * 3600 + min2 * 60 + sec2;
t2 = t2 - t1;
dhour = t2 / 3600; dmin = (t2 - dhour * 3600) / 60; dsec = t2 - dhour * 3600 - dmin * 60;
sprintf_s(charhour, "%02d:", dhour);
sprintf_s(charmin, "%02d:", dmin);
sprintf_s(charsec, "%02d", dsec);
outtextxy(215, 230, "对局用时:");
outtextxy(307, 230, charhour);
outtextxy(340, 230, charmin);
outtextxy(373, 230, charsec);
outtextxy(215, 260, "开始时间:");
sprintf_s(charyear, "%d.", year1);
sprintf_s(charmonth, "%02d.", month1);
sprintf_s(charday, "%02d", day1);
sprintf_s(charhour, "%02d:", hour1);
sprintf_s(charmin, "%02d:", min1);
sprintf_s(charsec, "%02d", sec1);
outtextxy(307, 260, charyear);
outtextxy(355, 260, charmonth);
outtextxy(385, 260, charday);
outtextxy(307, 280, charhour);
outtextxy(340, 280, charmin);
outtextxy(373, 280, charsec);
outtextxy(215, 310, "结束时间:");
sprintf_s(charyear, "%d.", year2);
sprintf_s(charmonth, "%02d.", month2);
sprintf_s(charday, "%02d", day2);
sprintf_s(charhour, "%02d:", hour2);
sprintf_s(charmin, "%02d:", min2);
sprintf_s(charsec, "%02d", sec2);
outtextxy(307, 310, charyear);
outtextxy(355, 310, charmonth);
outtextxy(385, 310, charday);
outtextxy(307, 330, charhour);
outtextxy(340, 330, charmin);
outtextxy(373, 330, charsec);
settextstyle(16, 13, _T("Consolas"));
outtextxy(260, 364, "再来一局");
outtextxy(260, 401, "退出游戏");
break;
}
else
{
settextcolor(WHITE);
outtextxy(190, 630, " 请玩家落子~");
}
}
}//ai落子结束 开始下一个循环
if ((m.x >= 598 && m.x <= 681) && (m.y >= 241 && m.y <= 257) && !m.mkLButton)
{
setcolor(YELLOW); //黄色选择框
line(598, 241, 598, 246);
line(598, 241, 603, 241);
line(681, 257, 681, 252);
line(681, 257, 676, 257);
}
else if ((m.x >= 598 && m.x <= 681) && (m.y >= 241 && m.y <= 257) && m.mkLButton)
{
if (yinyue == 0)
{
mciSendString("open D:\\gobang\\1.mp3 alias jpmusic", NULL, 0, NULL);
mciSendString("play jpmusic", NULL, 0, NULL);
yinyue = 1;
setcolor(RED);
settextstyle(15, 10, _T("Consolas"));
outtextxy(599, 242, "关闭音乐");
}
else
{
mciSendString("close jpmusic", NULL, 0, NULL);
yinyue = 0;
setcolor(RED);
settextstyle(15, 10, _T("Consolas"));
outtextxy(599, 242, "开启音乐");
}
}
else
{
setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
line(598, 241, 598, 246);
line(598, 241, 603, 241);
line(681, 257, 681, 252);
line(681, 257, 676, 257);
}
if ((m.x >= 598 && m.y <= 681) && (m.y >= 290 && m.y <= 307) && !m.mkLButton)
{
setcolor(YELLOW); //黄色选择框
line(598, 290, 598, 294);
line(598, 290, 603, 290);
line(681, 307, 681, 302);
line(681, 307, 676, 307);
setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
}
else if ((m.x >= 598 && m.y <= 681) && (m.y >= 290 && m.y <= 307) && m.mkLButton)
{
mciSendString("close jpmusic", NULL, 0, NULL);
menu(); return;
}
else
{
setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
line(598, 290, 598, 294);
line(598, 290, 603, 290);
line(681, 307, 681, 302);
line(681, 307, 676, 307);
}
if ((m.x >= 598 && m.y <= 681) && (m.y >= 341 && m.y <= 358) && !m.mkLButton)
{
setcolor(YELLOW); //黄色选择框
line(598, 341, 598, 346);
line(598, 341, 603, 341);
line(681, 358, 681, 353);
line(681, 358, 676, 358);
setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
}
else if ((m.x >= 598 && m.y <= 681) && (m.y >= 341 && m.y <= 358) && m.mkLButton)
{
mciSendString("close jpmusic", NULL, 0, NULL);
game_out(); return;
}
else
{
setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
line(598, 341, 598, 346);
line(598, 341, 603, 341);
line(681, 358, 681, 353);
line(681, 358, 676, 358);
}
}
while (1)
{
m = GetMouseMsg();
if ((m.x >= 257 && m.x <= 368) && (m.y >= 360 && m.y <= 381) && !m.mkLButton)
{
setcolor(YELLOW);
line(257, 360, 257, 371); //对局清算 再来一局按钮 选择框左上
line(257, 360, 268, 360);
line(368, 381, 368, 370);
line(357, 381, 368, 381);
}
else if ((m.x >= 257 && m.x <= 368) && (m.y >= 360 && m.y <= 381) && m.mkLButton)
{
menu();
return;
}
else
{
setcolor(RED);
line(257, 360, 257, 371); //对局清算 再来一局按钮 选择框恢复
line(257, 360, 268, 360);
line(368, 381, 368, 370);
line(357, 381, 368, 381);
}
if ((m.x >= 258 && m.x <= 368) && (m.y >= 399 && m.y <= 418) && !m.mkLButton)
{
setcolor(YELLOW);
line(258, 399, 269, 399);// 对局清算 退出游戏 选择框
line(258, 399, 258, 410);
line(368, 418, 368, 407);
line(357, 418, 368, 418);
}
else if ((m.x >= 258 && m.x <= 368) && (m.y >= 399 && m.y <= 418) && m.mkLButton)
{
game_out();
return;
}
else
{
setcolor(RED);
line(258, 399, 269, 399);// 对局清算 退出游戏 选择框
line(258, 399, 258, 410);
line(368, 418, 368, 407);
line(357, 418, 368, 418);
}
if ((m.x >= 78 && m.x <= 586) && (m.y >= 630 && m.y <= 654) && !m.mkLButton)
{
setcolor(YELLOW);
line(78, 630, 89, 630);
line(78, 630, 78, 641);
line(586, 654, 586, 643);
line(586, 654, 575, 654);
}
else if ((m.x >= 78 && m.x <= 586) && (m.y >= 630 && m.y <= 654) && m.mkLButton)
{
game_help(); return;
}
else
{
setcolor(RED);
line(78, 630, 89, 630);
line(78, 630, 78, 641);
line(586, 654, 586, 643);
line(586, 654, 575, 654);
}
}
}
void go_game()
{
int yinyue = 0;
int a, b,f=1,c=0,d=0,a1,b1,k=0; //f标志黑白与用户 ,c,d分别复制a,b 响应选择框
int z1 = 0, z2 = 0;
char z3[100], z4[100];
draw();
memset(box, 0, sizeof(box));//初始化棋盘为0
//jishi();
int year1, year2, month1, month2, day1, day2,hour1,hour2,min1,min2,sec1,sec2;
char charyear[10], charmonth[10], charday[10], charhour[10], charmin[10], charsec[10];
time_t rawtime;
struct tm *getime;
time(&rawtime);
getime = localtime(&rawtime);
year1 = getime->tm_year + 1900;
month1 = getime->tm_mon + 1;
day1 = getime->tm_mday;
hour1 = getime->tm_hour;
min1 = getime->tm_hour;
sec1 = getime->tm_sec;
settextstyle(20, 15, _T("Consolas")); //落子计数
outtextxy(595, 40, "先后手");
settextstyle(15, 10, _T("Consolas"));
outtextxy(595, 73, "玩家A先-黑");
outtextxy(595, 95, "玩家B后-白"); //白子个数
settextstyle(20, 15, _T("Consolas")); //落子计数
outtextxy(595, 150, "落子数");
settextstyle(15, 10, _T("Consolas"));
sprintf_s(z3, "%d", z1);
outtextxy(595, 180, "玩家A:");
outtextxy(655, 180, z3);
outtextxy(595, 202, "玩家B:"); //白子个数
sprintf_s(z4, "%d", z2);
outtextxy(655, 202, z4);
outtextxy(590, 262, "-双人对战-");
outtextxy(599, 302, "开启音乐");
outtextxy(599, 352, "返回菜单");
outtextxy(599, 402, "退出游戏");
MOUSEMSG m,t; // 获取鼠标信息
while (true) //大循环 落子 鼠标相应 输赢判断
{
m = GetMouseMsg();
if ( (m.x >= 40 && m.x <= 580) && (m.y >= 40 && m.y <= 580)) //落子及鼠标相应
{
a = (m.x + 18) / 36; b = (m.y + 18) / 36; //行列坐标
a1 = a; b1 = b;
if (box[a][b]==0) //如果该位置没有子,则可选择
{
a = a * 36 + 4; b = b * 36 + 4; //精确到十字线
setcolor(YELLOW); //黄色选择框
line(a - 8, b - 8, a - 13, b - 8); //左上
line(a - 8, b - 8, a - 8, b - 13);
line(a + 8, b - 8, a + 13, b - 8); //右上
line(a + 8, b - 8, a + 8, b - 13);
line(a - 8, b + 8, a - 13, b + 8); //左下
line(a - 8, b + 8, a - 8, b + 13);
line(a + 8, b + 8, a + 13, b + 8); //右下
line(a + 8, b + 8, a + 8, b + 13);
setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
if ( (c != a || d != b) && (!k) )
{
line(c - 8, d - 8, c - 13, d - 8);//左上
line(c - 8, d - 8, c - 8, d - 13);
line(c + 8, d - 8, c + 13, d - 8); //右上
line(c + 8, d - 8, c + 8, d - 13);
line(c - 8, d + 8, c - 13, d + 8); //左下
line(c - 8, d + 8, c - 8, d + 13);
line(c + 8, d + 8, c + 13, d + 8);//右下
line(c + 8, d + 8, c + 8, d + 13);
}
c = a; d = b; //分别复制a,b 响应选择框
if (m.mkLButton)
{
if (f) //f=1 为黑
{
setlinecolor(BLACK); setfillcolor(BLACK); f = 0;
fillcircle(a, b, 16);
box[a1][b1] = 1;
z1++; sprintf_s(z3, "%d", z1);
settextstyle(15, 10, _T("Consolas"));
setcolor(BLACK); setfillcolor(BLACK);
outtextxy(655, 180, z3); //黑子个数
settextstyle(30, 22, _T("Consolas"));
setcolor(WHITE); setfillcolor(WHITE);
outtextxy(210, 630, "请玩家B落子");
}
else
{
setlinecolor(WHITE); setfillcolor(WHITE); f = 1;
fillcircle(a, b, 16);
box[a1][b1] = 2; // 白为2
z2++; sprintf_s(z4, "%d", z2);
setcolor(WHITE); setfillcolor(BLACK);
settextstyle(15, 10, _T("Consolas"));
outtextxy(655, 202, z4);
settextstyle(30, 22, _T("Consolas"));
setcolor(BLACK); setfillcolor(BLACK);
outtextxy(210, 630, "请玩家A落子");
}
k = 1;
}
else
k = 0;
}
}
if ((m.x >= 598 && m.x <= 681) && (m.y >= 00 && m.y <= 318) && !m.mkLButton) //开启关闭音乐
{
setcolor(YELLOW); //黄色选择框
line(598, 300, 598, 305);
line(598, 300, 603, 300);
line(681, 318, 681, 313);
line(681, 318, 676, 318);
setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
}
else if ((m.x >= 598 && m.x <= 681) && (m.y >= 00 && m.y <= 318) && m.mkLButton)
{
if (yinyue == 0)
{
mciSendString("open D:\\gobang\\1.mp3 alias jpmusic", NULL, 0, NULL);
mciSendString("play jpmusic", NULL, 0, NULL);
yinyue = 1;
setcolor(RED);
settextstyle(15, 10, _T("Consolas"));
outtextxy(599, 302, "关闭音乐");
setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
}
else
{
mciSendString("close jpmusic", NULL, 0, NULL);
yinyue = 0;
setcolor(RED);
settextstyle(15, 10, _T("Consolas"));
outtextxy(599, 302, "开启音乐");
setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
}
}
else
{
setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
line(598, 300, 598, 305);
line(598, 300, 603, 300);
line(681, 318, 681, 313);
line(681, 318, 676, 318);
}
if ((m.x >= 598 && m.x <= 681) && (m.y >= 351 && m.y <= 367) && !m.mkLButton) //返回菜单
{
setcolor(YELLOW); //黄色选择框
line(598, 351, 598, 356);
line(598, 351, 603, 351);
line(681, 367, 681, 362);
line(681, 367, 676, 367);
setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
}
else if ((m.x >= 598 && m.x <= 681) && (m.y >= 351 && m.y <= 367) && m.mkLButton)
{
if(yinyue==1)
mciSendString("close jpmusic", NULL, 0, NULL);
menu(); return;
}
else
{
setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
line(598, 351, 598, 356);
line(598, 351, 603, 351);
line(681, 367, 681, 362);
line(681, 367, 676, 367);
}
if ((m.x >= 598 && m.y <= 681) && (m.y >= 401 && m.y <= 417) && !m.mkLButton) //退出游戏
{
setcolor(YELLOW); //黄色选择框
line(598, 401, 598, 406);
line(598, 401, 603, 401);
line(681, 417, 681, 412);
line(681, 417, 676, 417);
setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
}
else if ((m.x >= 598 && m.y <= 681) && (m.y >= 401 && m.y <= 417) && m.mkLButton)
{
if (yinyue == 1)
mciSendString("close jpmusic", NULL, 0, NULL);
game_out(); return;
}
else
{
setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
line(598, 401, 598, 406);
line(598, 401, 603, 401);
line(681, 417, 681, 412);
line(681, 417, 676, 417);
}
if (k)
{
int r = 0;
srand((int)time(0));
int suiji = rand() % 5;
settextstyle(22, 18, _T("Consolas"));
setcolor(YELLOW);
r = judge(a1, b1,f); //传入落子坐标
if (r == 1 && f == 1)
{
setcolor(RGB(255, 205, 150));
setfillcolor(RGB(255, 205, 150));
fillrectangle(210, 630, 460, 670);
setcolor(YELLOW);
outtextxy(80, 630, "小口诀-->");
outtextxy(260, 630, geyan[suiji]); //用户B
break;
}
else if (r == 1 && f == 0)
{
setcolor(RGB(255, 205, 150));
setfillcolor(RGB(255, 205, 150));
fillrectangle(210, 630, 460, 670);
setcolor(YELLOW);
outtextxy(80, 630, "小口诀-->");
outtextxy(260, 630, geyan[suiji]); // 黑棋为用户A
break;
}
}
}
//一方胜利则对局(循环)结束
setcolor(YELLOW);
setbkcolor(RGB(255, 205, 150));
fillrectangle(184, 120, 436, 440);//绘制结算框
outtextxy(237, 125, "对局结束");
settextstyle(22, 18, _T("Consolas"));
if (f == 1)
outtextxy(243, 165, "玩家A胜");
else
outtextxy(243, 165, "玩家B胜");
setcolor(BLACK);
settextstyle(15, 10, _T("Consolas"));
outtextxy(238, 200, "★★★对局详情★★★");
time(&rawtime);
getime = localtime(&rawtime);
year2 = getime->tm_year + 1900;
month2 = getime->tm_mon + 1;
day2 = getime->tm_mday;
hour2 = getime->tm_hour;
min2 = getime->tm_hour;
sec2 = getime->tm_sec;
int dhour = 0, dmin = 0, dsec = 0,t1,t2;
t1 = hour1 * 3600 + min1 * 60 + sec1;
t2 = hour2 * 3600 + min2 * 60 + sec2;
t2 = t2 - t1;
dhour = t2 / 3600; dmin = (t2 - dhour * 3600) / 60; dsec = t2 - dhour * 3600 - dmin * 60;
sprintf_s(charhour, "%02d:", dhour);
sprintf_s(charmin, "%02d:", dmin);
sprintf_s(charsec, "%02d", dsec);
outtextxy(215, 230, "对局用时:");
outtextxy(307, 230, charhour);
outtextxy(340, 230, charmin);
outtextxy(373, 230, charsec);
outtextxy(215, 260, "开始时间:");
sprintf_s(charyear, "%d.", year1);
sprintf_s(charmonth, "%02d.", month1);
sprintf_s(charday, "%02d", day1);
sprintf_s(charhour, "%02d:", hour1);
sprintf_s(charmin, "%02d:", min1);
sprintf_s(charsec, "%02d", sec1);
outtextxy(307, 260, charyear);
outtextxy(355, 260, charmonth);
outtextxy(385, 260, charday);
outtextxy(307, 280, charhour);
outtextxy(340, 280, charmin);
outtextxy(373, 280, charsec);
outtextxy(215, 310, "结束时间:");
sprintf_s(charyear, "%d.", year2);
sprintf_s(charmonth, "%02d.", month2);
sprintf_s(charday, "%02d", day2);
sprintf_s(charhour, "%02d:", hour2);
sprintf_s(charmin, "%02d:", min2);
sprintf_s(charsec, "%02d", sec2);
outtextxy(307, 310, charyear);
outtextxy(355, 310, charmonth);
outtextxy(385, 310, charday);
outtextxy(307, 330, charhour);
outtextxy(340, 330, charmin);
outtextxy(373, 330, charsec);
settextstyle(16, 13, _T("Consolas"));
outtextxy(260, 364, "再来一局");
outtextxy(260, 401, "退出游戏");
while (1)
{
m = GetMouseMsg();
if ( (m.x >= 257 && m.x <= 368) && (m.y>=360 && m.y<=381) && !m.mkLButton)
{
setcolor(YELLOW);
line(257, 360, 257, 371); //对局清算 再来一局按钮 选择框左上
line(257, 360, 268, 360);
line(368, 381, 368, 370);
line(357, 381, 368, 381);
}
else if ((m.x >= 257 && m.x <= 368) && (m.y >= 360 && m.y <= 381) && m.mkLButton)
{
menu();
return;
}
else
{
setcolor(RED);
line(257, 360, 257, 371); //对局清算 再来一局按钮 选择框恢复
line(257, 360, 268, 360);
line(368, 381, 368, 370);
line(357, 381, 368, 381);
}
if ((m.x >= 258 && m.x <= 368) && (m.y >= 399 && m.y <= 418) && !m.mkLButton)
{
setcolor(YELLOW);
line(258, 399, 269, 399);// 对局清算 退出游戏 选择框
line(258, 399, 258, 410);
line(368, 418, 368, 407);
line(357, 418, 368, 418);
}
else if ((m.x >= 258 && m.x <= 368) && (m.y >= 399 && m.y <= 418) && m.mkLButton)
{
game_out();
return;
}
else
{
setcolor(RED);
line(258, 399, 269, 399);// 对局清算 退出游戏 选择框
line(258, 399, 258, 410);
line(368, 418, 368, 407);
line(357, 418, 368, 418);
}
if ((m.x >= 78 && m.x <= 586) && (m.y >= 630 && m.y <= 654) && !m.mkLButton)
{
setcolor(YELLOW);
line(78, 630, 89, 630);
line(78, 630, 78, 641);
line(586, 654, 586, 643);
line(586, 654, 575, 654);
}
else if ((m.x >= 78 && m.x <= 586) && (m.y >= 630 && m.y <= 654) && m.mkLButton)
{
game_help(); return;
}
else
{
setcolor(RED);
line(78, 630, 89, 630);
line(78, 630, 78, 641);
line(586, 654, 586, 643);
line(586, 654, 575, 654);
}
}
// 双人对战函数 结束
}
int judge(int x, int y,int f)
{
int i, j, s;
if (f) //f=1 说明落子为白子,接下来判box是否为2
f = 2;
else
f = 1;
for (i = x - 4, s = 0; i <= x + 4; i++) //横向判断
{
if (i > 16 || i < 0)
continue; //排除越界
if (box[i][y] == f)
s++;
else
s = 0;
if (s == 5)
return 1;
}
for (i = y - 4, s = 0; i <= y + 4; i++)
{
if (i > 16 || i < 0)
continue;
if (box[x][i] == f)
s++;
else
s = 0;
if (s == 5)
return 1;
}
for (i = x - 4, j = y + 4, s = 0; i <= x + 4 && j >= y - 4; i++, j--) //左下->右上判断
{
if (x < 0 || x>16 || j < 0 || j>16)
continue;
if (box[i][j] == f)
s++;
else
s = 0;
if (s == 5)
return 1;
}
for (i = x - 4, j = y - 4, s = 0; i <= x + 4 && j <= y + 4; i++, j++)
{
if (x < 0 || x>16 || j < 0 || j>16)
continue;
if (box[i][j] == f)
s++;
else
s = 0;
if (s == 5)
return 1;
}
}
void game_help()
{
setbkcolor(RGB(255, 205, 150)); //设置当前设备绘图背景色。
cleardevice(); //用当前背景色清空画布
//setbkcolor(RGB(143, 178, 201)); //设置当前设备绘图背景色。
cleardevice(); //用当前背景色清空画布
settextcolor(BLACK); //字体颜色
int f = 0;
MOUSEMSG m;
while (1)
{
m = GetMouseMsg();
if (f == 0)
{
rectangle(0, 0, 700, 700);
setcolor(BLACK);
settextstyle(30, 22, _T("Consolas"));
outtextxy(120, 30, " *****游戏帮助***** ");
settextstyle(28, 20, _T("Consolas"));
outtextxy(270, 110, "人机对战");
outtextxy(270, 330, "双人对战");
settextstyle(22, 15, _T("Consolas"));
outtextxy(160, 160, "由玩家执黑子先行,电脑执白子");
outtextxy(160, 220, "双方先完成五子连续者获胜^_^");
setcolor(BLUE);
outtextxy(5, 270, " -------------------------------------------- ");
setcolor(BLACK);
settextstyle(22, 15, _T("Consolas"));
outtextxy(160, 380, "玩家A执黑子先行,玩家B执白子");
outtextxy(160, 440, "双方先完成五子连续者获胜^_^");
outtextxy(210, 550, "小口诀 返回");
if ((m.x >= 212 && m.x <= 302) && (m.y >= 550 && m.y <= 572) && !m.mkLButton)
{
setcolor(YELLOW);
line(212, 550, 212, 555);
line(212, 550, 217, 550);
line(302, 572, 302, 567);
line(302, 572, 297, 572);
setcolor(RGB(255, 205, 150));
}
else if ((m.x >= 212 && m.x <= 302) && (m.y >= 550 && m.y <= 572) && m.mkLButton)
{
f = 1;
setfillcolor(RGB(255, 205, 150));
fillrectangle(0, 0, 700, 700);
}
else
{
setcolor(RGB(255, 205, 150));
line(212, 550, 212, 555);
line(212, 550, 217, 550);
line(302, 572, 302, 567);
line(302, 572, 297, 572);
}
if ((m.x >= 433 && m.x <= 497) && (m.y >= 550 && m.y <= 571) && !m.mkLButton)
{
setcolor(YELLOW);
line(433, 550, 433, 555);
line(433, 550, 438, 550);
line(497, 571, 497, 566);
line(497, 571, 492, 571);
setcolor(RGB(255, 205, 150));
}
else if ((m.x >= 433 && m.x <= 497) && (m.y >= 550 && m.y <= 571) && m.mkLButton)
{
menu(); return;
}
else
{
setcolor(RGB(255, 205, 150));
line(433, 550, 433, 555);
line(433, 550, 438, 550);
line(497, 571, 497, 566);
line(497, 571, 492, 571);
}
}
else
{
setcolor(BLACK);
settextstyle(30, 22, _T("Consolas"));
outtextxy(120, 30, " *****游戏帮助***** ");
settextstyle(28, 20, _T("Consolas"));
outtextxy(230, 110, "五子棋小口诀");
settextstyle(22, 15, _T("Consolas"));
outtextxy(70, 170, "先手要攻,后手要守,以攻为守,以守待攻");
outtextxy(70, 230, "初盘争二,终局抢三,留三不冲,变化万千");
outtextxy(70, 290, "多个先手,细算次先,五子要点,次序在前");
outtextxy(70, 350, "斜线为阴,直线为阳,阴阳结合,防不胜防");
outtextxy(70, 410, "连三连四,易见为明,跳三跳四,暗剑深藏");
outtextxy(290, 480, "更多教程");
outtextxy(168, 550, "玩法简介 回到菜单");
if ((m.x >= 288 && m.x <= 412) && (m.y >= 477 && m.y <= 501) && !m.mkLButton)
{
setcolor(YELLOW);
line(288, 477, 288, 482);
line(288, 477, 293, 477);
line(412, 501, 412, 496);
line(412, 501, 407, 501);
setcolor(RGB(255, 205, 150));
}
else if ((m.x >= 288 && m.x <= 412) && (m.y >= 477 && m.y <= 501) && m.mkLButton)
{
system("start https://www.bilibili.com/video/BV1Qt411n7Y4?from=search&seid=17013933518128012201");
}
else
{
setcolor(RGB(255, 205, 150));
line(288, 477, 288, 482);
line(288, 477, 293, 477);
line(412, 501, 412, 496);
line(412, 501, 407, 501);
}
if ((m.x >= 167 && m.x <= 285) && (m.y >= 547 && m.y <= 571) && !m.mkLButton)
{
setcolor(YELLOW);
line(167, 547, 167, 552);
line(167, 547, 172, 547);
line(285, 571, 285, 566);
line(285, 571, 280, 571);
setcolor(RGB(255, 205, 150));
}
else if ((m.x >= 167 && m.x <= 285) && (m.y >= 547 && m.y <= 571) && m.mkLButton)
{
f = 0;
setfillcolor(RGB(255, 205, 150));
fillrectangle(0, 0, 700, 700);
}
else
{
setcolor(RGB(255, 205, 150));
line(167, 547, 167, 552);
line(167, 547, 172, 547);
line(285, 571, 285, 566);
line(285, 571, 280, 571);
}
if ((m.x >= 423 && m.x <= 543) && (m.y >= 548 && m.y <= 569) && !m.mkLButton)
{
setcolor(YELLOW);
line(423, 548, 423, 553);
line(423, 548, 428, 548);
line(543, 569, 543, 564);
line(543, 569, 538, 569);
setcolor(RGB(255, 205, 150));
}
else if ((m.x >= 423 && m.x <= 543) && (m.y >= 548 && m.y <= 569) && m.mkLButton)
{
menu(); return;
}
else
{
setcolor(RGB(255, 205, 150));
line(423, 548, 423, 553);
line(423, 548, 428, 548);
line(543, 569, 543, 564);
line(543, 569, 538, 569);
}
}
}
}
void game_about()
{
IMAGE img_gitee,img_sd;
loadimage(&img_gitee, "D:\\gobang\\gitee_70_21.png");
loadimage(&img_sd, "D:\\gobang\\sd_30_24.png");
setbkcolor(RGB(255, 205, 150)); //设置当前设备绘图背景色。
cleardevice(); //用当前背景色清空画布
settextcolor(BLACK); //字体颜色
settextstyle(30, 22, _T("Consolas")); //字体高宽比(像素) 30/22 最佳
outtextxy(150, 50, "*****关于我们*****");
settextstyle(25, 14, _T("Consolas"));
outtextxy(110, 130, "一个简单的五子棋小程序......");
outtextxy(110, 170, "本程序使用基于c++的easyx图形库编写!");
outtextxy(110, 210, "所有源码已上传至");
putimage(340, 210, &img_gitee);
outtextxy(110, 250, "期待你的到来 点击进入......");
outtextxy(310, 540, "返回");
setcolor(BLUE);
settextstyle(25, 14, _T("Consolas"));
outtextxy(110, 290, "https://gitee.com/siwenzhi/gobang");
outtextxy(90, 340, " ---------------作者---------------- ");
settextcolor(BLACK);
outtextxy(90, 390, " 司三三 郑四四 赵五五 张六六");
putimage(105, 440, &img_sd);
outtextxy(140, 440, "郑州学前班幼儿园大学 信息工程学院");
MOUSEMSG m; // 获取鼠标信息
while (true)
{
m = GetMouseMsg();
if ((m.x >= 107 && m.x <= 577) && (m.y >= 290 && m.y <= 318) && !m.mkLButton)
{
setcolor(YELLOW);
line(107, 290, 107, 300); //左上
line(107, 290, 117, 290);
line(577, 318, 577, 308); //右下
line(577, 318, 567, 318);
}
else if ((m.x >= 107 && m.x <= 577) && (m.y >= 290 && m.y <= 318) && m.mkLButton)
{
system("start https://gitee.com/siwenzhi/gobang");
}
else
{
setcolor(RGB(255, 205, 150));
line(107, 290, 107, 300); //左上
line(107, 290, 117, 290);
line(577, 318, 577, 308); //右下
line(577, 318, 567, 318);
}
if ((m.x >= 310 && m.x <= 366) && (m.y >= 541 && m.y <= 564) && !m.mkLButton)
{
setcolor(YELLOW);
line(310, 541, 310, 546); //左上
line(310, 541, 315, 541);
line(366, 564, 366, 559);
line(366, 564, 361, 564);
}
else if ((m.x >= 310 && m.x <= 366) && (m.y >= 541 && m.y <= 564) && m.mkLButton)
{
setcolor(RGB(255, 205, 150));
menu(); return;
}
else
{
setcolor(BLUE);
line(310, 541, 310, 546); //左上
line(310, 541, 315, 541);
line(366, 564, 366, 559);
line(366, 564, 361, 564);
}
}
}
void game_out()
{
setbkcolor(RGB(255, 205, 150)); //设置当前设备绘图背景色。
cleardevice(); //用当前背景色清空画布
settextcolor(BLACK); //字体颜色
settextstyle(30, 22, _T("Consolas")); //字体高宽比(像素) 30/22 最佳
outtextxy(150, 80, "*****退出游戏*****");
settextstyle(25, 14, _T("Consolas"));
outtextxy(260, 140, "你不爱我了嘛");
IMAGE img_out;
loadimage(&img_out, "D:\\gobang\\out.jpg");
putimage(140, 220, &img_out);
outtextxy(230, 500, "再来一局 退出");
yiyan();
MOUSEMSG m; // 获取鼠标信息
while (true)
{
m = GetMouseMsg();
if ((m.x >= 129 && m.x <= 592) && (m.y >= 210 && m.y <= 461) && !m.mkLButton)
{
setcolor(YELLOW); //图片
line(129, 210, 129, 235); //左上
line(129, 210, 154, 210);
line(592, 461, 592, 436); //右下
line(592, 461, 567, 461);
}
else if ((m.x >= 129 && m.x <= 592) && (m.y >= 210 && m.y <= 461) && m.mkLButton)
{
system("start https://gitee.com/siwenzhi/gobang");
//暂时做跳转码云,后续可以改成多个图片轮换
}
else
{
setcolor(RED);
line(129, 210, 129, 235); //左上
line(129, 210, 154, 210);
line(592, 461, 592, 436); //右下
line(592, 461, 567, 461);
}
if ((m.x >= 225 && m.x <= 348) && (m.y >= 495 && m.y <= 528) && !m.mkLButton)
{
setcolor(YELLOW); //再来一局
line(225, 495, 225, 510); //左上
line(225, 495, 240, 495);
line(348, 528, 348, 513); //右下
line(348, 528, 333, 528);
}
else if ((m.x >= 225 && m.x <= 348) && (m.y >= 495 && m.y <= 528) && m.mkLButton)
{
menu(); break; //暂定跳转到主菜单
}
else
{
setcolor(RED);
line(225, 495, 225, 510); //左上
line(225, 495, 240, 495);
line(348, 528, 348, 513); //右下
line(348, 528, 333, 528);
}
if ((m.x >= 407 && m.x <= 459) && (m.y >= 497 && m.y <= 528) && !m.mkLButton)
{
setcolor(YELLOW); //退出
line(407, 497, 407, 512); //左上
line(407, 497, 422, 497);
line(474, 528, 474, 513); //右下
line(459, 528, 474, 528);
}
else if ((m.x >= 407 && m.x <= 459) && (m.y >= 497 && m.y <= 528) && m.mkLButton)
{
closegraph();
return;
}
else
{
setcolor(RED);
line(407, 497, 407, 512); //左上
line(407, 497, 422, 497);
line(474, 528, 474, 513); //右下
line(459, 528, 474, 528);
}
if ((m.x >= 100 && m.x <= 642) && (m.y >= 599 && m.y <= 622) && m.mkLButton)
{
yiyan();
}
}
}
void draw()
{
int i;
setbkcolor(RGB(255, 205, 150)); //设置当前设备绘图背景色。 原棕色
cleardevice(); //用当前背景色清空画布
setcolor(RED);
settextstyle(20, 14, _T("Consolas"));
for (i = 40; i <= 580; )
{
line(40, i, 580, i); //竖线
line(i, 40, i, 580); //横线
i += 36;
}
settextstyle(19, 13, _T("Consolas"));
char a[10]; int b=1;
for (i = 35; i <=323; i+=36)
{
sprintf_s(a, "%d", b);
outtextxy(i, 11, a);
b++;
} //使用循环存在部分数字不能正对网格线,不够美观
settextstyle(18, 10, _T("Consolas"));
outtextxy(352, 12, "10");
outtextxy(389, 12, "11");
outtextxy(425, 12, "12");
outtextxy(462, 12, "13");
outtextxy(495, 12, "14");
outtextxy(530, 12, "15");
outtextxy(563, 12, "16");
//竖向字母坐标
settextstyle(19, 13, _T("Consolas"));
outtextxy(12, 33, "A");
outtextxy(12, 70, "B");
outtextxy(12,102, "C");
outtextxy(12, 138, "D");
outtextxy(12, 174, "E");
outtextxy(12, 210, "F");
outtextxy(12, 241, "G");
outtextxy(12, 278, "H");
outtextxy(12, 318, "I");
outtextxy(12, 355, "J");
outtextxy(12, 390, "K");
outtextxy(12, 425, "L");
outtextxy(12, 458, "M");
outtextxy(12, 495, "N");
outtextxy(12, 530, "O");
outtextxy(12, 565, "P");
}
void yiyan()
{
char yanyan[][500] = { {"绿树阴浓夏日长,楼台倒影入池塘"},{"荷叶罗裙一色裁,芙蓉向脸两边开"},{" 悠悠洛阳道,此会在何年"},{" 湖上西风斜日,荷花落尽红英 "},{"白日放歌须纵酒,青春作伴好还乡"},
{" 镜湖三百里,菡萏发荷花 "},{"接天莲叶无穷碧,映日荷花别样红"},{" 端午临中夏,时清日复长 "},{" 万壑树参天,千山响杜鹃 "},{" 清晨入古寺,初日照高林 "},
{"朱门几处看歌舞,犹恐春阴咽管弦"},{" 竹色溪下绿,荷花镜里香 "},{"飞花两岸照船红,百里榆堤半日风"},{" 波面澄霞,兰艇采香去 "},{" 阳春布德泽,万物生光辉 "},
{" 荷风送香气,竹露滴清响 "},{"清江一曲抱村流,长夏江村事事幽"},{" 荷花开后西湖好,载酒来时 "},{"若耶溪傍采莲女,笑隔荷花共人语"},{" 春游芳草地,夏赏绿荷池 "} };
//20个
settextcolor(BLACK); //字体颜色
settextstyle(22, 18, _T("Consolas")); //字体高宽比(像素) 30/22 最佳
srand((int)time(0));
int yansui = rand() % 20;
//outtextxy(100, 600, yanyan[0]);
//outtextxy(100, 600, yanyan[2]);
outtextxy(100, 600, yanyan[yansui]);
settextcolor(BLACK); //字体颜色
settextstyle(30, 22, _T("Consolas")); //字体高宽比(像素) 30/22 最佳
}
void mousetest()
{
MOUSEMSG m; // 获取鼠标信息
char a[10], b[10];
while (true)
{
m = GetMouseMsg();
if (m.mkLButton)
{
sprintf_s(a, "%d", m.x);
sprintf_s(b, "%d", m.y);
outtextxy(500, 500, a);
outtextxy(500, 600, b);
}
}
}