如何用Java控制台玩2048

昨天晚上咸的,想自己做个2048试试,折腾到半夜算是有点成果,分享下,由于搞的太晚也没来得及加注释,最后也没有优化重构,就简单看下思路吧

先看个拼图的小游戏消化下

import java.io.IOException;

/**
 * 控制台玩拼图游戏
 * @author c
 * 码农扣扣群:2177712
 */
public class Puzzle {
	static final int X = 3;
	static final int Y = 3;
	static int tar[][] = new int[X][Y];
	static int BX,BY;
	static int step = 0;

	static void init(){
		/*正常排序插入*/
		int index = 0;
		for (int i = 0; i < X; i++) {
			for (int j = 0; j < Y; j++) {
				tar[i][j] = index++;
			}
		}
		/*打乱排序*/
		for (int i = 0; i < tar.length; i++) {
			for (int j = 0; j < tar[i].length; j++) {
				int temp = tar[i][j];
				int randomX, randomY;
				randomX = (int) (Math.random()*X);
				randomY = (int) (Math.random()*tar[randomX].length);
				tar[i][j] = tar[randomX][randomY];
				tar[randomX][randomY] = temp;
			}
		}
	}

	static void outPrint(){
		boolean isok = true;

		for (int i = 0; i < X; i++) {
			for (int j = 0; j < Y; j++) {
				if(tar[i][j] == 0){
					System.out.print("	[囧]");
					BX = i;BY = j;
				}else{
					if(tar[i][j]!=(i*(Y) + j + 1)){
						isok = false;
					}
					System.out.print("	["+(tar[i][j]<10?" "+tar[i][j]:tar[i][j])+"]");
				}
			}
			System.out.println();
		}
		if(isok){
			System.out.println("恭喜获胜!步数: "+step);
		}else{
			System.out.println("go on! 步数: "+step);
		}
	}

	static void change(int dir){
		switch (dir) {
		case 115://S 下
			if(BX != 0){
				tar[BX][BY] = tar[BX-1][BY];
				tar[BX-1][BY] = 0;
				BX--;
				step++;
				outPrint();
			}
			break;
		case 100://D 右
			if(BY != 0){
				tar[BX][BY] = tar[BX][BY-1];
				tar[BX][BY-1] = 0;
				BY--;
				step++;
				outPrint();
			}
			break;
		case 119://W 上
			if(BX != X-1){
				tar[BX][BY] = tar[BX+1][BY];
				tar[BX+1][BY] = 0;
				BX++;
				step++;
				outPrint();
			}
			break;
		case 97://A 左
			if(BY != Y-1){
				tar[BX][BY] = tar[BX][BY+1];
				tar[BX][BY+1] = 0;
				BY++;
				step++;
				outPrint();
			}
			break;

		default:
			break;
		}
	}

	public static void main(String[] args) throws IOException {

		init();
		outPrint();
		while(true){
			int read = System.in.read();
			change(read);
		}
	}
}

按W S A D 为上下左右,其实就是一个二维数组,来按方向改变相邻的位置

下面这个是2048的游戏,跟上面差不多,就是要相邻的加在一起,然后去掉空格的(值为0),看看吧,欢迎拍砖

import java.io.IOException;
import java.util.*;

/**
 * Java 控制台 开发2048
 * @author c
 * 码农秋秋群->21/777/12
 *
 */
public class Game2048 {

	static final int X = 5;
	static final int Y = 6;
	static int model[][] = new int[X][Y];
	static int step = 0;
	static boolean gameover = false;
	static int enumM[] = {2,2,2,2,4,4,4,8};
	static void outPrint(){
		for (int i = 0; i < X; i++) {
			for (int j = 0; j < Y; j++) {
				System.out.print(" [");
				if(model[i][j]==0){
					System.out.print("    ");
				}
				if(model[i][j]>0&&model[i][j]<9){
					System.out.print("  "+model[i][j]+" ");
				}
				if(model[i][j]>9&&model[i][j]<100){
					System.out.print(" "+model[i][j]+" ");
				}
				if(model[i][j]>99&&model[i][j]<1000){
					System.out.print(" "+model[i][j]);
				}
				if(model[i][j]>999){
					System.out.print(model[i][j]);
				}
				System.out.print("]");

				//+(model[i][j] == 0?"  ":model[i][j])+"]");
			}
			System.out.println();
		}
	}

	static void change(int dir){
		switch (dir) {
		case 115://S 下
			int[] xp4 = new int[Y];
			for (int i = 0; i < Y; i++) {
				boolean goon = true;
				while (goon) {
					int[] temp = new int[X];
					int tempIdex = X-1;
					for (int j = X-1; j >=0; j--) {
						if(model[j][i]!=0){
							temp[tempIdex--] = model[j][i];
						}
					}
					boolean hv = false;
					for (int j = X-1; j >0; j--) {
						if(temp[j] == temp[j-1]&&temp[j]!=0){
							temp[j] = temp[j]*2;
							temp[j-1] = 0;
							hv = true;
						}
					}
					goon = hv;
					int is0 = 0;
					for (int j = X-1; j >=0; j--) {
						model[j][i] = temp[j];
						if(temp[j]==0) is0++;
					}
					if(is0>0){
						xp4[i] = 1;//可插牌
					}
				}
			}
			//插牌
			List<Integer> space4 = new ArrayList<Integer>();
			for (int j = 0; j < xp4.length; j++) {
				if(xp4[j]==1){
					space4.add(j);
				}
			}
			if(space4.size()==0){
				gameover = true;
				System.out.println("game over");
				System.exit(0);
			}else{
				int a = (int) (Math.random()*(space4.size()));
				Integer index = space4.get(a);
				for (int j = X-1; j >=0 ; j--) {
					if(model[j][index]==0){
						model[j][index] = enumM[(int) (Math.random()*enumM.length)];
						break;
					}
				}
			}
			outPrint();
			break;
		case 100://D 右
			int[] xp = new int[X];
			for (int i = 0; i < X; i++) {
				boolean goon = true;
				while (goon) {
					int[] temp = new int[Y];
					int tempIdex = Y-1;
					//去空
					for (int j = Y-1; j >=0 ; j--) {
						if(model[i][j]!=0){
							temp[tempIdex--] = model[i][j];
						}
					}
					boolean hv = false;
					//合并
					for (int j = 0; j < Y-1; j++) {
						if(temp[j] == temp[j+1]&&temp[j]!=0){
							temp[j] = temp[j]*2;
							temp[j+1] = 0;
							hv = true;
						}
					}
					goon = hv;
					int is0 = 0;
					for (int j = 0; j < Y; j++) {
						model[i][j] = temp[j];
						if(temp[j]==0) is0++;
					}
					if(is0>0){
						xp[i] = 1;//可插牌
					}
				}
			}
			//插牌
			List<Integer> space = new ArrayList<Integer>();
			for (int j = 0; j < xp.length; j++) {
				if(xp[j]==1){
					space.add(j);
				}
			}
			if(space.size()==0){
				gameover = true;
				System.out.println("game over");
				System.exit(0);
			}else{
				int a = (int) (Math.random()*(space.size()));
				Integer index = space.get(a);
				for (int j = Y-1; j >=0 ; j--) {
					if(model[index][j]==0){
						model[index][j] = enumM[(int) (Math.random()*enumM.length)];
						break;
					}
				}
			}
			outPrint();
			break;
		case 119://W 上
			int[] xp3 = new int[Y];
			for (int i = 0; i < Y; i++) {
				boolean goon = true;
				while (goon) {
					int[] temp = new int[X];
					int tempIdex = 0;
					for (int j = 0; j < X; j++) {
						if(model[j][i]!=0){
							temp[tempIdex++] = model[j][i];
						}
					}
					boolean hv = false;
					for (int j = 0; j < X-1; j++) {
						if(temp[j] == temp[j+1]&&temp[j]!=0){
							temp[j] = temp[j]*2;
							temp[j+1] = 0;
							hv = true;
						}
					}
					goon = hv;
					int is0 = 0;
					for (int j = 0; j < X; j++) {
						model[j][i] = temp[j];
						if(temp[j]==0) is0++;
					}
					if(is0>0){
						xp3[i] = 1;//可插牌
					}
				}
			}
			//插牌
			List<Integer> space3 = new ArrayList<Integer>();
			for (int j = 0; j < xp3.length; j++) {
				if(xp3[j]==1){
					space3.add(j);
				}
			}
			if(space3.size()==0){
				gameover = true;
				System.out.println("game over");
				System.exit(0);
			}else{
				int a = (int) (Math.random()*(space3.size()));
				Integer index = space3.get(a);
				for (int j = 0; j < X ; j++) {
					if(model[j][index]==0){
						model[j][index] = enumM[(int) (Math.random()*enumM.length)];
						break;
					}
				}
			}
			outPrint();
			break;
		case 97://A 左
			int[] xp2 = new int[X];
			for (int i = 0; i < X; i++) {
				boolean goon = true;
				while (goon) {
					int[] temp = new int[Y];
					int tempIdex = 0;
					for (int j = 0; j < Y ; j++) {
						if(model[i][j]!=0){
							temp[tempIdex++] = model[i][j];
						}
					}
					boolean hv = false;
					for (int j = 0; j < Y-1; j++) {
						if(temp[j] == temp[j+1]&&temp[j]!=0){
							temp[j] = temp[j]*2;
							temp[j+1] = 0;
							hv = true;
						}
					}
					goon = hv;
					int is0 = 0;
					for (int j = 0; j < Y; j++) {
						model[i][j] = temp[j];
						if(temp[j]==0) is0++;
					}
					if(is0>0){
						xp2[i] = 1;//可插牌
					}
				}
			}

			//插牌
			List<Integer> space2 = new ArrayList<Integer>();
			for (int j = 0; j < xp2.length; j++) {
				if(xp2[j]==1){
					space2.add(j);
				}
			}
			if(space2.size()==0){
				gameover = true;
				System.out.println("game over");
				System.exit(0);
			}else{
				int a = (int) (Math.random()*(space2.size()));
				Integer index = space2.get(a);
				for (int j = 0; j <Y ; j++) {
					if(model[index][j]==0){
						model[index][j] = enumM[(int) (Math.random()*enumM.length)];
						break;
					}
				}
			}
			outPrint();
			break;
		default:
			break;
		}
	}

	public static void main(String[] args) throws IOException {

		int randomX, randomY;
		randomX = (int) (Math.random()*X);
		randomY = (int) (Math.random()*model[randomX].length);
		model[randomX][randomY] = 2;

		randomX = (int) (Math.random()*X);
		randomY = (int) (Math.random()*model[randomX].length);
		model[randomX][randomY] = 2;

		randomX = (int) (Math.random()*X);
		randomY = (int) (Math.random()*model[randomX].length);
		model[randomX][randomY] = 4;
		randomX = (int) (Math.random()*X);
		randomY = (int) (Math.random()*model[randomX].length);
		model[randomX][randomY] = 8;

		outPrint();
		while(!gameover){
			int read = System.in.read();
			change(read);
		}
	}
}

有兴趣的可以重构下,有些方法应该是可以抽出来公用的

时间: 2024-09-29 03:36:43

如何用Java控制台玩2048的相关文章

如何用Java控制台玩2048【分享】

昨天晚上咸的,想自己做个2048试试,折腾到半夜算是有点成果,分享下,由于搞的太晚也没来得及加注释,最后也没有优化重构,就简单看下思路吧 先看个拼图的小游戏消化下 代码地址:点击打开 更多 java,java学习,java面试题 http://techfoxbbs.com

如何用java编程在控制台输出当前时间

如何用java编程在控制台输出当前时间 package com.chimp4.p155; import java.text.SimpleDateFormat; import java.util.Date; public class Account { /** * 日期格式化 * @author young * */ public static void main(String[] args) { // 在构造器中传入日期样式 // SimpleDateFormat sdf=new SimpleD

如何用Java代码来把SSL的证书自动导入到Java的秘钥存储文件(keystore)

我们在开发或者使用SSL的过程中,很多的软件需要我们提供java的keystore,特别是一些基于Java的中间件产品. 我们常规的做法是JDK自带的工具命令(keytool)去做,比如,下面的例子 keytool -import -v -alias EnTrust2048 -file D:\certs\EnTrust2048.cer -keystore D:\certs\test.jks keytool -import -v -alias EntrustCertificationAuthori

如何用java获得字符串的ASCII值

使用Integer.valueOf就可以直接将char类型的数据转为十进制数据表现形式. int value=Integer.valueOf('1');//49int value=Integer.valueOf('a');//97 如下所示: ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符.标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9.标点符号, 以及在美式英语中使用的特殊控制字符.其中: 0-31及1

Java 控制台执行带自定义包定义的类,出现“Exception in thread &quot;main&quot; java.lang.NoClassDefFoundError: ConnectSQLServer (wrong name: sine/ConnectSQLServer)”

1.先说明一下代码实现:自定义package sine, 源代码保存路径为:E:\JSP\HibernateDemo\HibernateDemoProject\src\sine\ConnectSQLServer.java 1 package sine; 2 import java.sql.*; 3 4 public class ConnectSQLServer { 5 6 public static void main(String args[]){ 7 String url="jdbc:sql

java控制台说明

java 控制台 java 控制台 c: 清除控制台窗口 f: 终结在结束队列上的对象 g: 垃圾收集 h: 显示此帮助消息 l: 转储类加载器列表 m: 打印内存使用情况 o: 触发日志记录 q: 隐藏控制台 r: 重新加载策略配置 s: 转储系统和部署属性 t: 转储线程列表 v: 转储线程堆栈 x: 清除类加载器高速缓存 0-5: 设置跟踪级别为<n>

java控制台输入Scanner、InputStreamReader、Console说明

java控制台输入 (2009-12-08 11:13:28) 转载▼ 标签: 杂谈 分类: corejava 0 引言从控制台中读取数据是一个比较常用的功能,在 JDK 5.0 以前的版本中的实现是比较复杂的,需要手工处理系统的输入流.有意思的是,从 JDK 5.0 版本开始,能从控制台中输入数据的方法每增加一个版本号,就有一种新增的方法,这也增加了选择的种类,可以依据不同的要求来进行选择.下面来看一下,各个版本中如何从控制台中读取数据以及各自的优缺点. 1 JDK 1.4 及以下版本读取的方

还有多少人在玩2048现在都4096了

<2048>是比较流行的一款数字游戏.原版2048首先在github上发布,原作者是Gabriele Cirulli.它是基于<1024>和<小3传奇>的玩法开发而成的新型数字游戏[1] .随后2048便出现各种版本,走各大平台.由Ketchapp公司移植到IOS的版本最为火热,现在约有1000万下载,其名字跟原版一模一样.衍生版中最出名的是<2048六边形>版本, 先后在全球81个国家中的board game中排进了前200. 安卓版非常火爆的有<挑

Java 控制台输入数字 输出乘法表(代码练习)

最近,回忆了一些刚学习Java时经常练习的一些小练习题.感觉还是蛮有趣的,在回顾时想起好多学习时的经历和坎坷,一道小小的练习题要研究半天,珍重过往,直面未来.下面贡献代码,Java 控制台输入数字 输出乘法表(代码练习).希望能给一些初学者一点点的启发.注释写的比较啰嗦,嘻嘻~ 因为博客园有要求"少于150字的随笔不允许发布到首页候选区",所以,凑几行字啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 //作者:我 //功能:九九乘法表 //时间: