zoukankan      html  css  js  c++  java
  • 《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();
                               
                       }
             }

  • 相关阅读:
    高格-一些特点话题【10】批次批号管理
    study Rust-4【所有权】这个太重要了!
    study Rust-3【表达式和函数】
    study Rust-2【环境与配置,随机数】
    unigui的错误delphi clientHeight:property clientheight does not exist【10】
    shr系统进入用户管理
    节点设置必录注意事项
    单据头字段设置必录
    插件强制设置单据体字段必录
    object转换为List<DynamicObject>
  • 原文地址:https://www.cnblogs.com/lemonhome/p/4492632.html
Copyright © 2011-2022 走看看