《2048》开发4——继续编辑GameView类,实现游戏逻辑
在GameView中新建方法动态改变卡片的宽高,适应所有屏幕。
@Override protectedvoid onSizeChanged(int w, int h, int oldw, int oldh) { //TODO Auto-generated method stub super.onSizeChanged(w,h, oldw, oldh); //因为游戏的界面是正方形,选取屏幕最小的长或宽作为正方形的边长 //空隙是10,除以4是每一个卡片 intcardWidth = (Math.min(w, h)-10)/4; addCard(cardWidth,cardWidth);//添加卡片的方法,正方形宽高一样 startGame();//当卡片都构建完成之后开始游戏 }
并且在AndroidManifest.XML文件中添加方法使手机屏幕只能竖直放置不能水平放置。
在activity中添加如下代码:
android:screanOrientation=”portrait”
在GameView中新建添加卡片方法。
private Card[][] cardsmap = newCard[4][4];//初始化一个卡片数组,方便操作,记录方阵 private void addCard(int cardWidth,intcardHeight){ Cardc; for(int y = 0; y <4; y++) { for(int x = 0; x < 4; x++) { c=newCard(getContext()); c.setNum(0);//初始化添加0 addView(c,cardHeight,cardWidth); cardsmap[x][y]=c;//将遍历的数组赋值,存储 } } }
在GameView中新建开始游戏方法
public void startGame(){ MainActivity.getMainActivity().clearScore();//首先先清除所有的数据 for(int y = 0; y < 4; y++) { for(int x = 0; x < 4; x++) { cardsmap[x][y].setNum(0);//先将所有的卡片赋值为0,0表示的是空字符串 } } addRandomNum();//添加随机数,因为游戏初始化有两个卡片有值,所以调用两次 addRandomNum(); }
在GameView中新建随机数方法。
private List<Point> emptyPoints=newArrayList<Point>();//定义空点的集合 private void addRandomNum(){ emptyPoints.clear();//先将集合清空 //先对所有值进行遍历 for(int y = 0; y < 4; y++) { for(int x = 0; x < 4; x++) { //如果卡片的值是空值,才能赋值 if(cardsmap[x][y].getNum()<=0) { emptyPoints.add(newPoint(x,y)); } } } //选择一个点,随机移除点 Pointp=emptyPoints.remove((int)(Math.random()*emptyPoints.size())); //符合的赋值为2否则为4,两者的概论为9:1 cardsmap[p.x][p.y].setNum(Math.random()>0?2:4); }
数组和集合的区别:
http://www.cnblogs.com/summers/p/4094260.html
http://cping1982.blog.51cto.com/601635/130062/
在GameView中新建滑动方法,此处以向左滑动为例
private void swipeLeft(){ for(int y = 0; y < 4; y++) { for(int x = 0; x < 4; x++) { //从右向左遍历 for(int x1 = x+1; x1 < 4; x1++) { //当遍历的卡片不为空时 if(cardsmap[x1][y].getNum()>0) { //当左边的卡片为0时要向左边移动,然后将右边的值赋给左边,右边的值清零 if(cardsmap[x][y].getNum()<=0) { cardsmap[x][y].setNum(cardsmap[x1][y].getNum()); cardsmap[x1][y].setNum(0); x--;//遍历所有的情况,继续移动,使所有的能移动的都移动 morge=true;//有动作 }//如果两个卡片的值相等,则左边的值*2,然后右边的值赋零 elseif (cardsmap[x1][y].equals(cardsmap[x][y])) { cardsmap[x][y].setNum(cardsmap[x][y].getNum()*2); cardsmap[x1][y].setNum(0); MainActivity.getMainActivity().addScore(cardsmap[x][y].getNum());//合并添加分数 morge=true; } break;//循环遍历之后要跳出 } } } } //如果有动作的话,则新增一个卡片 if(morge) { addRandomNum(); chackComplete();//判断是否结束 } }
向右滑动。
private void swipeLeft(){ for(int y = 0; y < 4; y++) { for(int x = 0; x < 4; x++) { //从右向左遍历 for(int x1 = x+1; x1 < 4; x1++) { //当遍历的卡片不为空时 if(cardsmap[x1][y].getNum()>0) { //当左边的卡片为0时要向左边移动,然后将右边的值赋给左边,右边的值清零 if(cardsmap[x][y].getNum()<=0) { cardsmap[x][y].setNum(cardsmap[x1][y].getNum()); cardsmap[x1][y].setNum(0); x--;//遍历所有的情况,继续移动,使所有的能移动的都移动 morge=true;//有动作 }//如果两个卡片的值相等,则左边的值*2,然后右边的值赋零 elseif (cardsmap[x1][y].equals(cardsmap[x][y])) { cardsmap[x][y].setNum(cardsmap[x][y].getNum()*2); cardsmap[x1][y].setNum(0); MainActivity.getMainActivity().addScore(cardsmap[x][y].getNum());//合并添加分数 morge=true; } break;//循环遍历之后要跳出 } } } } //如果有动作的话,则新增一个卡片 if(morge) { addRandomNum(); chackComplete();//判断是否结束 } }
新建判断是否结束方法。
private boolean morge=false;//定义判断有动作,默认为false private void chackComplete(){ booleancomplete=true; All: for(int y = 0; y < 4; y++) { for(int x = 0; x < 4; x++) { <span style="white-space:pre"> </span>//判断的标准就是1、有卡片的值是空,2、是上下左右相邻的卡片相同x>0往左判断 x<3往右判断 y>0往下判断 y<0往上判断 if(cardsmap[x][y].getNum()==0|| (x>0)&&(cardsmap[x][y].equals(cardsmap[x-1][y]))|| (x<3)&&(cardsmap[x][y].equals(cardsmap[x+1][y]))|| (y>0)&&(cardsmap[x][y].equals(cardsmap[x][y-1]))|| (y<3)&&(cardsmap[x][y].equals(cardsmap[x][y+1]))){ complete=false; breakAll; } } } if(complete) { newAlertDialog.Builder(getContext()).setTitle("您好").setMessage("游戏结束"). setPositiveButton("重新开始游戏",new DialogInterface.OnClickListener() { @Override publicvoid onClick(DialogInterface dialog, int which) { startGame(); } }).show(); } }