五子棋小游戏

实现效果如下:

具体代码如下

#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博客

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值