Discuz! Board

 找回密码
 立即注册
查看: 732|回复: 0

2023.12.1(五子棋)

[复制链接]

4

主题

4

帖子

210

积分

中级会员

Rank: 3Rank: 3

积分
210
发表于 2023-12-1 19:38:06 | 显示全部楼层 |阅读模式
[C++] 纯文本查看 复制代码
#include <graphics.h>
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;

#define Row 15
#define Col 15
int board[Row][Col];		//棋盘
int player=2;				//当前玩家
PIMAGE pimgs[3];			//棋盘图片
mouse_msg msg;				//鼠标


void loadImage()//图片载入 
{
	char path[100];			//加载图片路径
	for(int i=0;i<3;i++)
	{
		pimgs[i]=newimage();	//向计算机申请一个图片空间
		sprintf(path,"image/%d.jpg",i);//拼接图片相对路径
		getimage(pimgs[i],path);//将系统中的图片数据存入pimgs
	}
}

void draw()//图形绘制 
{
	for(int i=0;i<Row;i++)
	for(int j=0;j<Col;j++)
		putimage(j*25,i*25,pimgs[board[i][j]]);
}

bool IsFull()
{
	for (int i = 0; i < Row; i++)
	for (int j = 0; j < Col; j++)
	{
		if (board[i][j] == 0)
		{
			return false;
		}
	}
	//棋盘没有空位置了还没有判断出输赢,则平局
	return true;
}

int gameover()
{
	int i = 0;
	int j = 0;
 
	// 横线上五子连成一线,赢家产生
	for (i = 0; i < Row; i++)
	for (j = 0; j < Col - 4; j++)
	{
		if (board[i][j] == board[i][j + 1]&& board[i][j + 1] == board[i][j + 2]&& 
			board[i][j + 2] == board[i][j + 3]&& board[i][j + 3] == board[i][j + 4]&& 
			board[i][j] != 0)	
			return board[i][j];
	}
	// 竖线上五子连成一线,赢家产生
	for (i = 0; i < Row - 4; i++)
	for (j = 0; j < Col; j++)
	{
		if (board[i][j] == board[i + 1][j]&& board[i + 1][j] == board[i + 2][j]&& 
			board[i + 2][j] == board[i + 3][j]&& board[i + 3][j] == board[i + 4][j]&& 
			board[i][j] != 0)	
			return board[i][j];
	}
	// 斜线上五子连成一线,赢家产生
	for (i = 4; i < Row; i++)
	for (j = 0; j < Col - 4; j++)
	{
		if (board[i][j] == board[i-1][j+1]&& board[i-1][j+1] == board[i-2][j+2]&& 
			board[i-2][j+2] == board[i-3][j+3]&& board[i-3][j+3] == board[i-4][j+4]&& 
			board[i][j] != 0)	
			return board[i][j];
	}
	// 斜线上五子连成一线,赢家产生
	for (i = 0; i < Row -4; i++)
	for (j = 0; j < Col - 4; j++)
	{
		if (board[i][j] == board[i+1][j+1]&& board[i+1][j+1] == board[i+2][j+2]&& 
			board[i+2][j+2] == board[i+3][j+3]&& board[i+3][j+3] == board[i+4][j+4]&& 
			board[i][j] != 0)	
			return board[i][j];
	}
 
	//游戏平局
	if (IsFull())	return 3;
 
	//游戏结束
	return 0;
 } 

void start()//初始化 
{
//关闭窗口不强制退出程序,以便进行游戏保存工作
//	setinitmode(INIT_RENDERMANUAL | INIT_NOFORCEEXIT, 100, 50);
	
	initgraph(Col*25,Row*25);//图形初始化 	
	setcaption("五子棋");	//设置程序标题
	setbkcolor(WHITE);
	loadImage();//图片载入 
	
	setcolor(BLACK);
	setfont(25,0,"幼圆");//(字体高度,字体宽度(为0即为自适应),字形)设置字体为25,幼圆字体
	setbkmode(TRANSPARENT); //设置文字背景色为透明(默认为有背景色)
} 

int main()
{
	start(); 
	while(1)
	{
		while(mousemsg())
		{
			msg=getmouse();
			int y=msg.x/25,x=msg.y/25;
			if(msg.is_down())
			{
				if(board[x][y]==0)		//判断当前格子是否可以落子
				{
					board[x][y]=player;	//改变当前棋盘格子状态
					if(player==1) player=2;	//换手
					else player=1;
				}	
			}
			
		}
		draw();					//更新棋盘
		if(gameover()==1)	{xyprintf(150,150,"白方获胜"); break;}
		else if(gameover()==2)	{xyprintf(150,150,"黑方获胜"); break;} 
		else if(gameover()==3)	{xyprintf(150,150,"平局"); break;}
		else  ; 

		delay_fps(60);
	}
	getch();
	return 0;
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-5-30 12:11 , Processed in 0.065033 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表