Android期末项目2048小游戏

这篇具有很好参考价值的文章主要介绍了Android期末项目2048小游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android期末项目2048小游戏。

简介

2048属于益智类小游戏,它做到了娱乐性、趣味性、教育性相统一。益智类的游戏即是需要去开动大脑去思考从而获得游戏的胜利。简单的益智类游戏可以使玩家在娱乐中不断的开发大脑。这样一来就实现了在娱乐中学习。每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢,系统也会在空白的地方随机出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。不断的叠加最终拼凑出2048这个数字就算成功。

设计思想

完成2048基本功能,加入动画效果,加入声音效果,能够记录并显示最高分,能够自动保存游戏进度。

程序功能

1.基本的2048游戏功能
2.记录最高分功能
3.记录完成2048次数功能
4.声音设置功能
5.自动保存游戏进度功能
6.结束游戏时判定是否是新纪录

程序截图

Android期末项目2048小游戏

Android期末项目2048小游戏

Android期末项目2048小游戏
Android期末项目2048小游戏
Android期末项目2048小游戏

部分功能实现

1.初始化面板

// An highlighted block
public void initView() {
        removeAllViews();
        canSwipe = true;
        getGoal=false;
        gridColumnCount=4;
        cells = new Cell[gridColumnCount][gridColumnCount];
        // 设置界面大小
        setColumnCount(gridColumnCount);
        // 获取格子的宽
        int cellWidth = getCellSize();
        // 获取格子的高
        int cellHeight = getCellSize();
        addCell(cellWidth, cellHeight);
        startGame();
        setOnTouchListener((v, event) -> {
            // 通知父控件不要拦截此控件的onTouch事件
            v.getParent().requestDisallowInterceptTouchEvent(true);
            if (canSwipe) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        setX = event.getX();
                        setY = event.getY();
                        break;
                    case MotionEvent.ACTION_UP:
                        offsetX = event.getX() - setX;
                        offsetY = event.getY() - setY;
                        // 判断滑动方向
                        int orientation = getOrientation(offsetX, offsetY);
                        switch (orientation) {
                            case 0:
                                // 向右滑动
                                swipeRight();
                                break;
                            case 1:
                                // 向左滑动
                                swipeLeft();
                                break;
                            case 2:
                                // 向下滑动
                                swipeDown();
                                break;
                            case 3:
                                // 向上滑动
                                swipeUp();
                                break;
                            default:
                                break;
                        }
                    default:
                        break;
                }
            }
            return true;
        });
    }
 

2.Cell类实现,Cell表示游戏中移动的数字快,块的字体、颜色、等属性都在对象中进行设置,Cell类如下:

package com.example.game2048.view;

import android.content.Context;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import android.graphics.Typeface;
import android.view.Gravity;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.example.game2048.R;

public class Cell extends FrameLayout {

    private TextView cellShowText;
    private int digital;

    public Cell(Context context) {
        super(context);
    }
    public Cell(@NonNull Context context, int leftMargin, int topMargin, int bottomMargin) {
        super(context);
        init(context, leftMargin, topMargin, bottomMargin);
    }


    private void init(@NonNull Context context, int leftMargin, int topMargin, int bottomMargin) {
        cellShowText = new TextView(context);
        cellShowText.setTextSize(40);
        cellShowText.setGravity(Gravity.CENTER);
        // 抗锯齿
        cellShowText.getPaint().setAntiAlias(true);
        // 粗体
        cellShowText.getPaint().setFakeBoldText(true);
        // 字体
        cellShowText.setTypeface(Typeface.MONOSPACE);
        // 颜色
        cellShowText.setTextColor(ContextCompat.getColor(context, R.color.colorTextDark));
        // 填充整个父容器
        LayoutParams params = new LayoutParams(-1, -1);
        params.setMargins(leftMargin, topMargin, 0, bottomMargin);
        addView(cellShowText, params);
        setDigital(0);
    }

    //获取卡片
    public TextView getItemCell() {
        return cellShowText;
    }

    //获取数字
    public int getDigital() {
        return digital;
    }

    //设置数字
    public void setDigital(int digital) {
        this.digital = digital;
        cellShowText.setBackgroundResource(getBackgroundResource(digital));
        if (digital <= 0) {
            cellShowText.setText("");
        } else {
            cellShowText.setText(String.valueOf(digital));
        }
    }

   //设置数字背景
    private int getBackgroundResource(int number) {
        switch (number) {
            case 0:
                return R.drawable.bg_cell_0;
            case 2:
                return R.drawable.bg_cell_2;
            case 4:
                return R.drawable.bg_cell_4;
            case 8:
                return R.drawable.bg_cell_8;
            case 16:
                return R.drawable.bg_cell_16;
            case 32:
                return R.drawable.bg_cell_32;
            case 64:
                return R.drawable.bg_cell_64;
            case 128:
                return R.drawable.bg_cell_128;
            case 256:
                return R.drawable.bg_cell_256;
            case 512:
                return R.drawable.bg_cell_512;
            case 1024:
                return R.drawable.bg_cell_1024;
            case 2048:
                return R.drawable.bg_cell_2048;
            default:
                return R.drawable.bg_cell_default;
        }
    }

}

3、在空白处随机添加数字

public void addDigital() {
        getEmptyCell();
        if (emptyCellPoint.size() > 0) {
            // 随机取出一个空格子的坐标位置
            Point point = emptyCellPoint.get((int) (Math.random() * emptyCellPoint.size()));
            cells[point.x][point.y].setDigital(Math.random() > 0.4 ? 2 : 4);

            // 设置动画
            setAppearAnim(cells[point.x][point.y]);
        }
    }

4、向面板中加入数字块

private void addCell(int cellWidth, int cellHeight) {
        Cell cell;
        for (int i = 0; i < gridColumnCount; i++) {
            for (int j = 0; j < gridColumnCount; j++) {
                if (i == gridColumnCount - 1) {
                    // 为最底下的格子加上bottomMargin
                    cell = new Cell(getContext(), 16, 16, 16);
                } else {
                    cell = new Cell(getContext(), 16, 16, 0);
                }
                cell.setDigital(0);
                addView(cell, cellWidth, cellHeight);
                cells[i][j] = cell;
            }
        }
    }

5、滑动逻辑实现,滑动时,判断每一行(列)的数据,0代表空格子,将非0数字存在一个list中,然后判断若当前数字与前一个数字相同,合并,并将此list作为这行(列)的新数据,再按滑动的方向向这行(列)中存放list中的数字,以上滑为例:

private void swipeUp() {
        // 判断是否需要添加数字
        boolean needAddDigital = false;
        for (int i = 0; i < gridColumnCount; i++) {
            for (int j = 0; j < gridColumnCount; j++) {
                // 获取当前位置数字
                int currentDigital = cells[j][i].getDigital();
                someData.add(currentDigital);
                if (currentDigital != 0) {
                    // 记录数字
                    if (recordPreviousDigital == -1) {
                        recordPreviousDigital = currentDigital;
                    } else {
                        // 记录的之前的数字和当前数字不同
                        if (recordPreviousDigital != currentDigital) {
                            // 加入记录的数字
                            dataAfterSwipe.add(recordPreviousDigital);
                            recordPreviousDigital = currentDigital;
                        } else {// 记录的之前的数字和当前的数字相同
                            // 加入*2
                            dataAfterSwipe.add(recordPreviousDigital * 2);
                            // 记录得分
                            recordScore(recordPreviousDigital * 2);
                            // 重置记录数字
                            recordPreviousDigital = -1;
                        }
                    }
                }
            }

            if (recordPreviousDigital != -1) {
                dataAfterSwipe.add(recordPreviousDigital);
            }

            // 补0
            for (int p = dataAfterSwipe.size(); p < gridColumnCount; p++) {
                dataAfterSwipe.add(0);
            }
            // 若原始数据和移动后的数据不同,视为界面发生改变
            if (!someData.equals(dataAfterSwipe)) {
                needAddDigital = true;
            }
            someData.clear();

            // 重新设置格子数据
            for (int k = 0; k < dataAfterSwipe.size(); k++) {
                cells[k][i].setDigital(dataAfterSwipe.get(k));
            }
            // 重置数据
            recordPreviousDigital = -1;
            dataAfterSwipe.clear();
        }
        if (needAddDigital) {
            // 添加一个随机数字(2或4)
            addDigital();
            playSound();
        }
        judgeOverOrAccomplish();
    }

总结

基本完成了2048游戏的所有功能,但界面比较简陋,没有做出块滑动、碰撞的动画。在此过程中也学到了许多新东西,如SharedPreferences, GestureOverlayView, BoradcastReceiver等等。
此项目有待改进的地方:
1.加入数字快滑动和碰撞的动画效果。
2.增加选择阶数功能。即总方块数可由用户自定义4x4或5x5、6x6等。
3.增加一些游戏工具,如消除指定数字块,指定方块换位等,工具可通过完成指定分数获得。

项目源码:链接:https://pan.baidu.com/s/1TwBOzI5MDBPx6LtgzZxYmg 提取码:9pn6文章来源地址https://www.toymoban.com/news/detail-461381.html

到了这里,关于Android期末项目2048小游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python小游戏 2048小游戏设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 2048小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 今天我们用python实现

    2024年02月11日
    浏览(44)
  • python小游戏毕设 2048小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 2048小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: https://

    2024年02月12日
    浏览(31)
  • 2048小游戏成品源码

    2048小游戏,可以自选背景颜色,方框颜色,音乐播放。 还可以展示当前玩家的排名,动态排名,及历史玩家的排名。 前期需求: 使用pygame加载目录音乐。MP3文件: 看下运行后的效果图: =========参数设置: =========背景设置: =========方块设置: ==========源码分享:

    2024年02月16日
    浏览(28)
  • Qt--2048小游戏

    2048 1.功能 上下左右控制数字格子的移动 WASD 4*4 格子移动操作,加操作 开始游戏的按钮,重新游戏按钮 得分计算 判断游戏是否结束 2.源程序 代码如下(示例): MainWindow.h Main.cpp MainWindow.cpp 5.结果 以上是今天要讲的内容,练习了2048小游戏。

    2024年01月25日
    浏览(33)
  • c++制作小游戏2048

    完整代码来自于爱编程的柚子《【C语言/C++游戏项目】:2048小游戏,超详细教程教会你写这个小游戏。》 这个游戏用到了#include graphics.h,思路比较简单。 首先做出游戏页面,然后画出4*4的格子,利用map二维数组,依据数字{0,2,4,8,16,32,64,128,256,512,1024,2048}找到对应颜色在固定位

    2024年02月13日
    浏览(31)
  • python快速实现2048小游戏

    《2048》是一款比较流行的数字游戏,最早于2014年3月20日发行。原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台。这款游戏是基于《1024》和《小3传奇》的玩法开发而成的新型数字游戏。 操作指南: 每次可以选择上下左右其中一个方向去滑动,每滑动

    2024年02月11日
    浏览(28)
  • 基于C#的2048小游戏

    最近在玩过2048这个小游戏后感觉很有意思,想着正在学C#的winfrom的我能不能自己写一个2048游戏呢?于是就有了这个:   目录 1.实现思路; 2.代码实现; 1.初始化地图表示的数组; 2.绘制游戏的边框; 3.设置每个数值对应的颜色(可省略); 4.添加控件; 5.四个方向的移动;

    2024年02月08日
    浏览(29)
  • 用Python做一个2048小游戏

    2048的逻辑无非是操作 4 × 4 4times4 4 × 4 的方格,每个方格中有一个数,这些数可以移动,如果两个相同的数字在移动时相撞了,就可以彼此合并。 而这个 4 × 4 4times4 4 × 4 的方格,无非是一个矩阵。只需设计好移动逻辑,再用PyGame将这个方格表现出来就算大功告成。 2048只有

    2024年01月17日
    浏览(36)
  • 2048小游戏 java版(代码+注释)

            一个纯纯小白,想写点什么,也想学习一下怎么在这里写东西,就简单的写个2048小游戏。写的不好,大佬就不用看了,希望和大家交流学习,有写的不好或有更好的建议也欢迎提出来。(需要用的可直接粘贴复制)(轻喷) 目录 游戏展示 讲解  代码        

    2024年02月09日
    浏览(30)
  • 【C语言】2048小游戏【附源码】

    欢迎来到英杰社区 https://bbs.csdn.net/topics/617804998         2048是一款数字益智类游戏,玩家需要使用键盘控制数字方块的移动,合并相同数字的方块,最终达到数字方块上出现“2048”的目标。         每次移动操作,所有数字方块会朝着指定方向同时滑动,并在靠近边

    2024年04月15日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包