《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();
                           
                   }
         }

posted @ 2015-04-03 13:12  lemonhome  阅读(554)  评论(0编辑  收藏  举报