五子棋小游戏

时间:2025-04-09 21:03:18
  • #define _CRT_SECURE_NO_WARNINGS
  • #include<>
  • #include<>//多媒体设备的头文件
  • #pragma comment(lib,"")//播放音乐库文件
  • #include<>
  • #include<>
  • #include<>
  • #include<>
  • #include<>
  • int judge(int a, int b);
  • int flag = 0;//黑白棋交替
  • int board[21][21] = { 0 };//0表示无棋子状态 告诉计算机有无棋子
  • void initGame()//初始化游戏
  • {
  • //绘图环境
  • initgraph(600, 550);//宽度 高度
  • //setbkcolor(LIGHTCYAN);//油漆准备好了
  • //cleardevice();//刷油漆
  • //贴图
  • loadimage(NULL, L"");
  • //背景音乐 多媒体控制接口
  • mciSendString(L"open 望江南.mp3", 0, 0, 0);
  • mciSendString(L"play 望江南.mp3", 0, 0, 0);
  • setlinecolor(BLACK);
  • //绘制棋盘
  • //画线 20×20的棋盘
  • for (int i = 25; i <=500; i+=25)
  • {
  • line(i, 0, i, 500);
  • line(0, i, 500, i);
  • }
  • line(501, 0, 501, 500);//实现加粗效果
  • outtextxy(510, 100, L"玩家1:黑棋");
  • outtextxy(510, 200, L"玩家2:白棋");
  • }
  • //下棋
  • void playChess()
  • {
  • //鼠标下棋
  • MOUSEMSG m;//保存鼠标信息
  • int x=0, y=0;
  • int a=0, b=0;
  • HWND hwnd = GetHWnd();
  • while (1)
  • {
  • m = GetMouseMsg();
  • for (int i = 0; i <= 20; i++)
  • {
  • for (int j = 0; j <= 20; j++)
  • {
  • if (abs( - j * 25) < 12.5 && abs( - i* 25)<12.5)
  • {
  • //i理解为行 j理解为列
  • //if语句中把i换成j,j换成i也可以,因为i,j是0-20循环
  • //无非就是先外循环找到合适i,再内循环找到合适j
  • //或者先内循环找到合适j,再外循环找到合适i
  • x = j * 25; //棋盘左上角为(00)横轴x竖轴y
  • y = i * 25;
  • a = i;
  • b = j;
  • //a=j b=i也可以但不知道为什么?
  • }
  • }
  • }
  • //鼠标左键按下
  • if ( == WM_LBUTTONDOWN)
  • {
  • //出现重叠问题
  • if (board[a][b] != 0)
  • {
  • MessageBox(hwnd, L"这里已经有棋子,重新选择", L"提示", MB_OK);
  • continue;//退出本次循环重新进入
  • }
  • if (flag % 2 == 0)
  • {
  • setfillcolor(BLACK);
  • solidcircle(x, y, 10);//坐标、棋子半径
  • board[a][b] = 1;//1表示下黑棋
  • }
  • else//奇数
  • {
  • setfillcolor(WHITE);
  • solidcircle(x, y, 10);
  • board[a][b] = 2;
  • }
  • flag = 1 - flag;//flag在01切换
  • //solidcircle(/25*25,/25*25,10);//这样写下棋的体验感不强
  • }
  • if (judge(a, b))
  • {
  • if (flag % 2 == 0)
  • {
  • MessageBox(hwnd, L"玩家2胜利", L"游戏结束", MB_OK);
  • return;//程序结束
  • }
  • else
  • {
  • MessageBox(hwnd, L"玩家1胜利", L"游戏结束", MB_OK);
  • return;
  • }
  • }
  • }
  • }
  • //判断输赢
  • int judge(int a, int b)
  • {
  • int i, j;
  • int t = 2 - flag % 2;//1 2
  • //a=10,b=12 纵向 从上到下
  • for (i = a - 4, j = b; i <= a; i++)//b为列 a为行 固定j不变 i变化 看纵向
  • {
  • if (i >= 0 && i <= 16 && t == board[i][j] &&
  • t == board[i + 1][j] && t == board[i + 2][j] &&
  • t == board[i + 3][j] && t == board[i + 4][j])
  • //i第一个棋子 第五个棋子i+4<20 所以i<16
  • {
  • return 1;
  • }
  • }
  • //纵向 从下到上
  • for (i =a+4, j = b; i >= a; i--)//b为列 a为行 固定j不变 i变化 看纵向
  • {
  • if (i <=20 && t == board[i][j] && t == board[i - 1][j] && t == board[i - 2][j] && t == board[i - 3][j] && t == board[i - 4][j])
  • //i第一个棋子 第五个棋子i+4<20 所以i<16
  • {
  • return 1;
  • }
  • }
  • //有些写的冗余 遍历时不管从哪下棋 从哪个方向遍历
  • //a=10,b=12 横向 从左到右判断
  • for (i = a, j = b-4; j <= b; j++)//b为列 a为行 固定i不变 j变化 看横向
  • {
  • if (j >= 0 && j < 16 && t == board[i][j] && t == board[i][j + 1] && t == board[i][j + 2] && t == board[i][j + 3] && t == board[i][j + 4])
  • //j第一个棋子 第五个棋子j+4<20 所以j<16
  • {
  • return 1;
  • }
  • }
  • //a=10,b=12 横向 从右到左判断
  • //for (i = a, j = b + 4; j >= b; j--)//b为列 a为行 固定i不变 j变化 看横向
  • //{
  • // if (j <=20 && t == board[i][j] && t == board[i][j - 1] && t == board[i][j - 2] && t == board[i][j - 3] && t == board[i][j - 4])
  • // //j第一个棋子 第五个棋子j+4<20 所以j<16
  • // {
  • // return 1;
  • // }
  • //}
  • //a=10,b=12 斜向 右下斜 从左到右
  • for (i = a-4, j = b - 4; i<= a,j <= b; i++,j++)
  • {
  • if (i >= 0 && i <=16 &&j >= 0 && j <= 16 && t == board[i][j] &&
  • t == board[i+1][j + 1] && t == board[i + 2][j + 2] &&
  • t == board[i + 3][j + 3] && t == board[i + 4][j + 4])
  • //i第一个棋子 第五个棋子i+4<20 所以i<16
  • {
  • return 1;
  • }
  • }
  • // //a=10,b=12 斜向 左上斜 从右到左
  • //for (i = a + 4, j = b + 4; i >= a, j >= b; i--, j--)
  • //{
  • // if (i <= 20 && j <=20 && j <= 16 && t == board[i][j] && t == board[i - 1][j - 1] && t == board[i - 2][j - 2] && t == board[i - 3][j - 3] && t == board[i - 4][j - 4])
  • // //i第一个棋子 第五个棋子i+4<20 所以i<16
  • // {
  • // return 1;
  • // }
  • //}
  • //
  • //a=10,b=12 左下斜 从右到左
  • for (i = a - 4, j = b + 4; i <= a, j >= b; i++, j--)
  • {
  • if (i >=0 && i<=16 && j <=20 && t == board[i][j] &&
  • t == board[i + 1][j - 1] && t == board[i + 2][j - 2] &&
  • t == board[i + 3][j - 3] && t == board[i + 4][j - 4])
  • {
  • return 1;
  • }
  • }
  • /*
  • 左下斜和右上斜是一致的 右上斜和左下斜是一致的
  • */
  • //a=10,b=12 右上斜 从左到右
  • //for (i = a + 4, j = b - 4; i >= a, j <= b; i--, j++)
  • //{
  • // if (i <= 20 && j >= 0 && j <= 16 && t == board[i][j] && t == board[i - 1][j + 1] && t == board[i - 2][j + 2] && t == board[i - 3][j + 3] && t == board[i - 4][j + 4])
  • // //i第一个棋子 第五个棋子i+4<20 所以i<16
  • // {
  • // return 1;
  • // }
  • //}
  • return 0;
  • }
  • //int judge(int a, int b)
  • //{
  • // int i, j;
  • // int t = 2 - flag % 2;
  • // for (i = a - 4, j = b; i <= a; i++)
  • // {
  • // if (i >= 1 && i < 16 && t == board[i][j] && t == board[i + 1][j] && t == board[i + 2][j]
  • // && t == board[i + 3][j] && t == board[i + 4][j])
  • // return 1;
  • // }
  • // for (i = a, j = b - 4; j <= b; j++)
  • // {
  • // if (j >= 1 && j < 16 && t == board[i][j] && t == board[i][j + 1]
  • // && t == board[i][j + 2] && t == board[i][j + 3] && t == board[i][j + 4])
  • // return 1;
  • // }
  • // for (i = a - 4, j = b - 4; i <= a, j <= b; i++, j++)
  • // {
  • // if (i >= 1 && i < 16 && j >= 1 && j < 16 && t == board[i][j] && t == board[i + 1][j + 1] &&
  • // t == board[i + 2][j + 2] && t == board[i + 3][j + 3] && t == board[i + 4][j + 4])
  • // return 1;
  • // }
  • // for (i = a - 4, j = b + 4; i <= a, j >= b; i++, j--)
  • // {
  • // if (i >= 1 && i < 16 && j >= 1 && j < 16 && t == board[i][j] && t == board[i + 1][j - 1] &&
  • // t == board[i + 2][j - 2] && t == board[i + 3][j - 3] && t == board[i + 4][j - 4])
  • // return 1;
  • // }
  • // return 0;
  • //
  • //}
  • int main()
  • {
  • initGame();
  • playChess();
  • closegraph();
  • return 0;
  • }