实现效果如下:
具体代码如下
#define _CRT_SECURE_NO_WARNINGS
#include<graphics.h>
#include<mmsystem.h>//多媒体设备的头文件
#pragma comment(lib,"winmm.lib")//播放音乐库文件
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<tchar.h>
#include<math.h>
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"background.jpg");
//背景音乐 多媒体控制接口
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(m.x - j * 25) < 12.5 && abs(m.y - i* 25)<12.5)
{
//i理解为行 j理解为列
//if语句中把i换成j,j换成i也可以,因为i,j是0-20循环
//无非就是先外循环找到合适i,再内循环找到合适j
//或者先内循环找到合适j,再外循环找到合适i
x = j * 25; //棋盘左上角为(0,0)横轴x竖轴y
y = i * 25;
a = i;
b = j;
//a=j b=i也可以但不知道为什么?
}
}
}
//鼠标左键按下
if (m.uMsg == 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在0,1切换
//solidcircle(m.x/25*25,m.y/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;
}
音乐没有正常播放,不知道为什么,可能是音乐的格式不对。还有遇到了字符集编码的问题,通过查看其他人博客解决了,具体博客网址如下:没有与参数列表匹配的重载函数outtextxy实例 vs2013error c2665 MBCS编码和Unicode编码-CSDN博客