国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android數(shù)字華容道小游戲開發(fā)

2019-12-12 01:17:19
字體:
供稿:網(wǎng)友

目的

上周新一期的最強大腦出來了,雖然上季被稱為最強黑幕,不過呢。我決定還是看看= =。它里面第一關(guān)是叫做數(shù)字華容道。說白了,就是和拼圖差不多。一開始我準(zhǔn)備下一個玩玩的。結(jié)果沒搜到。所以決定寫了一個。最后效果差不多是這樣:

這里寫圖片描述

思路以及實現(xiàn)

首先,我們應(yīng)該考慮如何去實現(xiàn)這個效果。細(xì)想一下,其實和之前的2048有點像,但是又不是完全一直。于是,便又折騰了一波。這次布局和內(nèi)容項參考之前2048的,下面放上代碼:

自定義一個frame layout,我們先繪制里面的數(shù)字:

 private void initial() {  label = new TextView(getContext());  label.setTextSize(32);  label.setBackgroundColor(0x33ff0033);  label.setTextColor(0x330D0D0D);  label.setGravity(Gravity.CENTER);  LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  lp.setMargins(10, 10, 0, 0);  addView(label, lp);  setNum(0); } public int getNum() {  return num; } @SuppressLint("SetTextI18n") public void setNum(int num) {  this.num = num;  if (num <= 0) {   label.setText("");  } else {   label.setText(num + "");  } }

我們可以看到上面的數(shù)字在3x3中,我們顯示1-8。不過通過代碼我們可以知道,其實我們是去生成0-8,然后把0的那塊內(nèi)容設(shè)為空。

那么我們在想一下,是滑動移動還是點擊移動。以現(xiàn)在體驗的角度,滑動移動會更方便一點。所以我們需要監(jiān)聽它的滑動事件:

setOnTouchListener(new View.OnTouchListener() { private float startX, startY, changeX, changeY;  @SuppressLint("ClickableViewAccessibility")  @Override  public boolean onTouch(View v, MotionEvent event) {  switch (event.getAction()) {   case MotionEvent.ACTION_DOWN:    startX = event.getX();    startY = event.getY();    break;     case MotionEvent.ACTION_UP:      // 改變的X坐標(biāo)=現(xiàn)在的-起始的     changeX = event.getX() - startX;      // 改變的Y坐標(biāo)=現(xiàn)在的-起始的     changeY = event.getY() - startY;      // 若X的絕對值>Y的絕對值,則是左右移動,否則為上下移動,左上角坐標(biāo)為(0,0)      if (Math.abs(changeX) > Math.abs(changeY)) {       if (changeX < -PADDING) {       left();       } else if (changeX > PADDING) {       right();      }      } else {      if (changeY < -PADDING) {       up();      } else if (changeY > PADDING) {       down();     }      }     break;    default:   }  return true;  } });

但是我們需要在滑動之前先生成所有的隨機數(shù)。也就是1-N生成N個隨機數(shù)。

public int[] randomCommon(int max, int n) {   if (n > (max + 1) || max < 0) {    return null;   }   int[] result = new int[n];   int count = 0;   while (count < n) {    int num = (int) (Math.random() * max) + 1;    boolean flag = true;    for (int j = 0; j < n; j++) {     if (num == result[j]) {      flag = false;      break;     }    }    if (flag) {     result[count] = num;     count++;    }   }   return result;  }

數(shù)字生成完成之后,我們需要把數(shù)據(jù)放入之前寫的Card并且add到現(xiàn)在的GridLayout中。

 private void addCard(int cardWidth, int cardHeight) {  Card card;  int sum = 0;  for (int x = 0; x < addNumber; x++) {   for (int y = 0; y < addNumber; y++) {    card = new Card(getContext());    card.setNum(number[sum] - 1);    addView(card, cardWidth, cardHeight);    point[x][y] = card;    sum++;   } } }

數(shù)據(jù)生成了,內(nèi)容也顯示了,接下來我們需要做的就是對方向的邏輯處理。這邊我放一個,其他的同理:

 for (int x = 0; x < addNumber; x++) { for (int y = 0; y < addNumber; y++) {  if (x - 1 >= 0) {   if (point[x - 1][y].getNum() == 0) {   point[x - 1][y].setNum(point[x][y].getNum());   point[x][y].setNum(0);    isFinish();   return;   }  }  }}

如果有人看過之前的2048會發(fā)現(xiàn)這邊的判斷更簡單一些,然后我們每次滑動結(jié)束,我們需要判斷游戲是否結(jié)束。如果游戲結(jié)束就給它一個提示,是重新來過還是直接下一關(guān):

int number = 1;  for (int x = 0; x < addNumber; x++) {  for (int y = 0; y < addNumber; y++) {    if (number == addNumber * addNumber) {    MainActivity.getMainActivity().stop();     new AlertDialog.Builder(getContext())     .setTitle("游戲結(jié)束!")     .setMessage("您的時間是:" + MainActivity.getMainActivity().getTimer())     .setPositiveButton("重來",       new DialogInterface.OnClickListener() {        public void onClick(DialogInterface dialog,            int which) {        MainActivity.getMainActivity().clear();          start();         }       })    .setNegativeButton("下一關(guān)",      new DialogInterface.OnClickListener() {        public void onClick(DialogInterface dialog,           int which) {        MainActivity.getMainActivity().clear();           addNumber();         }       }).show();      return;     }     if (point[x][y].getNum() == number) {      number++;     }    }}

這樣基本所有的邏輯就寫完了。具體代碼我已經(jīng)上傳到github中:https://github.com/sw950729/NumKlotski

最后

我也試著去玩一玩,里面我也寫了計時,我記得我3x3最好成績是42秒,4x4最好成績是一分四十。大家可以試一下。你最好能玩到多少。里面我也做了上下限的判斷,最低三階,最高八階。你們可以試試看能不能通關(guān)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 临城县| 库车县| 山东| 莆田市| 灌云县| 潍坊市| 砀山县| 宁南县| 林周县| 兴山县| 云龙县| 衡南县| 平乐县| 来安县| 克山县| 曲松县| 长白| 伊春市| 轮台县| 廊坊市| 金乡县| 宁强县| 芦山县| 丹寨县| 临潭县| 改则县| 上林县| 清新县| 南溪县| 苍山县| 霍邱县| 阿坝县| 红原县| 南皮县| 阳新县| 温宿县| 仁怀市| 吉安市| 永新县| 且末县| 青铜峡市|