C++五子棋游戏

五子棋游戏C++源代码

#include <graphics.h>
#include <mmsystem.h>  //播放音乐头文件
#include <Windows.h>
#include <cmath>
#include <memory.h>
#pragma comment (lib,"winmm.lib")

int flag = 0;  //表示下次次数
int board[20][20] = {0};
int judge(int a, int b);
//游戏首页
void gamefirst()
{
	MOUSEMSG m;
	int i=1;
	initgraph(600, 500);
	loadimage(NULL, L"3.jpg");  //贴图
	mciSendString(TEXT("open 2.mp3 alias mysong"), NULL, 0, NULL);
	mciSendString(TEXT("play MySong"), NULL, 0, NULL);
	while (i)
	{
		m = GetMouseMsg();
		if (m.uMsg == WM_LBUTTONDOWN)
		{
			i = 0;
		}
	}


}

void initgame()
{
	memset(board, 0, 20 * 20 * sizeof(int));
	//绘制棋盘20x20
	initgraph(600, 500);
	loadimage(NULL, L"1.jpg");  //贴图
	mciSendString(TEXT("open 2.mp3 alias mysong"), NULL, 0, NULL);
	mciSendString(TEXT("play MySong"), NULL, 0, NULL);
	setlinecolor(BLACK);
	for (int i = 25; i < 500; i = i + 25)
	{

		line(i, 0, i, 500);
		line(0, i, 500, i);
	}
	line(500, 0, 500, 500);

	outtextxy(510, 100, L"玩家1:黑棋");
	outtextxy(510, 150, L"玩家2:白棋");
}

void playgame()
{
	//鼠标消息
	MOUSEMSG m;
	int x=0, y=0;
	int a=0, b=0;
	HWND hwnd = GetHWnd();

	while (1)
	{
		m = GetMouseMsg();
		
		//让棋在线的交叉点上
		for (int i = 1; i < 20; i++)
		{
			for (int j = 1; j < 20; j++)
			{
				if (abs(m.x - i * 25) < 12 && abs(m.y - j * 25)<12)
				{
					 x = i * 25;
					 y = j * 25;
					 a = i;
					 b = j;
                }
			}
		}
		
		if (m.uMsg == WM_LBUTTONDOWN)
		{
			//解决冲突
			if (board[a][b] != 0)
			{
				MessageBox(NULL,L"这里已经有棋子了请重新选择",L"提示", MB_OK);
				continue; //退出循环
			}
			//黑白交替进行
			if (flag % 2 == 0)
			{
				outtextxy(510, 250, L"请白棋落子");
				setfillcolor(BLACK);
				solidcircle(x, y, 10);
				board[a][b] = 1;
			}
			else
			{
				outtextxy(510, 250, L"请黑棋落子");
				setfillcolor(WHITE);
				solidcircle(x, y, 10);
				board[a][b] = 2;
			}
			flag++;
		}

		if (judge(a, b)==1)
		{
			if (flag % 2 == 0)
			{
				MessageBox(hwnd, L"白棋获胜", L"游戏结束", MB_OK);
				break;
			}
			else
			{
				MessageBox(hwnd, L"黑棋获胜", L"游戏结束", MB_OK);
				break;
			}
		}
	}
}

//判断输赢
int judge(int a, int b)
{
	int i = 0, j=0;
	int t = 2 - flag % 2;  
	for (i = a - 4, j = b; i <= a; 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])
			return 1;
	}

	for (i = a, j = b-4; j <= b; 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])
			return 1;
	}

	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])
			return 1;
	}

	for (i = a - 4, j = b + 4; i<=a, j >= 1; 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])
			return 1;
	}
	return 0;
}

int main()
{
	int i = 1;
	while (i)
	{
		gamefirst();
		initgame();
		playgame();
		int ret = MessageBox(NULL, L"是否重新开始游戏", L"游戏结束", MB_YESNO);
		if (ret == IDNO)i = 0;

	}
	

	return 0;
}

这个代码还需要两张照片和一个音乐作为外部资源才会有效果
需要的可以给我留言。谢谢大家的支持!

c++编写的五子棋游戏 // Five.cpp: implementation of the CFive class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "gobang.h" #include "Five.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif BOOL debugqian = false; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CFive::CFive() { } CFive::~CFive() { } BOOL CFive::has_five(int color) { //color = 1表示黑子,color = 2表示白子 //判断是否出现了5个子想连的情况 int m,n,i,j; for(m=1;m<16;m++) for(n=1;n<16;n++) { if(points[m][n]==color) { int p=1,s=1,zx=1,yx=1; for( i=1;i<5;i++) {if(n-i>=0&&points[m][n-i]==color) p++; else break; } for( i=1;i<5;i++) { if(n+i<16&&points[m][n+i]==color) p++; else break; } for( i=1;i<5;i++) { if(m-i>=0&&points[m-i][n]==color) s++; else break; } for( i=1;i<5;i++) { if(m+i<16&&points[m+i][n]==color) s++; else break; } for( i=1;i<5;i++) { if(m-i>=0&&n+i<16&&points[m-i][n+i]==color) zx++; else break; } for( i=1;i<5;i++) { if(n-i>=0&&m+i<16&&points[m+i][n-i]==color) zx++; else break; } for( i=1;i<5;i++) { if(m-i>=0&&n-i>=0&&points[m-i][n-i]==color) yx++; else break; } for( i=1;i<5;i++) { if(m+i<16&&n+i<16&&points[m+i][n+i]==color) yx++; else break; } if(p>=5||s>=5||zx>=5||yx>=5) return true; } } return false; } void CFive::Clear() { int i,j; for(i=1;i<=15;i++) for(j=1;j<=15;j++) { points[i][j] = 0;//先清空 } }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值