《程序设计与算法综合训练》课程设计(4人团队合作作品)
//程序名:源.cpp
//功能:五子棋游戏人人对战
#include <stdio.h>//定义输入输出函数
#include<graphics.h>//图形库的头文件
#include<math.h>//说明要用常用的一些数学运算
#include<windows.h>//添加背景音乐的前提
#include<mmsystem.h>//添加背景音乐
#pragma comment(lib,"winmm.lib")//添加背景音乐
void initgame();//定义游戏界面的函数
void playchess();//定义五子棋游戏的函数
int judgeWin(int a, int b);//定义游戏胜负判断规则
#define N 20 //把棋盘抽象为二维数组
int board[N][N] = { 0 };
int whoseturn = 0;//两个人轮流落子
HWND hWnd;
int main()
{
//黑窗口//借用操作系统的dos窗口 //创建一个自己的窗口
initgame();
playchess();
getchar();//防闪退
return 0;
}
//初始化游戏界面
void initgame()
{
initgraph(650,600);//创建一个自己的窗口宽650,高600
PlaySound(TEXT("F:\\五子棋\\2.wav"), NULL, SND_FILENAME|SND_ASYNC);
//加载背景音乐
loadimage(NULL, _T("D:\\1.jpg"));//加载图片
for(int i = 1;i < 20; i++)
{
setlinecolor(BLACK);//设置线条颜色为黑色
line(i * 25, 0, i * 25, 500);//添加线条(初始点横纵坐标,结束点横纵坐标)
line(0, i * 25, 500, i * 25);
}
setlinestyle(PS_SOLID, 2);//设置线条样式加粗
line(500, 0, 500, 500);
outtextxy( 510, 50, L"黑棋:玩家一");//输出文字(横纵坐标,文字内容)
outtextxy( 510, 80, L"白棋:玩家二");
}
void playchess()
{
int i, j;
int a = 0, b = 0;
int x=0 , y=0 ;
MOUSEMSG m;//定义鼠标类型,结构体,取名为m
hWnd=GetHWnd();//获取窗口的handle(索引)即位置
while(1)
{
m= GetMouseMsg();//获取鼠标消息
for (i = 1;i < 20; i++)
{
for(j = 1; j <20; j++)
{
if(abs(i * 25 - m.x) < 12.5&&abs(j *25 - m.y)<12.5)//绝对值 abs()
{
x = i * 25;//把数组下标转换成坐标
y = j * 25;
a = i;
b = j;
}
}
}
if (m.uMsg == WM_LBUTTONDOWN)//确定是鼠标左键获取的信息
{
if(board[a][b] != 0)//有棋子
{
MessageBox(hWnd, L"这里已经有棋子了", L"请重新选择落棋点", MB_OK);//判断鼠标选择的点是否有棋子
continue;
}
if(whoseturn % 2 == 0)//判断轮到谁的回合
{
outtextxy(505, 200, L"请玩家二落子”);
setfillcolor(BLACK);//落子颜色为黑色
solidcircle(x, y, 10);//以(x,y)为圆心画一个半径为10的圆
board[a][b] = 1;//该落子点为玩家1
}
else
{
outtextxy(505, 200, L"请玩家一落子”);
setfillcolor(WHITE);//落子颜色为白色
solidcircle(x, y, 10);//以(x,y)为圆心画一个半径为10的圆
board[a][b] = 2;//该落子点为玩家2
}
whoseturn++;
}
if (judgeWin(a, b))
{
if (whoseturn % 2 == 1)
{
MessageBox(hWnd, L"玩家一胜利", L"游戏结束", MB_OK);
exit(0);//退出程序
}
else
{
MessageBox(hWnd, L"玩家二胜利", L"游戏结束", MB_OK);
exit(0);//退出程序
}
}
}
}
//判断输赢
int judgeWin(int a, int b)
{
int i, j;
int t = 2 - whoseturn % 2;//判断是哪个玩家
for(i = a - 4 , j =b; i <= a; i++)
{
if(i >= 1 && i <= 15 && 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 <= 15 && 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 ; j <= b, i <= a ; j++ , i++)
{
if(i >= 1 && i <= 15 && j >= 1 && j <= 15 && 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 >= 1 ; j--, i++)
{
if(i >= 1 && i <= 15 && j >= 1 && j <= 15 && 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;
}