码迷,mamicode.com
首页 > 编程语言 > 详细

如何用Java控制台玩2048

时间:2015-04-18 11:34:26      阅读:146      评论:0      收藏:0      [点我收藏+]

标签: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);
		}
	}
}

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

如何用Java控制台玩2048

标签:java   游戏   2048   

原文地址:http://blog.csdn.net/uucai/article/details/45111329

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!