⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blackvswhite.java

📁 一个简单的黑白棋游戏
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
			}
		}
	
		
		//如果可以占据四个角,先占4个角
		if(grid[0] == 0)
		{
			replace2 = isGood(0,0,3,2);
			if(replace2 >= 1)
			{
				replace1 = replace2;
				cplace1 = 0;
				cplace2 = 0;
			}
		}
		
		else if(grid[DIM - 1] == 0)
		{
			replace2 = isGood(0,DIM - 1,3,2);
			if(replace2 >= 1)
			{
				replace1 = replace2;
				cplace1 = 0;
				cplace2 = DIM - 1;
			}
		}
		
		else if(grid[(DIM - 1) * DIM] == 0)
		{
			replace2 = isGood(DIM - 1,0,3,2);
			if(replace2 >= 1)
			{
				replace1 = replace2;
				cplace1 = DIM - 1;
				cplace2 = 0;
			}
		}
		
		else if(grid[(DIM - 1) * DIM + DIM - 1] == 0)
		{
			replace2 = isGood(DIM - 1,DIM - 1,3,2);
			if(replace2 >= 1)
			{
				replace1 = replace2;
				cplace1 = DIM - 1;
				cplace2 = DIM - 1;
			}
		}
		
		blueNotMoving = false;
		//如果电脑替换玩家棋子的数目大于零时
		if (replace1 > 0) 
		{
			//将格子中的棋子设为蓝棋
			grid[cplace1 * DIM + cplace2] = BLUE;
			//并将相应两个蓝棋间的红棋由蓝棋取而代之
			change(cplace1, cplace2, 3, 2, 4);
		} 
		//否则放弃这一步
		else
			blueNotMoving = true;
	}
	
	//电脑出棋函数
	//专家级别
	public synchronized void blueMove3() 
	{
		//replace1,replace2用来记录替换玩家棋子的数目
		int replace1 = -1;
		int replace2 = -1;
		//cplace1,cplace2用来记录电脑放置棋子的位置
		int cplace1 = -1;
		int cplace2 = -1;
		int uptodown;
		int lefttoright;
		//从上往下,从左至右,分析在每一个空白各自上,
		//电脑放棋后,所能替换玩家棋子的数目,取数目
		//最大时的格子,如果有几个最大值,取最先者
		for (uptodown = 0; uptodown < DIM; ++uptodown) 
		{
			for (lefttoright = 0; lefttoright < DIM; ++lefttoright) 
			{
				//如果格子是空白时  DIM是单方向上的格子数
				if (grid[uptodown * DIM + lefttoright] == 0) 
				{
					//获取替换玩家棋子的数目
					replace2 = isGood(uptodown, lefttoright, 3, 2);
					//取数目最大时的格子的位置值(cplace1,cplace2)
					if (replace1 < replace2 && replace2 > 0) {
						replace1 = replace2;
						cplace1 = uptodown;
						cplace2 = lefttoright;
					}
				}
			}
		}
		
		//如果可以占据四条边
		//先占据四条边
		for (uptodown = 0; uptodown < DIM; ++uptodown)
		{
			if(grid[uptodown * DIM]  == 0)
			{
				replace2 = isGood(uptodown, 0, 3, 2);
				//如果可以放
				if(replace2 >= 1)
				{
					replace1 = replace2;
					cplace1 = uptodown;
					cplace2 = 0;
				}
			}
		}
		
		for (uptodown = 0; uptodown < DIM; ++uptodown)
		{
			if(grid[uptodown * DIM + DIM - 1]  == 0)
			{
				replace2 = isGood(uptodown, DIM -1, 3, 2);
				//如果可以放
				if(replace2 >= 1)
				{
					replace1 = replace2;
					cplace1 = uptodown;
					cplace2 = DIM - 1;
				}
			}
		}
		
		for (lefttoright = 0; lefttoright < DIM; ++lefttoright)
		{
			if(grid[lefttoright]  == 0)
			{
				replace2 = isGood(0, lefttoright, 3, 2);
				//如果可以放
				if(replace2 >= 1)
				{
					replace1 = replace2;
					cplace1 = 0;
					cplace2 = lefttoright;
				}
			}
		}
		
		for (lefttoright = 0; lefttoright < DIM; ++lefttoright)
		{
			if(grid[(DIM - 1) * DIM + lefttoright]  == 0)
			{
				replace2 = isGood(DIM - 1, lefttoright, 3, 2);
				//如果可以放
				if(replace2 >= 1)
				{
					replace1 = replace2;
					cplace1 = DIM - 1;
					cplace2 = lefttoright;
				}
			}
		}
		
		//如果可以占据四个角,先占4个角
		if(grid[0] == 0)
		{
			replace2 = isGood(0,0,3,2);
			if(replace2 >= 1)
			{
				replace1 = replace2;
				cplace1 = 0;
				cplace2 = 0;
			}
		}
		
		else if(grid[DIM - 1] == 0)
		{
			replace2 = isGood(0,DIM -1,3,2);
			if(replace2 >= 1)
			{
				replace1 = replace2;
				cplace1 = 0;
				cplace2 = DIM - 1;
			}
		}
		
		else if(grid[(DIM - 1) * DIM] == 0)
		{
			replace2 = isGood(DIM - 1,0,3,2);
			if(replace2 >= 1)
			{
				replace1 = replace2;
				cplace1 = DIM - 1;
				cplace2 = 0;
			}
		}
		
		else if(grid[(DIM - 1) * DIM + DIM - 1] == 0)
		{
			replace2 = isGood(DIM - 1,DIM - 1,3,2);
			if(replace2 >= 1)
			{
				replace1 = replace2;
				cplace1 = DIM - 1 ;
				cplace2 = DIM - 1;
			}
		}
		
		blueNotMoving = false;
		//如果电脑替换玩家棋子的数目大于零时
		if (replace1 > 0) 
		{
			//将格子中的棋子设为蓝棋
			grid[cplace1 * DIM + cplace2] = BLUE;
			//并将相应两个蓝棋间的红棋由蓝棋取而代之
			change(cplace1, cplace2, 3, 2, 4);
		} 
		//否则放弃这一步
		else
			blueNotMoving = true;
	}
	
	
	
	
	//计算能够替换对方棋子的数目
	//其中前两个参数为格子的位置
	//后两个参数为双方棋子的颜色值
	public synchronized int isGood(int replace1, int replace2, int colorb, int colorr) 
	{
		//前两个数据分别用于记录某个方向上能替换棋子的数目
		//和累计8个方向上能替换对方棋子的总数目
		int recordnum = 0;
		int totalnum = 0;
		int num7;
		int num8;
		int num9;
		int num10;
		//记录右方能够替换棋子的数目
		for (num8 = replace2 + 1; num8 < DIM; ++num8) 
		{
			if (grid[replace1 * DIM + num8] == colorr)
				++recordnum;  
			//如果是对方的棋子 +1
			else 
			{
				if (grid[replace1 * DIM + num8] == colorb)
					break;
				//如果是自己的棋子,跳出循环
				//如果是NONE也要跳出
				if (grid[replace1 * DIM + num8] == 0||grid[replace1 * DIM + num8] == 1) 
				{
					recordnum = 0;
					break;
					//如果方向上有空白,就置零
				}
			}
		}
		//如果大于格数,表示右边都是对方棋子
		if (num8 >= DIM)
			recordnum = 0;
		//数目为零 累计
		totalnum += recordnum;
		//临时记录清零
		recordnum = 0;
		
		//记录左方能替换对方棋子的数目
		for (num8 = replace2 - 1; num8 >= 0; --num8) 
		{
			if (grid[replace1 * DIM + num8] == colorr)
				++recordnum;
			//对方棋子,加1
			else {
				if (grid[replace1 * DIM + num8] == colorb)
					break;
				//自己棋子,结束
				if (grid[replace1 * DIM + num8] == 0||grid[replace1 * DIM + num8] == 1) 
				{
					recordnum = 0;
					break;
				}
			}
		}
		//如果左方全是对方的棋子
		if (num8 <= -1)
			recordnum = 0;
		//累计数目
		totalnum += recordnum;
		recordnum = 0;
		
		//记录下方能够替换对方棋子的数目
		for (num7 = replace1 + 1; num7 < DIM; ++num7) 
		{
			//从下方开始数
			if (grid[num7 * DIM + replace2] == colorr)
				++recordnum;
			else {
				if (grid[num7 * DIM + replace2] == colorb)
					break;
				//同理
				if (grid[num7 * DIM + replace2] == 0||grid[num7 * DIM + replace2] == 1) 
				{
					recordnum = 0;
					break;
				}
			}
		}
		if (num7 >= DIM)
			recordnum = 0;
		totalnum += recordnum;
		recordnum = 0;
		
		//记录上方替换棋子的数目
		num7 = replace1 - 1;
		//从上方开始
		while (num7 >= 0) 
		{
			if (grid[num7 * DIM + replace2] == colorr)
				++recordnum;
			//对方棋子,加1
			if (grid[num7 * DIM + replace2] == colorb)
				break;
			//找到自己的棋子,完成
			if (grid[num7 * DIM + replace2] == 0||grid[num7 * DIM + replace2] == 1) 
			{
				recordnum = 0;
				break;
			} 
			else
				//上移动
				--num7;
		}
		if (num7 <= -1)
			recordnum = 0;
		//累计数据
		totalnum += recordnum;
		//临时数据清零
		recordnum = 0;
		
		//记录右上方能够替换对方棋子的数目
		//从右一个开始
		num9 = replace2 + 1;
		//从上一个开始
		num10 = replace1 - 1;
		while (num9 >= 0 && num10 >= 0) 
		{
			//乘法和加法实现定位
			if (grid[num10 * DIM + num9] == colorr)
				++recordnum;
			if (grid[num10 * DIM + num9] == colorb)
				break;
			if (grid[num10 * DIM + num9] == 0||grid[num10 * DIM + num9] == 1) 
			{
				recordnum = 0;
				break;
			} 
			else 
			{
				//向右上方移动棋子
				++num9;
				--num10;
			}
		}
		//到达边界
		//如果满足条件,说明右上方都是对方棋子
		if (num9 >= DIM || num10 <= -1)
			recordnum = 0;
		//累计数目
		totalnum += recordnum;
		//清零
		recordnum = 0;
		
		//记录右下方替换的棋子
		num9 = replace2 + 1;
		for (num10 = replace1 + 1; num9 < DIM && num10 < DIM; ++num10) 
		{
			if (grid[num10 * DIM + num9] == colorr)
				++recordnum;
			else 
			{
				if (grid[num10 * DIM + num9] == colorb)
					break;
				if (grid[num10 * DIM + num9] == 0||grid[num10 * DIM + num9] == 1) 
				{
					recordnum = 0;
					break;
				}
			}
			++num9;
		}
		if (num9 >= DIM || num10 >= DIM)
			recordnum = 0;
		totalnum += recordnum;
		recordnum = 0;
		
		//记录左上方替换棋子的数目
		num9 = replace2 - 1;
		for (num10 = replace1 - 1; num9 >= 0 && num10 >= 0; --num10) 
		{
			if (grid[num10 * DIM + num9] == colorr)
				++recordnum;
			else 
			{
				if (grid[num10 * DIM + num9] == colorb)
					break;
				if (grid[num10 * DIM + num9] == 0||grid[num10 * DIM + num9] == 1) 
				{
					recordnum = 0;
					break;
				}
			}
			--num9;
		}
		if (num9 <= -1 || num10 <= -1)
			recordnum = 0;
		totalnum += recordnum;
		recordnum = 0;
		
		//记录左下方替换棋子的数目
		num9 = replace2 - 1;
		for (num10 = replace1 + 1; num9 < DIM && num10 < DIM; ++num10) 
		{
			if (grid[num10 * DIM + num9] == colorr)
				++recordnum;
			else 
			{
				if (grid[num10 * DIM + num9] == colorb)
					break;
				if (grid[num10 * DIM + num9] == 0||grid[num10 * DIM + num9] == 1) 
				{
					recordnum = 0;
					break;
				}
			}
			--num9;
		}
		if (num9 <= -1 || num10 >= DIM)
			recordnum = 0;
		totalnum += recordnum;
		return totalnum;
	}

	//替换棋子的函数
	//前两个参数代表放置棋子格子的位置
	//接下来是棋子的颜色值,和临时颜色
	//用paint函数,对颜色重新绘制
	public synchronized void change(int replace1, int replace2, int colorb, int colorr,
			int tempcolor) 
	{
		
		int judgenum = 0;
		int num8 = replace2 + 1;
		int num7;
		int num9;
		int num10;
		int num11;
		int num12;
		int num13;
		int num14;
		int num15;
		int num16;
		int num17;
		int num18;
		int num19;
		
		//判断右方是否有自己的棋子
		while (num8 < DIM) 
		{
			num7 = replace1 * DIM + num8;
			if (grid[num7] != colorr) 
			{
				//如果有,则将num6置为1,并跳出循环
				if (grid[num7] == colorb)
					judgenum = 1;
				break;
			} 
			else
				
				++num8;
		}
		//如果右方有自己方的棋子,就将之间棋子的颜色设置为本方棋子临时颜色
		if (judgenum != 0) 
		{
			for (num9 = replace2 + 1; num9 < DIM; ++num9) 
			{
				num7 = replace1 * DIM + num9;
				if (grid[num7] == colorr)
					grid[num7] = tempcolor;
				else if (grid[num7] == colorb)
					break;
			}
		}
		//清零
		judgenum = 0;
		//判断左方是否有本方的棋子
		num9 = replace2 - 1;
		while (num9 >= 0) 
		{
			num7 = replace1 * DIM + num9;
			if (grid[num7] != colorr) 
			{
				//有,置为1
				if (grid[num7] == colorb)
					judgenum = 1;
				break;
			} 
			else
				--num9;
		}
		if (judgenum != 0) 
		{
			for (num10 = replace2 - 1; num10 >= 0; --num10) 
			{
				num7 = replace1 * DIM + num10;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -