日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用as写2048游戏

發布時間:2024/3/13 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用as写2048游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本篇文章用到了GesTureDetector,TextView,

1024是一款前段時間比較火的游戲。在游戲中你要通過左右上下移動方塊,等值方塊會在碰撞中合并,游戲目標盡可能得到更大的數值。

1. ui設計 2. 代碼實現

首先我們要設計一個ui。
筆者采用的是TextView,因為它可以方便的得到和設置面值。我采用的4*4,這里就不貼ui代碼了

其次代碼實現。
我們可以用GestureDetector判斷用戶是上下,左右滑動。
筆者設定了一個工具類meach用來管理每個方塊的,一個meach示例對應一個TextView。筆者有個想法或許可以讓meach繼承TextView,并重寫,應該可以方便一點。

/*** meach對象表示游戲中一個單元格與TextView配合使用,* @number number表示方塊的面值* @state state表示方塊是否有值,true則表示存在*/ class meach {private int number;private boolean state;public meach(int number,boolean state){this.number=number;this.state=state;}public void settate(boolean b){this.state=b;}public void setNumber(int n){this.number=n;}public int getNumber(){return number;}public boolean getstate() {return state;} }

設定隨機數,在用戶每次滑動后要隨機給棋盤上生成一個方塊,

/*** 設定隨機數,當界面無空位時返回原數組* @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);} }

其他方向的判斷同理。
玩家應可以選擇重開以結束本局,并開始下一局

btnrm.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//清理棋盤for(int i=0;i<=3;i++){for(int j=0;j<=3;j++){e[i][j].settate(false);}}setnewnumber();setnewview(tv);}});

注意:

//activiy層面的點擊監聽器,將事件監聽交給gesture監聽器@Overridepublic boolean onTouchEvent(MotionEvent event) {return detector.onTouchEvent(event);}

這里將事件監聽傳遞給了Gesture,Gesture的方法才能夠實行,否則執行只onTouchEvent。
這里是筆者寫的小demo在其中也完善了一些小細節,但還是有很多游戲應該有的內容沒有設計完成,后續有時間應該會更新。
102game

總結

以上是生活随笔為你收集整理的用as写2048游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。