`
xlcai
  • 浏览: 19748 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何用Java控制台玩2048

    博客分类:
  • Java
阅读更多

昨天晚上咸的,想自己做个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);
		}
	}
}

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

分享到:
评论

相关推荐

    java控制台接收源代码

    ### Java控制台接收源代码详解 #### 一、引言 在Java开发中,通过控制台接收用户输入是非常常见的操作之一。例如,在命令行界面环境下,我们常常需要从用户那里获取一些必要的信息来完成特定的功能或者计算。本文...

    java控制台应用小程序

    最后,随着技术的发展,Java控制台应用虽然在日常开发中使用较少,但它们仍然是学习Java编程的基石,帮助开发者建立坚实的编程基础,为进一步学习更复杂的Java应用和框架铺平道路。通过不断地实践和练习,你将能够...

    java控制台生成表格

    java控制台生成表格开发中有一个需求:某个业务查询出一个表格,然后返回给前端一个控制台样式的表格,以模拟控制台输出。但是没有使用过类似的工具类,google了很久也没有找到满意的答案,因为大部分都是简单的打印...

    Java项目:控制台商城系统(java+打印控制台)

    在本项目中,我们关注的是一个基于Java编程语言构建的控制台商城系统。这个系统的主要目的是在命令行界面(控制台)中模拟一个简单的商城环境,实现基础的商业操作,如管理客户信息、商品信息以及购物信息。让我们...

    java控制台小程序

    "java控制台小程序"这个项目显然旨在利用Java语言开发一款可以在命令行界面运行的游戏,让玩家通过打怪、提升等级和获取装备来体验游戏乐趣。通过这种方式,开发者可以锻炼到面向对象编程、数据结构、算法以及游戏...

    java控制台版笔记本

    Java控制台版笔记本是一种利用Java编程语言开发的简单文本处理工具,主要在命令行界面运行。这个项目可能是一个为了教学、学习或者轻量级笔记管理而设计的小型应用程序。通过控制台,用户可以进行基本的文字输入、...

    java控制台扫雷源码

    Java控制台扫雷游戏是一款基于文本界面的经典小游戏,它的实现主要涉及到Java编程语言的基本语法、控制结构、数组操作以及简单的算法应用。以下是关于这个项目的详细知识点解析: 1. **Java基础知识**: - **类与...

    JAVA 获得控制台的输出信息

    在Java编程语言中,捕获控制台的输出信息是一个常见的需求,尤其是在进行单元测试或调试时,需要收集程序运行过程中的标准输出以便于分析。在提供的代码片段中,展示了一种通过重定向`System.out`流来实现这一目标的...

    java控制台的超市管理系统

    本系统——"java控制台的超市管理系统",是用Java语言实现的一个基础应用,它通过控制台交互来完成超市的日常管理任务。这个项目特别适合初学者,尤其是对Java条件语句和循环语句感兴趣的开发者,因为它充分展示了...

    java控制台小程序.rar

    Java控制台小程序是一种基于Java编程语言开发的命令行应用程序,它们不依赖于图形用户界面(GUI),而是通过标准输入(键盘)接收用户指令,并通过标准输出(显示器)展示结果。这些程序通常用于教学、测试或者在不...

    java控制台 银行管理系统

    《Java控制台银行管理系统》是面向初学者的一款教学项目,旨在帮助新手快速掌握Java编程基础,特别是控制台应用开发及属性文件的应用。该系统通过简单的命令行交互模拟银行的日常业务,如存款、取款、查询余额等,为...

    java控制台输出可执行sql,支持oracle,mysql,sqlserver,kingbas

    标题中的"java控制台输出可执行sql"指出这是一个Java库,它的主要功能是能够在控制台上显示应用程序执行的SQL语句。这通常对于调试和优化数据库交互的代码非常有用,因为可以直观地看到程序如何与数据库进行通信。这...

    Java控制台项目V.编程资料

    本项目旨在使用Java控制台开发一个简单的小型银行管理系统。该系统包括两个主要功能部分:管理员功能和顾客功能。通过Java控制台应用程序实现这些功能,不仅能够帮助理解基本的Java编程概念,还能够学习如何使用...

    java控制台图书售卖

    在本项目中,"java控制台图书售卖"是一个基于Java编程语言开发的简易图书售卖系统。这个系统通过控制台交互,模拟了管理员和用户(包括买方和卖方)的操作流程,提供了图书信息的查看、购买以及管理功能。以下是该...

    几个比较好的java控制台程序

    在给定的“几个比较好的java控制台程序”中,我们可以深入探讨几个使用Java编写的控制台应用程序,包括酒店管理系统、学生成绩管理和游戏开发。 1. **酒店管理系统**: 酒店管理系统通常涉及预订、入住、退房等...

    java控制台购物系统

    【Java控制台购物系统】是一个基于Java SE(标准版)开发的简单购物应用程序,它提供了一个基础的模拟购物环境,适合初学者理解面向对象编程、数据结构和算法在实际问题中的应用。在这个系统中,用户可以通过命令行...

    双色球java控制台.zip_java怎么在控制台输入

    1. **Java控制台输入**: 在Java中,我们通常使用`System.in`对象来获取控制台输入。通过`Scanner`类,我们可以方便地读取用户从键盘输入的数据。例如: ```java Scanner scanner = new Scanner(System.in); ...

    java 控制台 21点小游戏

    Java控制台21点小游戏是一款基于Java编程语言开发的简单桌面游戏,通常称为“Blackjack”。这款游戏在控制台环境中运行,玩家与计算机(庄家)进行对战,目标是尽可能接近21点,但不能超过,否则将爆牌并输掉游戏。 ...

    java控制台5子棋游戏

    仿五子棋java控制台5子棋游戏,java控制台5子棋游戏

    java中让控制台输出彩色字符的方法

    然而,通过引入特定的库,我们可以实现Java控制台输出彩色字符的功能。本篇文章将详细讲解如何利用"jansi"库实现这一目标。 "jansi"是一个Java库,它提供了在各种操作系统(如Windows、Linux、Mac OS X)上生成ANSI...

Global site tag (gtag.js) - Google Analytics