基于c语言编写的五子棋小游戏

《程序设计与算法综合训练》课程设计(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;
}
posted @ 2021-06-01 00:27  鲁自清  阅读(36)  评论(0)    收藏  举报  来源