用as写2048游戏
生活随笔
收集整理的這篇文章主要介紹了
用as写2048游戏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本篇文章用到了GesTureDetector,TextView,
1024是一款前段時間比較火的游戲。在游戲中你要通過左右上下移動方塊,等值方塊會在碰撞中合并,游戲目標盡可能得到更大的數值。
1. ui設計 2. 代碼實現首先我們要設計一個ui。
筆者采用的是TextView,因為它可以方便的得到和設置面值。我采用的4*4,這里就不貼ui代碼了
其次代碼實現。
我們可以用GestureDetector判斷用戶是上下,左右滑動。
筆者設定了一個工具類meach用來管理每個方塊的,一個meach示例對應一個TextView。筆者有個想法或許可以讓meach繼承TextView,并重寫,應該可以方便一點。
設定隨機數,在用戶每次滑動后要隨機給棋盤上生成一個方塊,
/*** 設定隨機數,當界面無空位時返回原數組* @return meach[][] 返回對象數值*/public static meach[][] setnewnumber() {Random r = new Random();//!!!判斷若棋盤上無位置for(int i=0;i<=3;i++){for(int j=0;j<=3;j++){if(e[i][j].getstate()==false){i=4;break;}else if( i==3 && j==3){//處理棋盤上無位置,返回原數組不設定return e;}}}//設置隨機數do{i = r.nextInt(4);j = r.nextInt(4);}while (e[i][j].getstate());e[i][j].settate(true);e[i][j].setNumber(2);return e;}更新TextView的值
/*** 函數用于設定新View*/public static boolean setnewview(TextView[][] tv) {for(int i=0;i<=3;i++){for(int j=0;j<=3;j++){if(e[i][j].getstate())tv[i][j].setText(e[i][j].getNumber()+"");else{tv[i][j].setText(" ");}}}return true;}算法實現,當用戶滑動時我們要分別遍歷行或列,讀取有數值的方塊,將其移動至滑動方向,若有相鄰兩TextView的text相同則合并。
@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {float x=e1.getX()-e2.getX();float y=e1.getY()-e2.getY();float x1=Math.abs(x);float y1=Math.abs(y);//向右劃if( x1>y1 && x<0){/*** meaches[] 為一行或一列中state為true的meach對象* sub 為meaches[]的當前下標* sube 為應將meachs[]中的對象應移動至的下標*/meach meaches[];int sub;//從第一行開始遍歷for(int n=0;n<=3;n++){//重置sub=0;//從右往左開始遍歷,得出一行中的含有State為true的下標存入numbers數組;meaches =new meach[4];for(int m=3;m>=0;m--) {if (e[n][m].getstate()==true){meaches[sub] = e[n][m];sub++;}}//合并并移動if(sub==1){e[n][3].setNumber(meaches[0].getNumber());meaches[0].settate(false);e[n][3].settate(true);}int sube=3;for(int i=0;i<sub-1;i++){if(meaches[i].getstate()&& meaches[i].getNumber() == meaches[i+1].getNumber() ){e[n][sube].setNumber( meaches[i].getNumber() *2);meaches[i].settate(false);meaches[i+1].settate(false);e[n][sube].settate(true);sube--;}else if(i==sub-2) {if (meaches[i].getstate()) {e[n][sube].setNumber(meaches[i].getNumber());e[n][sube-1].setNumber(meaches[i + 1].getNumber());meaches[i].settate(false);meaches[i+1].settate(false);e[n][sube].settate(true);e[n][sube-1].settate(true);}else{e[n][sube].setNumber(meaches[i+1].getNumber());meaches[i+1].settate(false);e[n][sube].settate(true);}}else if(meaches[i].getstate()) {e[n][sube].setNumber(meaches[i].getNumber());meaches[i].settate(false);e[n][sube].settate(true);sube--;}}}//顯示Viewsetnewnumber();setnewview(tv);} }其他方向的判斷同理。
玩家應可以選擇重開以結束本局,并開始下一局
注意:
//activiy層面的點擊監(jiān)聽器,將事件監(jiān)聽交給gesture監(jiān)聽器@Overridepublic boolean onTouchEvent(MotionEvent event) {return detector.onTouchEvent(event);}這里將事件監(jiān)聽傳遞給了Gesture,Gesture的方法才能夠實行,否則執(zhí)行只onTouchEvent。
這里是筆者寫的小demo在其中也完善了一些小細節(jié),但還是有很多游戲應該有的內容沒有設計完成,后續(xù)有時間應該會更新。
102game
總結
以上是生活随笔為你收集整理的用as写2048游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GET /static/js/jquer
- 下一篇: 从头开始设计我的网游