一、游戏界面效果显示

二、布局Activity.xml代码

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="得分"android:textSize="20sp" /><TextViewandroid:id="@+id/tvSorce"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:layout_width="145dp"android:layout_height="wrap_content" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="最高分"android:textSize="20sp" /><TextViewandroid:id="@+id/maxSorce"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout><TextViewandroid:layout_width="match_parent"android:layout_height="80dp"android:background="#FFCC99"android:text="宇琴的2048"android:textSize="30sp"android:gravity="center"/><com.example.hp.yq2048.GameViewandroid:layout_width="fill_parent"android:layout_height="0dp"android:layout_weight="1"android:id="@+id/gameView" />
<Buttonandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/bt_cx"android:text="重来"android:background="#FFFFCC"/>

三、GramView.java代码

public class GameView extends GridLayout {
//我们需要定义一个二维数组来记录GameView初始化时生成的16个卡片类
private Card[][] cardsMap = new Card[4][4];
private static GameView gameView = null;
public static GameView getGameView() {
return gameView;
}

private List<Point> points = new ArrayList<Point>();public GameView(Context context) {super(context);gameView = this;initGameView();
}public GameView(Context context, AttributeSet attrs) {super(context, attrs);gameView = this;initGameView();
}public GameView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);gameView = this;initGameView();
}/*** 初始化界面*/
private void initGameView(){Log.d("233","0");setColumnCount(4);  //指名是4列的setBackgroundColor(0xffbbada0);addCards(getCardWitch(),getCardWitch());startGame();setOnTouchListener(new OnTouchListener() {private float startX,startY;//初始的位置private float offsetX,offsetY; //偏移的值@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {switch (motionEvent.getAction()){case MotionEvent.ACTION_DOWN:startX  = motionEvent.getX();startY = motionEvent.getY();break;case MotionEvent.ACTION_UP:offsetX = motionEvent.getX()-startX;offsetY = motionEvent.getY()-startY;if(Math.abs(offsetX)>Math.abs(offsetY)) {  //这个是防止斜着化if (offsetX < -5) {Log.d("233","left");swipeLeft();} else if (offsetX > 5) {Log.d("233","right");swipeRight();}}else {if (offsetY < -5){Log.d("233","up");swipeUp();}else if (offsetY>5){Log.d("233", "down ");swipeDown();}}break;}return true;}});}/*** 布局里面加入卡片* @param cardWidth* @param cardHeight*/
private void addCards(int cardWidth,int cardHeight){Card c;for(int y = 0;y< 4;y++){for(int x = 0;x < 4;x++){c = new Card(getContext());c.setNum(0);Log.d("233","3");addView(c,cardWidth,cardHeight);Log.d("233","4");cardsMap[x][y] = c;}}}/*** 获取屏幕的宽度* @return*/
private int getCardWitch(){Log.d("233","5");DisplayMetrics displayMetrics;displayMetrics = getResources().getDisplayMetrics();int carWitch;carWitch = displayMetrics.widthPixels;return (carWitch-10)/4;
}
public void startGame(){for (int y = 0;y<4;y++){for (int x = 0;x < 4;x++) {cardsMap[x][y].setNum(0);}}MainActivity.getMainActivity().score = 0;addRondomNum();addRondomNum();}private void addRondomNum(){points.clear();for (int y = 0;y < 4;y++){for (int x = 0;x <4;x++){if (cardsMap[x][y].getNum()<=0){points.add(new Point(x,y));}}}Point p = points.remove((int)(Math.random()*points.size()));cardsMap[p.x][p.y].setNum(Math.random() > 0.1?2:4);
}
//设置随机数的方法
private void addRandomNum(){//把这个point清空,每次调用添加随机数时就清空之前所控制的指针points.clear();//对所有的位置进行遍历:即为每个卡片加上了可以控制的指针for(int y = 0;y<4;y++){for (int x = 0; x < 4;x++) {if(cardsMap[x][y].getNum()<=0){points.add(new Point(x,y));//给List存放控制卡片用的指针(通过坐标轴来控制)}}}//一个for循环走完我们就从List里取出一个控制指针的point对象Point p = points.remove((int)(Math.random()*points.size()));//cardsMap[p.x][p.y].setNum(Math.random()>0.1?2:4);//通过point对象来充当下标的角色来控制存放card的二维数组cardsMap,然后随机给定位到的card对象赋值
}private void swipeLeft(){boolean merge = false;//控制每滑动一次画面就加一个随机数到画面,也就是在下面所有for循环之后

// Toast.makeText(getContext(), “向左滑动了”, 0).show();
//以下两行for循环实现了一行一行的遍历,在向左滑动的时候
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) {//现在判断被固定的格子有没有数字,如果没有数字就进行以下的操作if (cardsMap[x][y].getNum()<=0) {//把与被固定的格子的同一水平上的格子的数字赋给被固定的格子cardsMap[x][y].setNum(cardsMap[x1][y].getNum());//把值赋给被固定的格子后自己归零cardsMap[x1][y].setNum(0);//第二层循环,即同一层的不同列退一格继续循环,这样做的原因是为了继续固定这个格子而去检查与它同一水平上的别的格子的内容,因为其他格子是什么个情况还需要继续在第二层进行判断x--;//只要有移动就要加随机数merge = true;}else if (cardsMap[x][y].equals(cardsMap[x1][y])) {//这层判断是判断相邻两个数相同的情况cardsMap[x][y].setNum(cardsMap[x][y].getNum()*2);cardsMap[x1][y].setNum(0);MainActivity.getMainActivity().addScore(cardsMap[x][y].getNum());//只要有移动就要加随机数merge = true;}break;}}}}if (merge) {addRandomNum();check();}
}
private void swipeRight(){boolean merge = false;//控制每滑动一次画面就加一个随机数到画面,也就是在下面所有for循环之后

// Toast.makeText(getContext(), “向右滑动了”, 0).show();
for (int y = 0; y < 4; y++) {
for (int x = 4-1; x >=0; x–) {

            for (int x1 = x-1; x1 >=0; x1--) {if (cardsMap[x1][y].getNum()>0) {if (cardsMap[x][y].getNum()<=0) {cardsMap[x][y].setNum(cardsMap[x1][y].getNum());cardsMap[x1][y].setNum(0);x++;//只要有移动就要加随机数merge = true;}else if (cardsMap[x][y].equals(cardsMap[x1][y])) {cardsMap[x][y].setNum(cardsMap[x][y].getNum()*2);cardsMap[x1][y].setNum(0);MainActivity.getMainActivity().addScore(cardsMap[x][y].getNum());//只要有移动就要加随机数merge = true;}break;}}}}if (merge) {addRandomNum();check();}
}
private void swipeUp(){boolean merge = false;//控制每滑动一次画面就加一个随机数到画面,也就是在下面所有for循环之后

// Toast.makeText(getContext(), “向上滑动了”, 0).show();
for (int x = 0; x < 4; x++) {
for (int y = 0; y < 4; y++) {

            for (int y1 = y+1; y1 < 4; y1++) {if (cardsMap[x][y1].getNum()>0) {if (cardsMap[x][y].getNum()<=0) {cardsMap[x][y].setNum(cardsMap[x][y1].getNum());cardsMap[x][y1].setNum(0);y--;//只要有移动就要加随机数merge = true;}else if (cardsMap[x][y].equals(cardsMap[x][y1])) {cardsMap[x][y].setNum(cardsMap[x][y].getNum()*2);cardsMap[x][y1].setNum(0);MainActivity.getMainActivity().addScore(cardsMap[x][y].getNum());//只要有移动就要加随机数merge = true;}break;}}}}if (merge) {addRandomNum();check();}
}
private void swipeDown(){boolean merge = false;//控制每滑动一次画面就加一个随机数到画面,也就是在下面所有for循环之后

// Toast.makeText(getContext(), “向下滑动了”, 0).show();
for (int x = 0; x < 4; x++) {
for (int y = 4-1; y >=0; y–) {

            for (int y1 = y-1; y1 >=0; y1--) {if (cardsMap[x][y1].getNum()>0) {if (cardsMap[x][y].getNum()<=0) {cardsMap[x][y].setNum(cardsMap[x][y1].getNum());cardsMap[x][y1].setNum(0);y++;//只要有移动就要加随机数merge = true;}else if (cardsMap[x][y].equals(cardsMap[x][y1])) {cardsMap[x][y].setNum(cardsMap[x][y].getNum()*2);cardsMap[x][y1].setNum(0);MainActivity.getMainActivity().addScore(cardsMap[x][y].getNum());//只要有移动就要加随机数merge = true;}break;}}}}if (merge) {addRandomNum();check();}
}
/*** 判断游戏结束的* 界面格子全满了且相邻的格子没有相同的数字*/
private void check(){boolean complete = true;ALL: for(int y = 0;y <4;y++){for(int x = 0;x<4;x++){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;break ALL;}}}if (complete){new AlertDialog.Builder(getContext()).setTitle("嘿嘿").setMessage("游戏结束").setPositiveButton("重来", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {startGame();}}).show();}/*** 这个是判定赢了的逻辑* 只要有一个格子的数字是2048就赢了*/for (int x = 0;x < 4;x++){for(int y = 0;y < 4;y++){if (cardsMap[x][y].getNum()==2048){new AlertDialog.Builder(getContext()).setTitle("耶!").setMessage("你赢了").setPositiveButton("重来吗", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {startGame();}}).show();}}}
}

四、卡片Card.java代码
public class Card extends FrameLayout {
private TextView label; //呈现的文字
private int num = 0; //绑定的编号
// 设置背景色
private int defaultBackColor = 0x338B8B00;

public Card(Context context) {super(context);label = new TextView(getContext());   //显示下label.setTextSize(32);label.setGravity(Gravity.CENTER);label.setBackgroundColor(0x33ffffff);LayoutParams lp = new LayoutParams(-1,-1);  //创建个布局,填充满整个父局容器lp.setMargins(15,15,0,0);addView(label,lp);   //然后扔进去setNum(0);
}public int getNum() {return num;
}public void setNum(int num) {this.num = num;label.setBackgroundColor(getBackground(num));if (this.num<= 0){label.setText("");}else {label.setText(num + "");}}private int getBackground(int num) {int bgcolor = defaultBackColor;switch (num) {case 0:bgcolor = 0xffCCC0B3;break;case 2:bgcolor = 0xffEEE4DA;break;case 4:bgcolor = 0xffEDE0C8;break;case 8:bgcolor = 0xffF2B179;// #F2B179break;case 16:bgcolor = 0xffF49563;break;case 32:bgcolor = 0xffF5794D;break;case 64:bgcolor = 0xffF55D37;break;case 128:bgcolor = 0xffEEE863;break;case 256:bgcolor = 0xffEDB04D;break;case 512:bgcolor = 0xffECB04D;break;case 1024:bgcolor = 0xffEB9437;break;case 2048:bgcolor = 0xffEA7821;break;default:bgcolor = 0xffEA7821;break;}return bgcolor;
}/*** 判断卡片的数字是否相同* @param* @return*/
public boolean equals(Card o) {return getNum()==o.getNum();
}

五、最高分BastScode.java代码
public class BastScode {
private SharedPreferences s;
BastScode(Context context){
s = context.getSharedPreferences(“bestscode”,context.MODE_PRIVATE);

}public int getBestScode(){int bestscode = s.getInt("bestscode",0);return bestscode;
}
public void setBestScode(int bestScode){SharedPreferences.Editor editor = s.edit();editor.putInt("bestscode",bestScode);editor.commit();
}

六、MainActivity.java代码
public class MainActivity extends Activity implements View.OnClickListener{
public TextView tvScrore;//计分的
public TextView tvBestScore;//最高分
public int score = 0;
private int bestScores;//历史最高成绩
private Button bt;

private static MainActivity mainActivity = null;
public MainActivity(){mainActivity = this;
}public static MainActivity getMainActivity() {return mainActivity;
}@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);inital();}@SuppressLint("SetTextI18n")
public void inital() {tvBestScore = (TextView) findViewById(R.id.maxSorce);tvScrore = (TextView) findViewById(R.id.tvSorce);bt = (Button)findViewById(R.id.bt_cx);bt.setOnClickListener(this);BastScode bastScode = new BastScode(this);bestScores = bastScode.getBestScode();tvBestScore.setText(bestScores+"");
}@Override
public void onClick(View v) {GameView.getGameView().startGame();
}public void clearScore(){score = 0;showScore();
}
public void showScore(){tvScrore.setText(score+"");
}
public void addScore(int s){score+=s;showScore();if (score > bestScores){bestScores = score;BastScode bs = new BastScode(this);bs.setBestScode(bestScores);tvBestScore.setText(bestScores+"");}
}/*** 菜单、返回键响应*/
private long exitTime = 0;@SuppressLint("WrongConstant")
public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK&& event.getAction() == KeyEvent.ACTION_DOWN) {if ((System.currentTimeMillis() - exitTime) > 2000) {Toast.makeText(this, "再按一次退出",1000).show();exitTime = System.currentTimeMillis();} else {finish();System.exit(0);}return true;}return super.onKeyDown(keyCode, event);
}

七、总结
以上便是2048小游戏的所有实现代码,其中注意的是在AndroidManifest.xml中需要添上一行代码 android:screenOrientation=“portrait”,以便可以适用于任何屏幕尺寸的手机。

android 2048小游戏实现代码相关推荐

  1. c语言2048代码linux,C语言实现2048小游戏(示例代码)

    2048 一.设计思路 1.游戏规则 想要制作游戏,首先需要了解游戏的规则,下面就来介绍2048的游戏规则 2048游戏共有16个格子,初始时初始数字由2或者4构成. 手指向一个方向滑动,所有格子会向 ...

  2. 2048小游戏逻辑代码(易懂)

    2048主要是逻辑清晰,我这个是jQuery写的,但是不管是什么用什么写,其实都是这个逻辑 代码没有删减,复制粘贴即可运行 这就是做好的样子: 样式有点丑,但是问题不大 这个游戏大家应该都玩过,在这我 ...

  3. (Python)2048小游戏核心代码

    算法思想: 1.降维:将二维降为一维列表进行处理 2.去零:相邻相同合并 list_merge = None# 1 def zero_to_end():"""零元素移动到 ...

  4. 程序设计-在校整理-06 最常公共子序列与子串+2048小游戏+KNN简单实例

    [在校整理-06 最常公共子序列与子串+2048小游戏+KNN简单实例](注:仅供参考学习使用) 一.课题内容和要求 1.问题描述 1.1最长公共子序列与子串 1.2 2048小游戏 1.3 K-NN ...

  5. 一文梳理2048小游戏从开发到上云全流程

    摘要:本文主要以Cocos2d Web项目2048小游戏的开发上云为例,介绍DevOps开发实践的全流程 前言 本文主要以Cocos2d Web项目2048小游戏的开发上云为例,介绍DevOps开发实 ...

  6. python游戏代码五子棋_用20行Python代码实现2048小游戏,你会吗?

    前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...

  7. python秒表游戏代码_用20行Python代码实现2048小游戏,你会吗?

    前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...

  8. c语言2048代码linux,C语言2048小游戏课设(附源码).doc

    PAGE PAGE 1 C语言2048小游戏课设 项目说明 本系统基于C语言开发,适用于刚入门的C语言新手项目课设,开发软件采用VC++6.0开发,VS,DEV C++等均可运行.(书生) 项目运行截 ...

  9. go语言实现2048小游戏(完整代码)

    文章目录 2048逻辑分析 完整代码 2048逻辑分析 2048小游戏的基本操作是上下左右,每个操作的逻辑都不太一样! 这个时候,通过数组旋转的方式.将所有操作转换为向上的操作 git地址 https ...

  10. 2048小游戏(原生js基础代码篇)

    今天在这里,我将给各位呈现一个简单的游戏代码. 想必大家都接触过2048这个小游戏吧,在悠闲时间用于消遣时间最好不过了,那么,我给大家写一个2048最基本的原生js代码. HTML: <!DOC ...

最新文章

  1. TextVew中文空格
  2. php对接海康视频教程_EasyNVR无插件互联网直播平台对接海康摄像头如何通过SDK将视频在前端网页播放...
  3. Spring MVC 数据验证——validate注解方式
  4. Boost 库中的实用工具类使用入门
  5. C#环境下的钩子详解
  6. c#语言中的变量名,在C#中创建动态变量名
  7. php在四线城市待遇如何,月薪5000元在四线城市算什么水平,丢人吗?
  8. 一加8/一加8 Pro外形配置全曝光:就差个价格了
  9. sql2008表支持多少列_数据库表分区是怎么回事?
  10. “整洁代码根本就是个骗局!”
  11. 检查丢失的软件包并安装它们的优雅方法?
  12. android开发项目app实例_JNPF快速开发平台-快速开发Web+APP项目的java开发平台
  13. ML/DL-复习笔记【十】- 分组卷积和深度可分离卷积的区别
  14. 汽车发动机电子控制技术
  15. PLC编程语言汇总,留言告诉我你会哪一个?
  16. 计算机很多术语都是cat,18 个开源翻译工具帮助你的项目本地化
  17. 基于docker 部署 canvas-lms
  18. linux du命令 前多少个,Linux du命令查看文件夹大小并按降序排列
  19. 我思故我在-记录我的困惑
  20. ceph s3cmd上传文件时报错: ERROR: S3 error: 416 (InvalidRange)

热门文章

  1. 如何更改ElementUI组件的图标大小以及标签属性
  2. biosrecovery什么意思_BIOS Recovery 简介
  3. 【转】《Unity Shader入门精要》冯乐乐 随书彩图
  4. PHP字符串转换函数
  5. 基于esp32的物联网设计
  6. Hadoop基础组件思维导图
  7. 可作为工质状态参数的是_§2工质的热力状态及其基本状态参数
  8. IAST安全扫描原理
  9. java编写工字鼠标光标,鼠标指针的形状及含义
  10. 揭秘|Axway API在银行业的应用