当智力游戏遇到程序员(一 )三皇后

手机上下载了一个智力游戏的软件,里面界面还不错,所以就留下来一直在玩。但其中有一些关卡确实很难,我有时也会跳过。但是突然就有个想法,想通过写写这些游戏的破解方案来锻炼自己写代码的能力,然后发现还附带了一些装B的能力,简直让我沉溺其中,所以可能会不断更新哦。这一次,先写一下国际象棋中三皇后的小游戏的破解。

游戏规则

在下面的棋盘中放置三个皇后棋子,让所有空白方块都可以被攻击,就这么简单。


破解思路

其实看到这关的时候,我连国际象棋怎么玩都不知道。但是通过上网查阅资料,发现皇后的攻击范围是:其所在的行,列,及两条对角线,一般来讲,就是其身边的八个方向。

于是乎,我就有了一点点想法,我要在这个 8*8 的棋盘的 64 个方块中随意选出三个方块来进行判断,也就是从 64 取 3 种可能性,再在这 7410 种情况中进行判断,找出符合游戏规则的解。虽然人脑来进行这么庞大的运算是不太可能的,但是程序完全可以啊,也就有了解决方案。


具体实现

在我的程序中,除了构造方法和main方法外,主要的方法有三个:一个用来将皇后身边的八个方向的空格全都“杀掉”,一个用来遍历出那 7410 种可能性,还有一个用来进行判断,满足条件则输出这三个皇后的位置。

程序如下:

public class ChessGame {
	public static final int N=6;
	public static final int Q=3;
	public static int [] rowQ = new int[Q];
	public static int [] colQ = new int[Q];
	public static int [][] chessBoard = new int[N][N]; 
	
	public ChessGame(){
		for(int i=0; i<N; i++){
			for(int j=0; j<N; j++){
				chessBoard[i][j]=0;
			}
		}
	}
	public void queenKill(int x, int y){
		//走出八个方向
		int row=x, col=y;
		int x1=x, y1=y;
		int x2=x, y2=y;
		int x3=x, y3=y;
		int x4=x, y4=y;
		for(int i=0; i<N; i++){//行
			chessBoard[i][col]=1;
		}
		for(int j=0; j<N; j++){//列
			chessBoard[row][j]=1;
		}
		while(x1>=0&&y1>=0){//左上角对角线
			chessBoard[x1][y1]=1;
			x1--;
			y1--;
		}
		while(x2>=0&&y2<=5){//右上角对角线
			chessBoard[x2][y2]=1;
			x2--;
			y2++;
		}
		while(x3<=5&&y3<=5){//右下角对角线
			chessBoard[x3][y3]=1;
			x3++;
			y3++;
		}
		while(x4<=5&&y4>=0){//左上角对角线
			chessBoard[x4][y4]=1;
			x4++;
			y4--;
		}
		
	}
	
	public void findQueens(){//判断的方案
//		int count = 1;
		for(int i0=0; i0<N; i0++){//三个皇后可能的落点
			for(int j0=0; j0<N; j0++){
				if(i0==5&&j0>3) break;
				rowQ[0] = i0;
				colQ[0] = j0;
				
				int j1=j0+1;
				for(int i1=i0;i1<N;i1++){
					while(j1<N){
						if(i1==5&&j1>4) break;
						rowQ[1] = i1;
						colQ[1] = j1;
						
						int j2=j1+1;
						for(int i2=i1;i2<N;i2++){
							while(j2<N){
								if(i2==5&&j0>5) break;
								rowQ[2] = i2;
								colQ[2] = j2;
//								System.out.print(count+"  ");
//								count++;
								// 必须先初始化
								for(int i=0; i<N; i++){
									for(int j=0; j<N; j++){
										chessBoard[i][j]=0;
									}
								}
								for(int k=0; k<3; k++){
									queenKill(rowQ[k], colQ[k]);
//									System.out.print(rowQ[k]);
//									System.out.print(colQ[k]);
//									System.out.print("  ");
								}
//								System.out.println();
//								for(int i=0; i<N; i++){
//								for(int j=0; j<N; j++){
//									System.out.print(chessBoard[i][j]);
//									System.out.print("  ");
//								}
//								System.out.println();
//							}
								solveTheProblem();
								j2++;
							}
							j2=0;
						}
						j1++;
					}
					j1=0;
					
				}			
			}
		}
	}
	
	public void solveTheProblem(){
		boolean b=true;
		for(int iSTP=0; iSTP<N; iSTP++){
			for(int jSTP=0; jSTP<N; jSTP++){
				if(chessBoard[iSTP][jSTP]==0) {
					b=false;
					return;
				}
			}
		}
		if(b){		
			for(int k=0; k<3; k++){//输出所要的三个皇后
				System.out.print(rowQ[k]);
				System.out.print(colQ[k]);
				System.out.print("  ");
			}
			System.out.println();
		}
	}
	
	
	public static void main(String[] args) {
		ChessGame cg = new ChessGame();
//		queenKill(0, 0);
//		queenKill(0, 1);
//		queenKill(2, 0);
//		for(int i=0; i<N; i++){
//			for(int j=0; j<N; j++){
//				System.out.print(chessBoard[i][j]);
//				System.out.print("  ");
//			}
//			System.out.println();
//		}
		cg.findQueens();
	}

}
程序跑出来是这个样子:


于是乎,游戏成功破解(下面分别是第二种和第三种解法):


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要成为一名Python程序员,首先你需要学习Python语言和编程基础知识。你可以在网上找到很多关于Python的教程,从基本的语法到更高级的知识,比如算法、数据结构、设计模式、网络编程等等。此外,你还应该学习游戏开发相关的知识,比如游戏策划、美术设计等。 ### 回答2: 要成为一名游戏的Python程序员,你需要掌握一些基本的技能和知识,并且有一定的实践经验。以下是几个步骤可以帮助你实现这个目标: 1. 学习Python编程语言:首先,你需要掌握Python编程语言的基础知识,包括变量、数据类型、条件语句、循环等。可以通过在线教程、自学资料或者参加培训课程来学习。 2. 熟悉Python的游戏开发库:Python有一些游戏开发库,如Pygame、Pyglet、Panda3D等,学习和使用这些库能够帮助你开发游戏。阅读相关文档、教程和示例代码,掌握库的基本操作和功能。 3. 实践项目:通过编写小型游戏项目来实践你的编程技能。可以从简单的游戏开始,比如一个迷宫或者打砖块游戏,逐渐增加难度和复杂度。通过实践项目,你可以不断提升自己的编程能力和理解游戏开发的流程。 4. 参与开源项目或团队合作:通过参与开源项目或与其他游戏程序员合作,你可以学习到更多高级概念和工程实践。这样的经验可以提高你的编程技能,同时也可以帮助你建立自己的专业网络。 5. 持续学习和改进:游戏开发是一个不断演进的领域,新技术和工具层出不穷。要成为一名优秀的游戏Python程序员,你需要不断学习和掌握新的技能和知识。阅读相关的书籍、博客、论坛,参加工作坊和培训课程是不断学习和改进的好方法。 总而言之,成为一名游戏的Python程序员需要时间和努力。通过学习Python编程语言、熟悉游戏开发库、实践项目、参与开源项目和不断学习改进,你可以逐步达到这个目标。 ### 回答3: 要成为一名游戏的Python程序员,你需要掌握一定的编程基础和相关的技术知识。下面是一些步骤可以帮助你实现这个目标: 1. 学习Python编程语言:首先,你需要学习Python的基础知识,包括语法、数据类型、函数等。可以通过参加在线课程、阅读相关书籍或观看教学视频来学习。 2. 学习游戏开发基础知识:了解游戏开发的基本概念,例如游戏循环、图形渲染、碰撞检测等。学习游戏设计模式能够帮助你更好地理解游戏的结构和组织。 3. 学习游戏开发框架和工具:掌握一些常用的Python游戏开发框架和工具,例如Pygame、Panda3D等。这些工具可以帮助你更快地构建游戏原型和实现游戏逻辑。 4. 实践项目:开发小型游戏项目是提高编程能力的重要方式。尝试设计和实现自己的游戏项目,通过解决实际问题来熟悉游戏开发流程和常用的编程技巧。 5. 参与开源项目:积极参与开源游戏项目可以提高你的合作能力和代码质量。你可以通过GitHub等平台找到感兴趣的项目,并为其贡献代码。 6. 不断学习和提升:游戏行业发展迅速,不断学习新的技术和工具是必要的。关注最新的游戏开发趋势和技术,参加相关的培训和会议,保持对新知识的求知欲。 总之,成为一名游戏的Python程序员需要一定的时间和努力,但只要坚持学习和实践,你将逐渐掌握必要的技能,并能够参与到有趣的游戏开发项目中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值