用Java实现的2048(没UI)
来源:互联网 发布:自建淘宝客网站模板 编辑:程序博客网 时间:2024/06/05 11:55
设计思路:
用0,1,2,3表示事件向左,右,上,下;然后是判断游戏结束标志:
- 游戏出现2048时,赢得游戏而退出;
- 游戏画板满了,并且左右上下移动都不能再合并任何元素时,那么游戏已经进入了死胡同不可能再有解,所以判断输了而结束游戏;
游戏实现:
用二维数组来储存游戏画板;
1.每次捕捉事件前,先将每个元素向指定的方向移动,
将他们之间空白的元素去掉,
2.然后按照他们时间的方向的的反方向去没两个相邻的元素比较,如果相同就相加复制给前一个元素,后一个元素置零(表示空白);
3.重复1;
下面是代码,有注释,大家可以看看,欢迎拍砖;
代码工程已发布在https://github.com/BrightenYim/2048inJava
欢迎大家拍砖:
package brighten.demo;/* * @author BrightenYim 2015.4.12 * @mailto brightenyim@qq.com */import java.util.Random;import java.util.Scanner;public class Game2048 { public final static int n=4; int[][] array = new int[n][n]; void initial(){//初始化这个数组 开始时初始化 for(int p = 0;p < 4;p++)//默认 0?是否需要初始化 for(int q =0;q < 4;q++){ array[p][q] = 0; } Random random = new Random(); int j =random.nextInt(4); int k = random.nextInt(4); array[j][k] = 2; } void again(){//合并事件后 随机生成2 Random random = new Random(); while(true){ int j = random.nextInt(4); int k = random.nextInt(4); if(array[j][k] == 0){ array[j][k] = 2;break; } else { continue; } } } void display(){//显示数组 for(int i = 0;i < 4;i++) for(int j = 0;j < 4 ;j++){ if(j==3){ System.out.println(array[i][j]); } else { System.out.printf("%d ",array[i][j]); } } } /*void swap(int i, int j){//交换 //caution 形参 int temp; temp = i; i = j; j = temp; }*/ //remov 下面的函数时消去数值间的0数值 void up_remove_blank(){ //上面的那个为空 交换 靠上集合 int i,j,k; for(j=0;j<4;j++){ for(i=1;i<4;i++){ k=i; while(k-1>=0&&array[k-1][j]==0){ // swap(array[k][j],array[k-1][j]); int temp; temp = array[k][j];array[k][j] =array[k-1][j];array[k-1][j] =temp; k--; } } } } void down_remove_blank(){ //下面的那个为空 交换 靠下集合 int i,j,k; for(j=0;j<4;j++){ for(i=2;i>=0;i--){ k=i; while(k+1<=3&&array[k+1][j]==0){ //swap(array[k][j],array[k+1][j]); int temp; temp=array[k][j]; array[k][j] = array[k+1][j]; array[k+1][j] = temp; k++; } } } } void left_remove_blank(){ //左面的那个为空 交换 靠左集合 int i,j,k; for(i=0;i<4;i++){ for(j=1;j<4;j++){ k=j; while(k-1>=0&&array[i][k-1]==0){ //swap(array[i][k],array[i][k-1]); int temp = array[i][k]; array[i][k] =array[i][k-1]; array[i][k-1] = temp; k--; } } } } void right_remove_blank(){ //右面的那个为空 交换 靠右集合 int i,j,k; for(i=0;i<4;i++){ for(j=2;j>=0;j--){ k=j; while(k+1<=3&&array[i][k+1]==0){ // swap(array[i][k],array[i][k+1]); int temp =array[i][k]; array[i][k] =array[i][k+1]; array[i][k+1] =temp; k++; } } } } //事件 void toLeft(){ left_remove_blank(); int i,j; for(i=0;i<4;i++){ //每一行 for(j=0;j<3;j++){ if(array[i][j]==array[i][j+1]){ array[i][j]+=array[i][j+1]; array[i][j+1]=0; left_remove_blank(); } } } // left_remove_blank(); } void toRight(){ right_remove_blank(); int i,j; for(i=0;i<4;i++){ for(j=3;j>=1;j--){ if(array[i][j]==array[i][j-1]){ array[i][j]+=array[i][j-1]; array[i][j-1]=0; right_remove_blank(); } } } // right_remove_blank(); } void toUp(){ up_remove_blank(); int i,j; for(j=0;j<4;j++){//每一列 for(i=0;i<3;i++){ if(array[i][j]==array[i+1][j]){ array[i][j]=array[i][j]+array[i+1][j]; array[i+1][j]=0; up_remove_blank(); } } } } void toDown(){ down_remove_blank(); int i,j; for(j=0;j<4;j++){ for(i=3;i>=1;i--){ if(array[i][j]==array[i-1][j]){ array[i][j]=array[i][j]+array[i-1][j]; array[i-1][j]=0; down_remove_blank(); } } } }//下面是游戏结束判断 //Dead如过数组满了 并且 左右都不能合并 那么游戏结束 //win 如过出先2048 那么赢了游戏 boolean isFull(){//数组满了 boolean T =true; for(int i =0;i<4;i++) for(int j=0;j<4;j++){ if(array[i][j] == 0){ T =false;break; } } return T; } boolean nearEquals(){//相邻没有相等的 int i , j; boolean T=false; for(i =0;i<=2;i++)//上下比 for(j=0;j<4;j++){ if(array[i][j] == array[i+1][j]){ T=true;break; } } for(i =0;i<4;i++)//左右比 for(j=0;j<=2;j++){ if(array[i][j] == array[i][j+1]){ T =true;break; } } return T; } boolean dead(){//如果数组满了&& 相邻没有相等的 那么这个数组已经无法操作 boolean T =false; if(isFull()==true&&nearEquals()==false){ T =true; } return T; } boolean getWin(){//Judge 是否 赢了 boolean T =false; for(int j =0;j<4;j++) for(int k=0;k<4;k++){ if(array[j][k] == 2048){ T = true; return T; } } return T; } public static void main(String arg[]){ Game2048 game = new Game2048(); Scanner input = new Scanner(System.in); game.initial(); game.display(); System.out.println("输入数字来表示你想进行的操作:\n" + "0表示向左滑动\n" + "1表示向右滑动\n" + "2表示向上滑动\n" + "3表示向下滑动"); while(true){ if(game.getWin() == true){//注意和dead的判断顺序 System.out.println("2048!You Win!"); input.close(); break; } if(game.dead() ==true){ System.out.println("Game Over!"); input.close(); break; } int i =input.nextInt(); if(i == 0){ //game.left_remove_blank(); game.toLeft(); if(game.isFull() ==false){//fun时不能再加入2 否者会死循环 game.again();} game.display(); } else if(i == 1){ game.toRight(); if(game.isFull() ==false){ game.again();} game.display(); } else if(i == 2){ game.toUp(); if(game.isFull() ==false){ game.again();} game.display(); } else if(i ==3){ game.toDown(); if(game.isFull() ==false){ game.again();} game.display(); } else{ System.out.println("请输入0-3的数字来表示方向,重新输入吧-_-"); continue ; } } }}
0 0
- 用Java实现的2048(没UI)
- Java小程序之客户端的UI实现以及客户端与服务器的UI交互(山寨QQ进行中......)
- GEM5中模拟的系统调用(部分没实现)
- block没那么难(一):block的实现
- block没那么难(一):block的实现
- block没那么难(一):block的实现
- 实现了UI的简单群聊(java的IO流和多线程,网络通信)
- java swing 自定义UI的实现方式的几个资源
- ddms 的data文件夹没东西?(怕不是没打开哦) 此为针对Android studio实现,应该也可以用在某过气IDE上
- 文件读写工具简单实现(一)之java的UI界面可视化画图/制作
- Java项目之星际争霸1简单仿制(二)UI的实现
- Java实现排序和类型选择的UI界面
- 一个简单的Web UI自动化测试框架Java实现
- Java小程序之服务器的UI实现
- 要实现的UI
- 画板UI的实现
- 纯Java代码实现UI
- Activity里面的UI模板自定义属性,更好的复用TextView,由于在网上没找到类似,记录下来。
- UVa818 - Cutting Chains
- Android 监听WIFI
- 【排序】快速排序模板
- OpenStack源码系列---nova-compute
- 分布式系统中的RPC请求经常出现乱序的情况 写一个算法来将一个乱序的序列保序输出
- 用Java实现的2048(没UI)
- HTTP协议
- RFID第七章作业——物联网1122-08黄炜彬
- 【排序】插入排序模板
- 增大JVM的内存
- 动态规划
- 关闭UIScrollView的自动适应控制器布局
- android中挂断电话的写法
- hdu 1147 Pick-up sticks(线段相交+枚举)