基于graphics.h使用C++实现五子棋游戏(代码分享)

#include <iostream>
#include <graphics.h>//使用前需要下载安装easyx
#include <string>
#include <stdio.h>

void init_play_window();//创建界面
void start_playing();
int winner(int record[9][9]);
int winner2(int record[9][9]);

void main(std::string args[]) {
	while (1) {
		init_play_window();
		start_playing();
	}
	//卡屏
	/*int record[9][9] = {
	{	0, 0, 0, 0, 0, 0, 1, 2, 0},
	{	0, 0, 0, 0, 0, 0, 1, 2, 0},
	{	0, 0, 0, 0, 2, 0, 1, 2, 0},
	{	0, 0, 1, 2, 1, 1, 1, 2, 0},
	{	0, 0, 0, 1, 1, 2, 1, 2, 0},
	{	0, 0, 2, 1, 2, 1, 2, 0, 0},
	{	0, 2, 1, 2, 1, 2, 0, 0, 0},
	{	0, 0, 0, 1, 1, 2, 0, 0, 0},
	{	0, 0, 0, 0, 0, 0, 0, 0, 0}
	};
	for (int i = 0;i < 9;i++) {
		for (int j = 0;j < 9;j++) {
			std::cout << record[i][j] << " ";
		}
		std::cout << std::endl;
	}*/
	//winner(record);
	getchar();
	
	//return 1;
}
void init_play_window() {
	//创建界面
	initgraph(600, 500,SHOWCONSOLE);
	//图片输入
	IMAGE img;
	loadimage(&img, "fallback-image.jpg");
	putimage(-400,-500, &img);
	//绘制棋盘
	
	for (int i = 1;i < 20;i++) {
		if (i % 2 == 0) {
			setlinecolor(YELLOW);
		}
		else {
			setlinecolor(BLACK);
		}
		line(25, 25 * i, 475, 25 * i);
		line(25 * i, 25, 25 * i, 475);
	}
	setbkmode(0);//文字默认背景为黑色,设置为透明
	settextcolor(BLACK);
	settextcolor(BLACK);
	outtextxy(505, 25, "玩家1:白");
	outtextxy(505, 50, "玩家2:黑");
}
void start_playing() {
	//获取鼠标点击事件 ,范围(x,y)(25,25)~(475,25),(475,25)~(475,475)
	MOUSEMSG mMsg;//事件变量
	int chess_x, chess_y;
	int flag = 1;//白子为先
	int record[9][9] = { 0 };
	while (1) {
		mMsg = GetMouseMsg();//鼠标信息获取
		if (mMsg.uMsg == WM_LBUTTONDOWN) {//右键
			chess_x = 50 * (int)((mMsg.x + 25) / 50);
			chess_y = 50 * (int)((mMsg.y + 25) / 50);
			std::cout << "out:x:" << chess_x << "y:" << chess_y << std::endl;
			std::cout << "右键x:" << mMsg.x << "y:" << mMsg.y << std::endl;

			if (chess_x <= 475 && chess_x>=25 && chess_y <= 475 && chess_y >= 25) {
					if (record[chess_y / 50 - 1][chess_x / 50 - 1] == 0) {
					solidcircle(chess_x, chess_y, 20);
					if (flag == 1) {
						record[chess_y / 50 - 1][chess_x / 50 - 1] = 1;
						flag = 0;
						setfillcolor(BLACK);
					}
					else if (flag == 0) {
						flag = 1;
						record[chess_y / 50 - 1][chess_x / 50 - 1] = 2;
						setfillcolor(WHITE);
					}
				}
				
				for (int i = 0;i < 9;i++) {
					for (int j = 0;j < 9;j++) {
						std::cout << record[i][j] << " ";
					}
					std::cout << std::endl;
				}
			}
			if (winner2(record) > 0) {
				if (winner(record) == 2) {
					MessageBox(NULL,"黑棋胜利","Game Over",MB_OK);
					std::cout << "黑棋胜利" << std::endl;
					//outtextxy(505, 100, "黑棋胜利");
				}
				else if (winner(record) == 1) {
					MessageBox(NULL, "白棋胜利", "Game Over", MB_OK);
					std::cout << "白棋胜利" << std::endl;
					//outtextxy(505, 100, "白棋胜利");
				}
				break;
			};
		}
		else if (mMsg.uMsg == WM_RBUTTONDOWN) {//左键
			std::cout << "左键x:" << mMsg.x << "y:" << mMsg.y << std::endl;
		}
		//优化点位
	}
}
int winner2(int record[9][9]) {//winner优化
	
	int flag1_col = 0, flag2_col = 0;//横向
	int flag1_line = 0, flag2_line = 0;//竖向
	int flag1_xy = 0, flag2_xy = 0;//右上左下向
	int flag1_yx = 0, flag2_yx = 0;//左上右下下向
	for (int i = 0;i < 9;i++) {//横向,竖向
		flag1_col = 0, flag2_col = 0;//横向
		flag1_line = 0, flag2_line = 0;//竖向
		for (int j = 0;j < 5;j++) {
			if (record[i][j] == 1) {
				flag1_col += 1;
				flag1_line += 1;
				for (int m = 1;m < 5;m++) {////横向
					if (record[i][j + m] == 1) {
						flag1_col += 1;
					}
					else {
						flag1_col = 0;
					}
					if (record[i + m][j] == 1) {//竖向
						flag1_line += 1;
					}
					else {
						flag1_line = 0;
					}
				}
							}
			else if (record[i][j] == 2) {
				flag2_col += 1;
				flag2_line += 1;
				for (int m = 1;m < 5;m++) {
					if (record[i][j + m] == 2) {
						flag2_col += 1;
					}
					else {
						flag2_col = 0;
					}					
					if (record[i + m][j] == 2) {//竖向
						flag2_line += 1;
					}
					else {
						flag2_line = 0;
					}
				}
			}
			if (flag2_col == 5 || flag1_col == 5 || flag2_line == 5 || flag1_line == 5) {
				break;
			}
		}
		if (flag2_col == 5 || flag1_col == 5 || flag2_line == 5 || flag1_line == 5) {
			break;
		}
	}
	if (flag2_col == 5 || flag2_line == 5) {
		//std::cout << "黑棋胜利" << std::endl;
		return 2;
	}
	else if (flag1_col == 5 || flag1_line == 5) {
		//std::cout << "白棋胜利" << std::endl;
		return 1;
	}
	//斜向,右上至左下
	for (int i = 0;i < 9;i++) {
		flag1_xy = 0;
		flag2_xy = 0;
		for (int j = 4;j < 9;j++) {
			if (record[i][j] == 1) {
				flag1_xy += 1;
				for (int m = 1;m < 5;m++) {
					if (record[i + m][j - m] == 1) {
						flag1_xy += 1;
					}
					else {
						flag1_xy = 0;
						break;
					}
				}
			}
			else if (record[i][j] == 2) {
				flag2_xy += 1;
				for (int m = 1;m < 5;m++) {
					if (record[i + m][j - m] == 2) {
						flag2_xy += 1;
					}
					else {
						flag2_xy = 0;
						break;
					}
				}
			}
			if (flag2_xy == 5 || flag1_xy == 5) {
				break;
			}
		}
		if (flag2_xy == 5 || flag1_xy == 5) {
			break;
		}
	}
	if (flag2_xy == 5) {
		//std::cout << "黑棋胜利" << std::endl;
		return 2;
	}
	else if (flag1_xy == 5) {
		//std::cout << "白棋胜利" << std::endl;
		return 1;
	}
	//斜向,左上至右下
	for (int i = 0;i < 5;i++) {
		flag1_yx = 0;
		flag2_yx = 0;
		for (int j = 0;j < 5;j++) {
			if (record[i][j] == 1) {
				flag1_yx += 1;
				for (int m = 1;m < 5;m++) {
					if (record[i + m][j + m] == 1) {
						flag1_yx += 1;
					}
					else {
						flag1_yx = 0;
						break;
					}
				}
			}
			else if (record[i][j] == 2) {
				flag2_yx += 1;
				for (int m = 1;m < 5;m++) {
					if (record[i + m][j + m] == 2) {
						flag2_yx += 1;
					}
					else {
						flag2_yx = 0;
						break;
					}
				}
			}
			if (flag2_yx == 5 || flag1_yx == 5) {
				break;
			}
		}
		if (flag2_yx == 5 || flag1_yx == 5) {
			break;
		}
	}
	if (flag2_yx == 5) {
		//std::cout << "黑棋胜利" << std::endl;
		return 2;
	}
	else if (flag1_yx == 5) {
		//std::cout << "白棋胜利" << std::endl;
		return 1;
	}
	return 0;

}
int winner(int record[9][9]) {
	//横向
	int flag1 = 0;
	int flag2 = 0;
	for (int i = 0;i < 9;i++) {
		flag1 = 0;
		flag2 = 0;
		for (int j = 0;j < 5;j++) {
			if (record[i][j]==1 ) {
				flag1 += 1;
				for (int m = 1;m < 5;m++) {
					if (record[i][j+m] == 1) {
						flag1 += 1;
					}
					else {
						flag1 = 0;
						break;
					}
				}
			}
			else if (record[i][j] == 2) {
				flag2 += 1;
				for (int m = 1;m < 5;m++) {
					if (record[i][j + m] == 2) {
						flag2 += 1;
					}
					else {
						flag2 = 0;
						break;
					}
				}
			}
			if (flag2 == 5 || flag1 == 5) {
				break;
			}
		}
		if (flag2 == 5 || flag1 == 5) {
			break;
		}
	}
	if (flag2 == 5 ) {
		//std::cout << "黑棋胜利" << std::endl;
		return 2;
	}
	else if(flag1 == 5){
		//std::cout << "白棋胜利" << std::endl;
		return 1;
	}
	
	//竖向
	for (int i = 0;i < 5;i++) {
		flag1 = 0;
		flag2 = 0;
		for (int j = 0;j < 9;j++) {
			if (record[i][j] == 1) {
				flag1 += 1;
				for (int m = 1;m < 5;m++) {
					if (record[i+m][j] == 1) {
						flag1 += 1;
					}
					else {
						flag1 = 0;
						break;
					}
				}
			}
			else if (record[i][j] == 2) {
				flag2 += 1;
				for (int m = 1;m < 5;m++) {
					if (record[i+m][j] == 2) {
						flag2 += 1;
					}
					else {
						flag2 = 0;
						break;
					}
				}
			}
			if (flag2 == 5 || flag1 == 5) {
				break;
			}
		}
		if (flag2 == 5 || flag1 == 5) {
			break;
		}
	}
	if (flag2 == 5) {
		//std::cout << "黑棋胜利" << std::endl;
		return 2;
	}
	else if (flag1 == 5) {
		//std::cout << "白棋胜利" << std::endl;
		return 1;
	}
	//斜向,右上至左下
	for (int i = 0;i < 9;i++) {
		flag1 = 0;
		flag2 = 0;
		for (int j = 4;j < 9;j++) {
			if (record[i][j] == 1) {
				flag1 += 1;
				for (int m = 1;m < 5;m++) {
					if (record[i + m][j-m] == 1) {
						flag1 += 1;
					}
					else {
						flag1 = 0;
						break;
					}
				}
			}
			else if (record[i][j] == 2) {
				flag2 += 1;
				for (int m = 1;m < 5;m++) {
					if (record[i + m][j-m] == 2) {
						flag2 += 1;
					}
					else {
						flag2 = 0;
						break;
					}
				}
			}
			if (flag2 == 5 || flag1 == 5) {
				break;
			}
		}
		if (flag2 == 5 || flag1 == 5) {
			break;
		}
	}
	if (flag2 == 5) {
		//std::cout << "黑棋胜利" << std::endl;
		return 2;
	}
	else if (flag1 == 5) {
		//std::cout << "白棋胜利" << std::endl;
		return 1;
	}
	//斜向,左上至右下
	for (int i = 0;i < 5;i++) {
		flag1 = 0;
		flag2 = 0;
		for (int j = 0;j < 5;j++) {
			if (record[i][j] == 1) {
				flag1 += 1;
				for (int m = 1;m < 5;m++) {
					if (record[i + m][j + m] == 1) {
						flag1 += 1;
					}
					else {
						flag1 = 0;
						break;
					}
				}
			}
			else if (record[i][j] == 2) {
				flag2 += 1;
				for (int m = 1;m < 5;m++) {
					if (record[i + m][j + m] == 2) {
						flag2 += 1;
					}
					else {
						flag2 = 0;
						break;
					}
				}
			}
			if (flag2 == 5 || flag1 == 5) {
				break;
			}
		}
		if (flag2 == 5 || flag1 == 5) {
			break;
		}
	}
	if (flag2 == 5) {
		//std::cout << "黑棋胜利" << std::endl;
		return 2;
	}
	else if (flag1 == 5) {
		//std::cout << "白棋胜利" << std::endl;
		return 1;
	}
	return 0;
}

运行后结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值