iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android编写2048小游戏
  • 607
分享到

Android编写2048小游戏

小游戏Android 2022-06-06 06:06:09 607人浏览 八月长安
摘要

先来说说2048游戏规则: 开始时棋盘内随机出现两个数字,出现的数字仅可能为2或4 玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动 玩家选择的方向上若

先来说说2048游戏规则:

开始时棋盘内随机出现两个数字,出现的数字仅可能为2或4

玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动

玩家选择的方向上若有相同的数字则合并,每次有效移动可以同时合并,但不可以连续合并

合并所得的所有新生成数字想加即为该步的有效得分

玩家选择的方向行或列前方有空格则出现位移

每有效移动一步,棋盘的空位(无数字处)随机出现一个数字(依然可能为2或4)

棋盘被数字填满,无法进行有效移动,判负,游戏结束

棋盘上出现2048,判胜,游戏结束

下面代码

MainActivity类


public class MainActivity extends AppCompatActivity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(new GameView(this));
 }
}

定义一个卡片类显示数据


/卡片类型
public class Card extends FrameLayout {
 //2
 TextView tv;
 private int number = 0;
 int width;
 public Card(Context context, int width) {
 super(context);
 this.width = width;
 init();
 }
 private void init() {
 tv = new TextView(getContext());
 setPadding(5, 5, 5, 5);
 FrameLayout.LayoutParams lp = new LayoutParams(width - 10, width - 10);
 tv.setLayoutParams(lp);
 tv.setGravity(Gravity.CENTER);
 tv.setTextColor(Color.WHITE);
 tv.setTextSize(48);
 this.addView(tv);
 setColor();
 }
 public void setNumber(int number) {
 this.number = number;
 if (number == 0)
  tv.setText("");
 else
  tv.setText(number + "");
 setColor();
 }
 @Override
 public String toString() {
 return "Card{" +
  "tv=" + tv +
  ", number=" + number +
  ", width=" + width +
  '}';
 }
 private void setColor() {
 switch (number) {
  case 0:
  tv.setBackgroundColor(getResources().getColor(R.color.c0));
  break;
  case 2:
  tv.setBackgroundColor(getResources().getColor(R.color.c2));
  break;
  case 4:
  tv.setBackgroundColor(getResources().getColor(R.color.c4));
  break;
  case 8:
  tv.setBackgroundColor(getResources().getColor(R.color.c8));
  break;
  case 16:
  tv.setBackgroundColor(getResources().getColor(R.color.c16));
  break;
  case 32:
  tv.setBackgroundColor(getResources().getColor(R.color.c32));
  break;
  case 64:
  tv.setBackgroundColor(getResources().getColor(R.color.c64));
  break;
  case 128:
  tv.setBackgroundColor(getResources().getColor(R.color.c128));
  break;
  case 256:
  tv.setBackgroundColor(getResources().getColor(R.color.c256));
  break;
  case 512:
  tv.setBackgroundColor(getResources().getColor(R.color.c512));
  break;
  case 1024:
  tv.setBackgroundColor(getResources().getColor(R.color.c1024));
  break;
  case 2048:
  tv.setBackgroundColor(getResources().getColor(R.color.c2048));
  break;
 }
 }
 public int getNumber() {
 return number;
 }
}

自己定义一下上面的几种颜色 在values下的colors中


<?xml version="1.0" encoding="utf-8"?>
<resources>
 <color name="colorPrimary">#3F51B5</color>
 <color name="colorPrimaryDark">#303F9F</color>
 <color name="colorAccent">#FF4081</color>
 <color name="c0">#43382a</color>
 <color name="c2">#2a8618</color>
 <color name="c4">#3D6319</color>
 <color name="c8">#F2B179</color>
 <color name="c16">#F59563</color>
 <color name="c32">#F57C5F</color>
 <color name="c64">#5b69b7</color>
 <color name="c128">#b37d3e</color>
 <color name="c256">#3a9096</color>
 <color name="c512">#d7882c</color>
 <color name="c1024">#5c1b78</color>
 <color name="c2048">#640548</color>
</resources>

布局类 和里面的运算方法


public class GameView extends GridLayout {
 int[][] values = new int[4][4];
 Card[][] cards = new Card[4][4];
// Integer -128-127 == 大于这个数 两个对象
 public GameView(Context context) {
 super(context);
 init();
 }
 public GameView(Context context, AttributeSet attrs) {
 super(context, attrs);
 init();
 }
 private void init() {
 setColumnCount(4);
 }
 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
 super.onSizeChanged(w, h, oldw, oldh);
 newGame();
 }
 private void newGame() {
 //ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams((int) (getResources().getDisplayMetrics().widthPixels / 4), (int) (getResources().getDisplayMetrics().widthPixels / 4));
 GridLayout.LayoutParams params = new GridLayout.LayoutParams();
// params.width = getResources().getDisplayMetrics().widthPixels / 4;
// params.height = getResources().getDisplayMetrics().widthPixels / 4;
 //Log.e("TAG", params.width + " " + params.height);
 this.removeAllViews();
 // GridLayout.LayoutParams lpa = new GridLayout.LayoutParams(lp);
 for (int i = 0; i < 4; i++) {
  for (int j = 0; j < 4; j++) {
  values[i][j] = 0;
  cards[i][j] = new Card(getContext(), getResources().getDisplayMetrics().widthPixels / 4);
  // cards[i][j].setLayoutParams(params);
  //cards[i][j].upLv();
  this.addView(cards[i][j]);
  }
 }
 //创建初始的两张卡
 int i = (int) (Math.random() * 16);
 int j = 0;
 do {
  j = (int) (Math.random() * 16);//0-15 15 3 3
 } while (j == i);
 Log.e("TAG", i + " " + j);
 values[i / 4][i % 4] = Math.random() * 20 < 1 ? 4 : 2;
 values[j / 4][j % 4] = Math.random() * 20 < 1 ? 4 : 2;
 setValues();
 }
 float oldx, oldy;
 int move = -1;
 @Override
 public boolean onTouchEvent(MotionEvent event) {
 float x = event.getX();
 float y = event.getY();
 switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN:
  move = -1;
  oldx = x;
  oldy = y;
  break;
  case MotionEvent.ACTION_MOVE:
  if (Math.abs(oldx - x) > Math.abs(oldy - y)) {
   if (oldx - x > 15) { //左
   Log.e("TAG", "---------->>>");
   move = 1;
   } else if (oldx - x < -15) {//右
   Log.e("TAG", "---------->>>");
   move = 2;
   }
  } else {
   if (oldy - y > 15) {
   move = 3;
   } else if (oldy - y < -15) {
   move = 4;
   }
  }
  break;
  case MotionEvent.ACTION_UP:
  //记录之前的数组
  int[][] temp = new int[4][4];
  for (int i = 0; i < 4; i++) {
   for (int j = 0; j < 4; j++) {
   temp[i][j] = values[i][j];
   }
  }
  switch (move) {
   case 1:
   left();
   break;
   case 2:
   right();
   break;
   case 3:
   up();
   break;
   case 4:
   down();
   break;
  }
  setValues();
  if (move != -1) {
   //比对当前的数组
   for (int i = 0; i < 4; i++) {
   for (int j = 0; j < 4; j++) {
    if (values[i][j] != temp[i][j]) {
    addCard();
    return true;
    }
   }
   }
  }
  //判断游戏胜利还是结束4
  if (isWin()) {
   Toast.makeText(getContext(), "游戏胜利", Toast.LENGTH_SHORT).show();
  }
  if (isOver()) {
   this.removeAllViews();
   TextView tv = new TextView(getContext());
   tv.setText("游戏结束,点击从新开始");
   this.addView(tv);
   tv.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    newGame();
   }
   });
  }
  break;
 }
 return true;
 }
 private void addCard() {
 while (true) {
  int j = (int) (Math.random() * 16);
  if (values[j / 4][j % 4] == 0) {
  values[j / 4][j % 4] = 2;
  cards[j / 4][j % 4].setNumber(2);
  return;
  }
 }
 }
 public void left() {
 //取出 4个 集合
 for (int i = 0; i < 4; i++) {
  List<Integer> list = new ArrayList<>();
  for (int j = 0; j < 4; j++) {
  int value = values[i][j];
  if (value != 0)
   list.add(value);
  }
  //比较
  Log.e("TAG", list.toString());
  if (list.size() == 0)
  continue;
  else if (list.size() == 1) {
  values[i][0] = list.get(0);
  for (int j = 0; j < 3; j++) {
   values[i][j + 1] = 0;
  }
  } else if (list.size() == 2) {
  if (list.get(0).equals(list.get(1))) {
   values[i][0] = list.get(0) * 2;
   //三个值补0
   for (int j = 0; j < 3; j++) {
   values[i][j + 1] = 0;
   }
  } else {
   values[i][0] = list.get(0);
   values[i][1] = list.get(1);
   values[i][2] = 0;
   values[i][3] = 0;
  }
  } else if (list.size() == 3) {
  if (list.get(0).equals(list.get(1))) {
   values[i][0] = list.get(0) * 2;
   values[i][1] = list.get(2);
   values[i][2] = 0;
   values[i][3] = 0;
  } else if (list.get(1).equals(list.get(2))) {
   values[i][0] = list.get(0);
   values[i][1] = list.get(2) * 2;
   values[i][2] = 0;
   values[i][3] = 0;
  } else {
   values[i][0] = list.get(0);
   values[i][1] = list.get(1);
   values[i][2] = list.get(2);
   values[i][3] = 0;
  }
  } else {
  if (list.get(0).equals(list.get(1))) {
   if (list.get(3).equals(list.get(2))) {
   values[i][0] = list.get(0) * 2;
   values[i][1] = list.get(2) * 2;
   values[i][2] = 0;
   values[i][3] = 0;
   } else {
   values[i][0] = list.get(0) * 2;
   values[i][1] = list.get(2);
   values[i][2] = list.get(3);
   values[i][3] = 0;
   }
  } else {
   //1和2不相等
   //先比对2 3 相等,不等
   if (list.get(1).equals(list.get(2))) {
   values[i][0] = list.get(0);
   values[i][1] = list.get(1) * 2;
   values[i][2] = list.get(3);
   values[i][3] = 0;
   } else {
   if (list.get(2).equals(list.get(3))) {
    values[i][0] = list.get(0);
    values[i][1] = list.get(1);
    values[i][2] = list.get(2) * 2;
    values[i][3] = 0;
   }
   }
  }
  }
 }
 }
 private void delete() {
 // Log.e("TAG", "--------------------执行");
// //遍历
// for (int i = 0; i < 4; i++) {
//  for (int j = 0; j < 3; j++) {
//  Card card = cards[i][j];
//  Log.e("TAG", "i:" + i + " j:" + j + " num:" + card.getNumber());
//  if (card.getNumber() == 0) {
//   boolean isSub = false;
//   for (int k = j; k < 3; k++) {
//   cards[i][k].setNumber(cards[i][k + 1].getNumber());
//   if (cards[i][k + 1].getNumber() != 0) {
//    isSub = true;
//   }
//   }
//   if (isSub)
//   j--;
//   cards[i][3].setNumber(0);
//  } else if (card.getNumber() == cards[i][j + 1].getNumber()) {
//   card.upLv();
//   cards[i][j + 1].setNumber(0);
//   //后面的往前搬
//   for (int k = j + 1; k < 3; k++) {
//   cards[i][k].setNumber(cards[i][k + 1].getNumber());
//   }
//   cards[i][3].setNumber(0);
//   j--;
//  }
//  }
// }
// for (int j = 0; j < 4; j++) { //列
//  for (int i = 3; i >= 1; i--) {
//  Card card = cards[j][i];
//  if (card.getNumber() == 0) {
//   //全行左移
//   //要将
//   //如果是最后一个,不需要理会
//   continue;
//  } else {
//   //判断左边一个
//   if (cards[j][i - 1].getNumber() == 0) {
//   //从i --》i-1
//   for (int k = i - 1; k < 3; k++) {
//    cards[j][k].setNumber(cards[j][k + 1].getNumber());
//   }
//   cards[j][3].setNumber(0);
//
//   } else if (cards[j][i - 1].getNumber() == card.getNumber()) {
//   cards[j][i - 1].upLv();
//   card.setNumber(0);
//   for (int k = i; k < 3; k++) {
//    cards[j][k].setNumber(cards[j][k + 1].getNumber());
//   }
//   cards[j][3].setNumber(0);
//   }
//  }
//  }
// }
 }
 public void right() {
 mirrorH();
 left();
 mirrorH();
 }
 private void mirrorH() {
 for (int i = 0; i < 4; i++) {
  int temp = values[i][0];
  values[i][0] = values[i][3];
  values[i][3] = temp;
  temp = values[i][1];
  values[i][1] = values[i][2];
  values[i][2] = temp;
 }
 }
 public void down() {
 //左旋
 int[][] temp = new int[4][4];
 for (int i = 0; i < 4; i++) {
  for (int j = 0; j < 4; j++) {
  temp[i][j] = values[3 - j][i];
  }
 }
 values = temp;
 left();
 temp = new int[4][4];
 for (int i = 0; i < 4; i++) {
  for (int j = 0; j < 4; j++) {
  temp[i][j] = values[j][3 - i];
  }
 }
 values = temp;
 }
 public void up() {
 mirrorV();
 down();
 mirrorV();
 }
 private void mirrorV() {
 for (int j = 0; j < 4; j++) {
  int temp = values[0][j];
  values[0][j] = values[3][j];
  values[3][j] = temp;
  temp = values[1][j];
  values[1][j] = values[2][j];
  values[2][j] = temp;
 }
 }
 public void setValues() {
 for (int i = 0; i < 4; i++) {
  for (int j = 0; j < 4; j++) {
  System.out.print(values[i][j] + " ");
  cards[i][j].setNumber(values[i][j]);
  }
  System.out.println();
 }
 }
 public boolean isWin() {
 for (int i = 0; i < 4; i++) {
  for (int j = 0; j < 4; j++) {
  if (values[i][j] == 2048)
   return true;
  }
 }
 return false;
 }
 public boolean isOver() {
 for (int i = 0; i < 4; i++) {
  for (int j = 0; j < 4; j++) {
  if (values[i][j] == 0)
   return false;
  }
 }
 //满了
 for (int i = 0; i < 4; i++) {
  for (int j = 0; j < 4; j++) {
  int value = values[i][j];
  if (i > 1 && value == values[i - 1][j])
   return false;
  else if (i < 3 && value == values[i + 1][j])
   return false;
  else if (j > 1 && value == values[i][j - 1])
   return false;
  else if (j < 3 && value == values[i][j + 1])
   return false;
  }
 }
 return true;
 }
}
您可能感兴趣的文章:Android高仿2048小游戏实现代码Android实现2048小游戏Android游戏源码分享之2048打飞机游戏终极BOSS Android实战打飞机游戏完结篇Android实战打飞机游戏之子弹生成与碰撞以及爆炸效果(5)Android实战打飞机游戏之无限循环的背景图(2)Android实战打飞机游戏之菜单页面设计(1)Android五子棋游戏程序完整实例分析Android下SDL2实现五子棋游戏Android 游戏开发canvas画布的介绍及方法


--结束END--

本文标题: Android编写2048小游戏

本文链接: https://www.lsjlt.com/news/23382.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android编写2048小游戏
    先来说说2048游戏规则: 开始时棋盘内随机出现两个数字,出现的数字仅可能为2或4 玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动 玩家选择的方向上若...
    99+
    2022-06-06
    小游戏 Android
  • 使用JavaScript编写一个2048小游戏
    今天就跟大家聊聊有关使用JavaScript编写一个2048小游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点...
    99+
    2023-06-07
  • 原生js如何编写2048小游戏
    这篇文章给大家分享的是有关原生js如何编写2048小游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果图:代码如下:<!DOCTYPE html> &l...
    99+
    2022-10-19
  • 使用Java编写一个2048小游戏
    本文章向大家介绍使用Java编写一个2048小游戏的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页...
    99+
    2023-06-06
  • 利用c++编写简易版2048小游戏
    目录1、程序初始化2、画图操作3、字符控制4、判断游戏结束和游戏胜利别的不多说,先上效果图 我们都知道2048是个4 4的方格,为了方便数组下表我们生成5 5的数组,只用到1~4的...
    99+
    2022-11-12
  • Android高仿2048小游戏实现代码
    刚开始进入Splash界面: 1.SplashActivity.Java(两秒后进入开始界面,Splash界面的布局只有一个图片,在博客后,会展示给大家看) public c...
    99+
    2022-06-06
    小游戏 Android
  • 2048小游戏成品源码
    2048小游戏,可以自选背景颜色,方框颜色,音乐播放。 还可以展示当前玩家的排名,动态排名,及历史玩家的排名。 前期需求: 使用pygame加载目录音乐。MP3文件: def music_play...
    99+
    2023-08-30
    pygame python 开发语言
  • 用Python写一个无界面的2048小游戏
    以前游戏2048火的时候,正好用其他的语言编写了一个,现在学习python,正好想起来,便决定用python写一个2048,由于没学过python里面的界面编程,所以写了一个极其简单的无界面2048。游戏2...
    99+
    2022-06-04
    小游戏 界面 Python
  • Python实现简单2048小游戏
    简单的2048小游戏 不多说,直接上图,这里并未实现GUI之类的,需要的话,可自行实现: 接下来就是代码模块,其中的2048游戏原来网络上有很多,我就不详细写上去了,都写在注释里面了。唯一要注意的就是需要先去了解一...
    99+
    2022-06-02
    python 2048 游戏
  • Android游戏源码分享之2048
    引言 程序猿们,是否还在为你的老板辛辛苦苦的打工而拿着微薄的薪水呢,还是不知道如何用自己的应用或游戏来赚钱呢! 在这里IQuick将教您如何同过自己的应用来赚取自己的第...
    99+
    2022-06-06
    源码分享 源码 Android
  • 小程序怎么实现2048小游戏
    这篇文章主要介绍“小程序怎么实现2048小游戏”,在日常操作中,相信很多人在小程序怎么实现2048小游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”小程序怎么实现2048小游戏”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-26
  • Python制作简易版2048小游戏
    目录目标效果设计开始步骤一步骤二步骤三步骤四步骤五今天我们来动手实现一款2048小游戏。这款游戏的精髓就玩家能够在于通过滑动屏幕合并相同数字,直到不能再合并为止。玩法可以说是非常的简...
    99+
    2022-11-11
  • java实现2048小游戏(含注释)
    本文实例为大家分享了java实现2048小游戏的具体代码,供大家参考,具体内容如下 实现文件 APP.java import javax.swing.*; public cla...
    99+
    2022-11-12
  • 怎么用Python实现2048小游戏
    这篇文章主要介绍怎么用Python实现2048小游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、开发环境Python版本:3.6.4相关模块:pygame模块;以及一些Python自带的模块。二、环境搭建安装P...
    99+
    2023-06-15
  • R语言写2048游戏实例讲解
    2048 是一款益智游戏,只需要用方向键让两两相同的数字碰撞就会诞生一个翻倍的数字,初始数字由 2 或者 4 构成,直到游戏界面全部被填满,游戏结束。 编程时并未查看原作者代码,不喜...
    99+
    2022-11-11
  • Python怎么实现简单2048小游戏
    这篇文章主要介绍了Python怎么实现简单2048小游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。简单的2048小游戏不多说,直接上图,这里并未实现GUI之类的,需要的话...
    99+
    2023-06-15
  • Python+Pygame制作简易版2048小游戏
    目录导语正文主要代码效果图导语 哈喽!大家好,我是栗子,感谢大家的支持! 新的一天,新气象,程序猿们的日常开始敲敲敲,改改改——今天给大家来一款简单的小游戏...
    99+
    2022-11-13
  • 使用java实现2048小游戏的案例
    这篇文章将为大家详细讲解有关使用java实现2048小游戏的案例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下实现文件APP.javaimport javax.swing.*;pub...
    99+
    2023-06-14
  • 用Python手把手教你实现2048小游戏
    目录一、开发环境二、环境搭建三、原理介绍四、效果图一、开发环境 Python版本:3.6.4 相关模块: pygame模块; 以及一些Python自带的模块。 二、环境搭建 安装Python并添加到环境变量,pip安...
    99+
    2022-06-02
    Python 2048小游戏 python游戏
  • 一步步教你用Python实现2048小游戏
    前言 2048游戏规则:简单的移动方向键让数字叠加,并且获得这些数字每次叠加后的得分,当出现2048这个数字时游戏胜利。同时每次移动方向键时,都会在这个4*4的方格矩阵的空白区域随机产生一个数字2或者4,如...
    99+
    2022-06-04
    小游戏 教你用 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作