Networks Business Online Việt Nam & International VH2

Lập trình game 2048 trên Android Studio – Mã nguồn game 2048

Đăng ngày 08 November, 2022 bởi admin
Nhắc đến tựa game 2048 có lẽ rằng là không ai không biết đến game show trí tuệ mê hoặc này. Ra đời vào năm năm trước, Game 2048 đã làm mưa làm gió trong suốt thời hạn dài và cho đến tận giờ đây thì tựa game này vẫn luôn lọt top những game show trí tuệ, mê hoặc nhất mọi thời đại .
Trong bài viết thời điểm ngày hôm nay mình sẽ san sẻ mã nguồn Lập trình game 2048 trên Android Studio – Mã nguồn game 2048 cùng theo dõi nhé .

Lập trình game 2048 trên Android Studio

Video dưới đây là demo mà mình đã xây dựng và sẽ chia sẻ Source Code trong bài viết hôm nay, bạn xem qua nhé.

Ý tưởng thuật toán

Ý tưởng thuật toán mà mình sử dụng thì cũng tương đối đơn giản. Trò chơi sẽ bão gồm 16 ô với kích thước 4×4, vậy tương ứng mình sẽ sử dụng một mảng 2 chiều kích thước 4×4 để lưu các giá trị của các ô trong trò chơi.

Với các ô trống, giá trí mảng mình sẽ lưu là 0, các ô khác mảng lưu giá trị tương ứng đang có của ô đó. Dựa vào mảng này để hiển thị trạng thái trò chơi và màu sắc của các ô ra màn hình.

Khi người chơi tiến hành vuốt màn hình lên, xuống, trái hoặc phải, chúng ta sẽ sử dụng thuật toán để dồn mảng về phía đó, 2 ô đang có giá trị giống nhau mà cạnh nhau hoặc 2 ô có giá trị giống nhau và ở giữa chúng là các ô trống thì 2 ô này sẽ được ghép thành ô có giá trị lớn hơn.

Sau mỗi lần người chơi thao tác vuốt, một ô mang giá trị 2 hoặc 4 sẽ sinh ngẫu nhiên tại ô đang trống .

Cụ thể hàm phát hiện cử chỉ vuốt và thao tác dồn mảng mình viết như bên dưới.

//Kế thừa từ lớp GestureDetector.SimpleOnGestureListener để xử dụng được thao tác cử chỉ màn hình
class CuChiManHinh  extends GestureDetector.SimpleOnGestureListener {

//*Hàm thao tác cử chỉ màn hình 
// MotionEvent e1 là vị trí tọa độ màn hình khi mình chạm màn hình, e2 là tọa độ khi mình nhấc tay lên
//velocityX, velocityY tạm hiểu là tốc độ vuốt theo trục x và y
//*
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            boolean check = false;
            setLuumatrix();
//*Vuốt sang trái
//e1.getX() - e2.getX() > 100 đảm bảo thao tác vuốt theo trục X khoảng cách lớn hơn 100 điểm ảnh (khoảng cách tối thiểu để đủ nhận biết đó là thao tác vuôt)
//Math.abs(e1.getY() - e2.getY()) <  Math.abs(e1.getX() - e2.getX()) - Đảm bảo khoảng cách thao tác vuốt theo trục X phải lớn hơn theo trục Y
//Math.abs(velocityX) > 100 - Tốc độ  vuốt phải đủ nhanh
//*
            if(e1.getX() - e2.getX() > 100 && Math.abs(e1.getY() - e2.getY()) <  Math.abs(e1.getX() - e2.getX()) && Math.abs(velocityX) > 100){
//Vòng lặp để dồn mảng về phía trái
                for(int i=1;i<5;i++){
                    for(int j=1;j<4;j++)
                    {
                        if(matrix[i][j]!=0)
                        {
                            for(int k=j+1; k<5;k++)
                            {
                                if(matrix[i][k]==matrix[i][j])
                                {
                                    check = true;
                                    matrix[i][j]+=matrix[i][k];
                                    scores+=matrix[i][j];
                                    matrix[i][k]=0;j=k;break;
                                }else if(matrix[i][k]!=0) break;
                            }
                        }
                    }
                    for(int j=1;j<4;j++)
                    {
                        if(matrix[i][j] == 0)
                        {
                            for(int k=j+1; k<5;k++)
                            {
                                if(matrix[i][k]!=0)
                                {
                                    check = true;
                                    matrix[i][j]=matrix[i][k];
                                    matrix[i][k]=0; break;
                                }
                            }
                        }
                    }
                }
            }
//Vuốt sang phải (Tương tự bên trên)
else if(e2.getX() - e1.getX() > 100  && Math.abs(e1.getY() - e2.getY()) <   Math.abs(e1.getX() - e2.getX()) && Math.abs(velocityX) > 100)
            {
                for(int i=1;i<5;i++){
                    for(int j=4;j>1;j--){

                        if( matrix[i][j]!=0)
                        {
                            for(int k=j-1; k>0;k--)
                            {
                                if(matrix[i][k]==matrix[i][j])
                                {
                                    check =true;
                                    matrix[i][j]+=matrix[i][k];
                                    scores+=matrix[i][j];
                                    matrix[i][k]=0; j = k; break;
                                }else if(matrix[i][k]!=0) break;
                            }
                        }
                    }
                    for(int j=4;j>1;j--)
                    {
                        if(matrix[i][j] == 0)
                        {
                            for(int k=j-1; k>0;k--)
                            {
                                if(matrix[i][k]!=0)
                                {
                                    check = true;
                                    matrix[i][j]=matrix[i][k];
                                    matrix[i][k]=0;  break;
                                }
                            }
                        }
                    }
                }
            }
            //vuot len
            else if(e1.getY() - e2.getY() > 100 && Math.abs(e1.getX() - e2.getX()) <   Math.abs(e1.getY() - e2.getY()) && Math.abs(velocityY) > 100){
                for(int i=1;i<5;i++)
                {
                    for(int j=1;j<4;j++){
                        if(matrix[j][i]!=0)
                        {
                            for(int k=j+1;k<5;k++)
                            {
                                if(matrix[k][i]==matrix[j][i])
                                {
                                    check=true;
                                    matrix[j][i] += matrix[k][i];
                                    scores+=matrix[j][i];
                                    matrix[k][i]=0; j=k; break;
                                }if(matrix[k][i]!=0) break;
                            }
                        }
                    }
                    for(int j=1;j<4;j++)
                    {
                        if(matrix[j][i] == 0)
                        {
                            for(int k=j+1;k<5;k++)
                            {
                                if(matrix[k][i]!=0)
                                {
                                    check = true;
                                    matrix[j][i] = matrix[k][i];
                                    matrix[k][i]=0; break;
                                }
                            }
                        }
                    }
                }
            }
            //vuot xuong
            else if(e2.getY() - e1.getY() > 100  && Math.abs(e1.getX() - e2.getX()) <   Math.abs(e1.getY() - e2.getY()) && Math.abs(velocityY) > 100)
            {
                for(int i=1;i<5;i++)
                {
                    for(int j=4;j>1;j--)
                    {
                        if(matrix[j][i] != 0)
                        {
                            for(int k=j-1;k>0;k--)
                            {
                                if(matrix[k][i]==matrix[j][i])
                                {
                                    check=true;
                                    matrix[j][i]+= matrix[k][i];
                                    scores+=matrix[j][i];
                                    matrix[k][i]=0; j=k; break;
                                }else if(matrix[k][i] != 0) break;
                            }
                        }
                    }
                    for(int j=4;j>1;j--)
                    {
                        if(matrix[j][i] == 0)
                        {
                            for(int k=j-1;k>0;k--)
                            {
                                if(matrix[k][i]!=0)
                                {
                                    check = true;
                                    matrix[j][i] = matrix[k][i];
                                    matrix[k][i]=0; break;
                                }
                            }
                        }
                    }
                }
            }
            if(check==true)randdomnumber();
            gameove();
            setBOX();
            return super.onFling(e1, e2, velocityX, velocityY);
        }
    }
    public void randdomnumber()
    {
        Random random = new Random();
        while(true)
        {
            int i=random.nextInt(4)+1, j=random.nextInt(4)+1;
            if(matrix[i][j]==0)
            {
                if(random.nextInt(11) < 10
                ) matrix[i][j]=2;
                else matrix[i][j]=4;
                break;
            }
        }
    }

Một số hình ảnh trò chơi

Lập trình game 2048 trên Android Studio - Mã nguồn game 2048
Lập trình game 2048 trên Android Studio - Mã nguồn game 2048
Lập trình game 2048 trên Android Studio - Mã nguồn game 2048

Mã nguồn trò chơi

TẢI XUỐNG MÃ NGUỒN

Link SourceCode : https://vh2.com.vn/shortlink/?c=source-game-2048

TẢI XUỐNG FILE APK

Link file. APK : https://vh2.com.vn/shortlink/?c=app_2048
Ứng dụng thiết kế xây dựng gồm 1 số file java và file giao diện XML như sau :

Database.java – Lớp thao tác với Cơ sở dữ liệu SQLite

package com.example.game2048;

import android.app.admin.DelegatedAdminReceiver;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

public class Database extends SQLiteOpenHelper {
    public Database(@Nullable Context context) {

        super(context, "Database.SQLite", null, 1);
        try{
            SQLiteDatabase database = getWritableDatabase();
            database.execSQL("INSERT INTO Game2048 VALUES('hang1','2','0','0','0','0')");
            database.execSQL("INSERT INTO Game2048 VALUES('hang2','0','0','0','0','0')");
            database.execSQL("INSERT INTO Game2048 VALUES('hang3','0','0','2','0','0')");
            database.execSQL("INSERT INTO Game2048 VALUES('hang4','0','0','0','0','0')");
            database.close();
        }catch (Exception e)
        {
        }
    }
    public Cursor getData(String sql)
    {
        SQLiteDatabase database = getReadableDatabase();
        return  database.rawQuery(sql, null);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE IF NOT EXISTS Game2048(hang text primary key, cot1 TEXT, cot2 text,cot3 text,cot4 text,diemcao text)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
    public String getDiemcao2048(Context context)
    {
        Cursor cursor = new Database(context).getData("SELECT *FROM Game2048");
        cursor.move(1);
        return cursor.getString(5);
    }
    public void setDiemcao2048(int diemcao)
    {
        SQLiteDatabase database = getWritableDatabase();
        database.execSQL("UPDATE Game2048 SET diemcao ='" +diemcao +"' WHERE hang='hang1'");
        database.close();
    }
    public String getDiemHT2048(Context context)
    {
        Cursor cursor = new Database(context).getData("SELECT *FROM Game2048");
        cursor.move(2);
        return cursor.getString(5);
    }

    public void setDiemHT2048(int diemcao)
    {
        SQLiteDatabase database = getWritableDatabase();
        database.execSQL("UPDATE Game2048 SET diemcao ='" +diemcao +"' WHERE hang='hang2'");
        database.close();
    }
    public void setQuatrinh(int matrix[][])
    {
        SQLiteDatabase database = getWritableDatabase();
        database.execSQL("UPDATE Game2048 SET cot1 ='" +matrix[1][1] +"' WHERE hang='hang1'");
        database.execSQL("UPDATE Game2048 SET cot2 ='" +matrix[1][2] +"' WHERE hang='hang1'");
        database.execSQL("UPDATE Game2048 SET cot3 ='" +matrix[1][3] +"' WHERE hang='hang1'");
        database.execSQL("UPDATE Game2048 SET cot4 ='" +matrix[1][4] +"' WHERE hang='hang1'");

        database.execSQL("UPDATE Game2048 SET cot1 ='" +matrix[2][1] +"' WHERE hang='hang2'");
        database.execSQL("UPDATE Game2048 SET cot2 ='" +matrix[2][2] +"' WHERE hang='hang2'");
        database.execSQL("UPDATE Game2048 SET cot3 ='" +matrix[2][3] +"' WHERE hang='hang2'");
        database.execSQL("UPDATE Game2048 SET cot4 ='" +matrix[2][4] +"' WHERE hang='hang2'");

        database.execSQL("UPDATE Game2048 SET cot1 ='" +matrix[3][1] +"' WHERE hang='hang3'");
        database.execSQL("UPDATE Game2048 SET cot2 ='" +matrix[3][2] +"' WHERE hang='hang3'");
        database.execSQL("UPDATE Game2048 SET cot3 ='" +matrix[3][3] +"' WHERE hang='hang3'");
        database.execSQL("UPDATE Game2048 SET cot4 ='" +matrix[3][4] +"' WHERE hang='hang3'");

        database.execSQL("UPDATE Game2048 SET cot1 ='" +matrix[4][1] +"' WHERE hang='hang4'");
        database.execSQL("UPDATE Game2048 SET cot2 ='" +matrix[4][2] +"' WHERE hang='hang4'");
        database.execSQL("UPDATE Game2048 SET cot3 ='" +matrix[4][3] +"' WHERE hang='hang4'");
        database.execSQL("UPDATE Game2048 SET cot4 ='" +matrix[4][4] +"' WHERE hang='hang4'");

    }
    public int[][]  getQuatrinh(Context context){
        int a[][]= new int[5][5];
        Cursor cursor = new Database(context).getData("SELECT *FROM Game2048");
        for(int i=1;i<5;i++)
        {
            cursor.moveToPosition(i-1);
            for(int j=1;j<5;j++) a[i][j] = Integer.valueOf(cursor.getString(j));
        }
        return a;
    }
}

MainActivity.java – Màn hình bắt đầu trò chơi

package com.example.game2048;

import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.app.*;
import android.content.Intent;
import android.view.*;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;


public class MainActivity extends Activity {
    private Button playgame, choitiep;
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            try{
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage("Bạn có muốn thoát!!").setPositiveButton("Có", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        Intent startMain = new Intent(Intent.ACTION_MAIN);
                        startMain.addCategory(Intent.CATEGORY_HOME);
                        startActivity(startMain);
                        finish();
                    }
                })
                               .setNegativeButton("Không", new DialogInterface.OnClickListener() {
                                   public void onClick(DialogInterface dialog, int id) {

                                   }
                               }).show();
            }catch (Exception e)
            {
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        anhxa();
        batxukienclick();
    }
    public void batxukienclick()
    {
        playgame.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, play2048.class);
                intent.putExtra("playgame", 1);
                startActivity(intent);
            }
        });
        choitiep.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, play2048.class);
                intent.putExtra("playgame", 3);
                startActivity(intent);
            }
        });
    }
    public void anhxa()
    {
        playgame = (Button)findViewById(R.id.playgame2048);
        choitiep = (Button)findViewById(R.id.choitiep);
    }
}

play2048.java – Màn hình trò chơi

package com.example.game2048;

import androidx.appcompat.app.AppCompatActivity;
import android.app.*;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import  android.view.*;
import android.os.Bundle;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Random;

public class play2048 extends Activity {
    private ImageView box11, box12,  box13, box14;
    private ImageView box21, box22,  box23, box24;
    private ImageView box31, box32,  box33, box34;
    private ImageView box41, box42,  box43, box44;
    Intent context;
    private TextView text11, text12, text13, text14;
    private TextView text21, text22, text23, text24;
    private TextView text31, text32, text33, text34;
    private TextView text41, text42, text43, text44;
    private LinearLayout khungman;
    private int scores=0;
    Button quaylai, reset;
    private int matrix [][], luumatrix[][];
    private TextView diemso, diemcao;
    private Database database;
    @Override
    public void onStop() {
        LuuQuatrinh();
        super.onStop();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            try{
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage("Bạn có muốn thoát!!").setPositiveButton("Có", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        LuuQuatrinh();
                        Intent startMain = new Intent(play2048.this, MainActivity.class);
                        startMain.addCategory(Intent.CATEGORY_HOME);
                        startActivity(startMain);
                        finish();
                    }
                })
                               .setNegativeButton("Không", new DialogInterface.OnClickListener() {
                                   public void onClick(DialogInterface dialog, int id) {

                                   }
                               }).show();
            }catch (Exception e)
            {
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_play2048);
        anhxa();
        context = getIntent();
        try{
            if(context.getIntExtra("playgame",0) == 3)choitiep();
            else  khoitao();
        }catch (Exception e){
            khoitao();
        }
        final GestureDetector gestureDetector = new GestureDetector(this, new CuChiManHinh());
        khungman.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                gestureDetector.onTouchEvent(event);
                return true;
            }
        });
        quaylai.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                trove1buoc();
            }
        });
        reset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RESETGAME();
            }
        });
    }
    public void LuuQuatrinh()
    {
        database = new Database(this);
        database.setQuatrinh(matrix);
        if(Integer.valueOf(database.getDiemcao2048(this)) < scores)
        {
            database.setDiemcao2048(scores);
        }
        database.setDiemHT2048(scores);
        database.close();
    }
    public void RESETGAME()
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Bạn có muốn chơi lại!!").setPositiveButton("Có", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                khoitao();
            }
        })
                       .setNegativeButton("Không", new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialog, int id) {

                           }
                       }).show();
    }
    public void choitiep()
    {
        database = new Database(this);
        diemcao.setText(database.getDiemcao2048(this));
        scores = Integer .valueOf(database.getDiemHT2048(this));
        matrix = database.getQuatrinh(this);
        database.close();
        setLuumatrix();
        setBOX();
    }
    public void khoitao()
    {
        database = new Database(this);
        if(Integer.valueOf(database.getDiemcao2048(this)) < scores)
        {
            database.setDiemcao2048(scores);
        }
        diemcao.setText(database.getDiemcao2048(this));
        database.close();
        scores=0;
        for(int i=0;i<25;i++) matrix [i/5][i%5]=0;
        randdomnumber();
        randdomnumber();
        setLuumatrix();
        setBOX();
    }
    void anhxa()
    {
        matrix = new int[5][5];
        luumatrix = new int[5][5];
        diemso = (TextView) findViewById(R.id.diemso);
        diemcao = (TextView) findViewById(R.id.diemcao);
        khungman = (LinearLayout) findViewById(R.id.khungchoi);
        box11 = (ImageView) findViewById(R.id.box11);
        box12 = (ImageView) findViewById(R.id.box12);
        box13 = (ImageView) findViewById(R.id.box13);
        box14 = (ImageView) findViewById(R.id.box14);

        box21 = (ImageView) findViewById(R.id.box21);
        box22 = (ImageView) findViewById(R.id.box22);
        box23 = (ImageView) findViewById(R.id.box23);
        box24 = (ImageView) findViewById(R.id.box24);

        box31 = (ImageView) findViewById(R.id.box31);
        box32 = (ImageView) findViewById(R.id.box32);
        box33 = (ImageView) findViewById(R.id.box33);
        box34 = (ImageView) findViewById(R.id.box34);

        box41 = (ImageView) findViewById(R.id.box41);
        box42 = (ImageView) findViewById(R.id.box42);
        box43 = (ImageView) findViewById(R.id.box43);
        box44 = (ImageView) findViewById(R.id.box44);


        text11 = (TextView) findViewById(R.id.text11);
        text12 = (TextView) findViewById(R.id.text12);
        text13 = (TextView) findViewById(R.id.text13);
        text14 = (TextView) findViewById(R.id.text14);


        text21 = (TextView) findViewById(R.id.text21);
        text22 = (TextView) findViewById(R.id.text22);
        text23 = (TextView) findViewById(R.id.text23);
        text24 = (TextView) findViewById(R.id.text24);

        text31 = (TextView) findViewById(R.id.text31);
        text32 = (TextView) findViewById(R.id.text32);
        text33 = (TextView) findViewById(R.id.text33);
        text34 = (TextView) findViewById(R.id.text34);


        text41 = (TextView) findViewById(R.id.text41);
        text42 = (TextView) findViewById(R.id.text42);
        text43 = (TextView) findViewById(R.id.text43);
        text44 = (TextView) findViewById(R.id.text44);

        quaylai = (Button) findViewById(R.id.quaylai);
        reset = (Button)findViewById(R.id.reset);
    }
    public void trove1buoc()
    {
        boolean check = true;
        for(int i=1;i<25;i++)
        {
            if( matrix[i/5][i%5] != luumatrix[i/5][i%5])
            {
                check = false; break;
            }
        }
        if (check==true)
        {
            Toast.makeText(this,"Không thể quay lại", Toast.LENGTH_SHORT).show();
            return;
        }
        for(int i=1;i<25;i++) matrix[i/5][i%5] = luumatrix[i/5][i%5];
        setBOX();
    }
    public void setBOX()
    {
        diemso.setText(String.valueOf(scores));
        box11.setImageResource(getBackground(matrix[1][1]));
        box12.setImageResource(getBackground(matrix[1][2]));
        box13.setImageResource(getBackground(matrix[1][3]));
        box14.setImageResource(getBackground(matrix[1][4]));

        box21.setImageResource(getBackground(matrix[2][1]));
        box22.setImageResource(getBackground(matrix[2][2]));
        box23.setImageResource(getBackground(matrix[2][3]));
        box24.setImageResource(getBackground(matrix[2][4]));

        box31.setImageResource(getBackground(matrix[3][1]));
        box32.setImageResource(getBackground(matrix[3][2]));
        box33.setImageResource(getBackground(matrix[3][3]));
        box34.setImageResource(getBackground(matrix[3][4]));

        box41.setImageResource(getBackground(matrix[4][1]));
        box42.setImageResource(getBackground(matrix[4][2]));
        box43.setImageResource(getBackground(matrix[4][3]));
        box44.setImageResource(getBackground(matrix[4][4]));
        String matrixS[][]=new String[5][5];
        for(int i=0;i<25;i++)
        {
            if(matrix[i/5][i%5]==0) matrixS[i/5][i%5]="";
            else matrixS[i/5][i%5] = String.valueOf(matrix[i/5][i%5]);
        }
        setSizetext();
        text11.setText(matrixS[1][1]);
        text12.setText(matrixS[1][2]);
        text13.setText(matrixS[1][3]);
        text14.setText(matrixS[1][4]);
        text21.setText(matrixS[2][1]);
        text22.setText(matrixS[2][2]);
        text23.setText(matrixS[2][3]);
        text24.setText(matrixS[2][4]);
        text31.setText(matrixS[3][1]);
        text32.setText(matrixS[3][2]);
        text33.setText(matrixS[3][3]);
        text34.setText(matrixS[3][4]);
        text41.setText(matrixS[4][1]);
        text42.setText(matrixS[4][2]);
        text43.setText(matrixS[4][3]);
        text44.setText(matrixS[4][4]);
    }
    public  void setSizetext()
    {
        if(matrix[1][1] <= 512) text11.setTextSize(35);
        else text11.setTextSize(25);
        if(matrix[2][1] <=512) text21.setTextSize(35);
        else text21.setTextSize(25);
        if(matrix[3][1] <= 512) text31.setTextSize(35);
        else text31.setTextSize(25);
        if(matrix[4][1] <= 512) text41.setTextSize(35);
        else text41.setTextSize(25);

        if(matrix[1][2] <= 512) text12.setTextSize(35);
        else text12.setTextSize(25);
        if(matrix[2][2] <= 512) text22.setTextSize(35);
        else text22.setTextSize(25);
        if(matrix[3][2] <= 512) text32.setTextSize(35);
        else text32.setTextSize(25);
        if(matrix[4][2] <= 512) text42.setTextSize(35);
        else text42.setTextSize(25);

        if(matrix[1][3] <= 512) text13.setTextSize(35);
        else text13.setTextSize(25);
        if(matrix[2][3] <= 512) text23.setTextSize(35);
        else text23.setTextSize(25);
        if(matrix[3][3] <= 512) text33.setTextSize(35);
        else text33.setTextSize(25);
        if(matrix[4][3] <= 512) text43.setTextSize(35);
        else text43.setTextSize(25);


        if(matrix[1][4] <= 512) text14.setTextSize(35);
        else text14.setTextSize(25);
        if(matrix[2][4] <= 512) text24.setTextSize(35);
        else text24.setTextSize(25);
        if(matrix[3][4] <= 512) text34.setTextSize(35);
        else text34.setTextSize(25);
        if(matrix[4][4] <= 512) text44.setTextSize(35);
        else text44.setTextSize(25);

    }
    public int getBackground(int n)
    {
        if(n==0) return R.drawable.box0;
        switch (n%2048)
        {
            case 2: return R.drawable.box2;
            case 4: return R.drawable.box4;
            case 8: return R.drawable.box8;
            case 16: return R.drawable.box16;
            case 32: return R.drawable.box32;
            case 64: return R.drawable.box64;
            case 128: return R.drawable.box128;
            case 256: return R.drawable.box256;
            case 512: return R.drawable.box512;
            case 1024: return R.drawable.box1024;
            case 0: return R.drawable.box2048;
        }
        return 0;
    }

    class CuChiManHinh  extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            boolean check = false;
            setLuumatrix();
            if(e1.getX() - e2.getX() > 100 && Math.abs(e1.getY() - e2.getY()) <  Math.abs(e1.getX() - e2.getX()) && Math.abs(velocityX) > 100){
                for(int i=1;i<5;i++){
                    for(int j=1;j<4;j++)
                    {
                        if(matrix[i][j]!=0)
                        {
                            for(int k=j+1; k<5;k++)
                            {
                                if(matrix[i][k]==matrix[i][j])
                                {
                                    check = true;
                                    matrix[i][j]+=matrix[i][k];
                                    scores+=matrix[i][j];
                                    matrix[i][k]=0;j=k;break;
                                }else if(matrix[i][k]!=0) break;
                            }
                        }
                    }
                    for(int j=1;j<4;j++)
                    {
                        if(matrix[i][j] == 0)
                        {
                            for(int k=j+1; k<5;k++)
                            {
                                if(matrix[i][k]!=0)
                                {
                                    check = true;
                                    matrix[i][j]=matrix[i][k];
                                    matrix[i][k]=0; break;
                                }
                            }
                        }
                    }
                }
            }else if(e2.getX() - e1.getX() > 100  && Math.abs(e1.getY() - e2.getY()) <   Math.abs(e1.getX() - e2.getX()) && Math.abs(velocityX) > 100)
            {
                for(int i=1;i<5;i++){
                    for(int j=4;j>1;j--){

                        if( matrix[i][j]!=0)
                        {
                            for(int k=j-1; k>0;k--)
                            {
                                if(matrix[i][k]==matrix[i][j])
                                {
                                    check =true;
                                    matrix[i][j]+=matrix[i][k];
                                    scores+=matrix[i][j];
                                    matrix[i][k]=0; j = k; break;
                                }else if(matrix[i][k]!=0) break;
                            }
                        }
                    }
                    for(int j=4;j>1;j--)
                    {
                        if(matrix[i][j] == 0)
                        {
                            for(int k=j-1; k>0;k--)
                            {
                                if(matrix[i][k]!=0)
                                {
                                    check = true;
                                    matrix[i][j]=matrix[i][k];
                                    matrix[i][k]=0;  break;
                                }
                            }
                        }
                    }
                }
            }
            //vuot len
            else if(e1.getY() - e2.getY() > 100 && Math.abs(e1.getX() - e2.getX()) <   Math.abs(e1.getY() - e2.getY()) && Math.abs(velocityY) > 100){
                for(int i=1;i<5;i++)
                {
                    for(int j=1;j<4;j++){
                        if(matrix[j][i]!=0)
                        {
                            for(int k=j+1;k<5;k++)
                            {
                                if(matrix[k][i]==matrix[j][i])
                                {
                                    check=true;
                                    matrix[j][i] += matrix[k][i];
                                    scores+=matrix[j][i];
                                    matrix[k][i]=0; j=k; break;
                                }if(matrix[k][i]!=0) break;
                            }
                        }
                    }
                    for(int j=1;j<4;j++)
                    {
                        if(matrix[j][i] == 0)
                        {
                            for(int k=j+1;k<5;k++)
                            {
                                if(matrix[k][i]!=0)
                                {
                                    check = true;
                                    matrix[j][i] = matrix[k][i];
                                    matrix[k][i]=0; break;
                                }
                            }
                        }
                    }
                }
            }
            //vuot xuong
            else if(e2.getY() - e1.getY() > 100  && Math.abs(e1.getX() - e2.getX()) <   Math.abs(e1.getY() - e2.getY()) && Math.abs(velocityY) > 100)
            {
                for(int i=1;i<5;i++)
                {
                    for(int j=4;j>1;j--)
                    {
                        if(matrix[j][i] != 0)
                        {
                            for(int k=j-1;k>0;k--)
                            {
                                if(matrix[k][i]==matrix[j][i])
                                {
                                    check=true;
                                    matrix[j][i]+= matrix[k][i];
                                    scores+=matrix[j][i];
                                    matrix[k][i]=0; j=k; break;
                                }else if(matrix[k][i] != 0) break;
                            }
                        }
                    }
                    for(int j=4;j>1;j--)
                    {
                        if(matrix[j][i] == 0)
                        {
                            for(int k=j-1;k>0;k--)
                            {
                                if(matrix[k][i]!=0)
                                {
                                    check = true;
                                    matrix[j][i] = matrix[k][i];
                                    matrix[k][i]=0; break;
                                }
                            }
                        }
                    }
                }
            }
            if(check==true)randdomnumber();
            gameove();
            setBOX();
            return super.onFling(e1, e2, velocityX, velocityY);
        }
    }
    public void randdomnumber()
    {
        Random random = new Random();
        while(true)
        {
            int i=random.nextInt(4)+1, j=random.nextInt(4)+1;
            if(matrix[i][j]==0)
            {
                if(random.nextInt(11) < 10
                ) matrix[i][j]=2;
                else matrix[i][j]=4;
                break;
            }
        }
    }
    public void setLuumatrix(){
        for(int i=1;i<25;i++) luumatrix[i/5][i%5] = matrix[i/5][i%5];
    }
    public void gameove()
    {
        for(int i=1;i<5;i++)
            for(int j=1;j<5;j++)
                if(matrix[i][j] == 0)
                    return;
        boolean check = false;
        for(int i=1;i<5;i++)
        {
            for(int j=1;j<4;j++)
            {
                if(matrix[i][j] == matrix[i][j+1]) check=true;
                if(matrix[j][i]== matrix[j+1][i]) check = true;
            }
        }
        if(check==false)
        {
            final Dialog dialog = new Dialog(this);
            dialog.setCancelable(false);
            dialog.setContentView(R.layout.game_over);
            dialog.show();
            final Button menu = (Button) dialog.findViewById(R.id.menu);
            Button Again = (Button) dialog.findViewById(R.id.Again) ;
            TextView diemso = (TextView) dialog.findViewById(R.id.diemso);
            TextView diemcao = (TextView) dialog.findViewById(R.id.diemcao);
            diemso.setText("New "+String.valueOf(scores));
            Database  database;
            database = new Database(this);
            if(Integer.valueOf(database.getDiemcao2048(this)) < scores){
                database.setDiemcao2048(scores);
            }
            database.close();
            database = new Database(this);
            diemcao.setText("Best "+database.getDiemcao2048(this));
            database.close();
            menu.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    startActivity(new Intent(play2048.this, MainActivity.class));
                }
            });
            Again.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    khoitao();
                    dialog.cancel();
                }
            });
        }
    }
}

Các file giao diện XML

activity_main.xml – Giao diện bắt đầu trò chơi



    
    
    


activity_play2048.xml – Giao diện màn hình trò chơi



    
        
            
        
        
            

                
                    
                        
                    
                    
                        
                    
                


                
                    
                        
                    
                    
                        
                    
                
            
            
                
                    
                
                
                    
                
            
        
    

    
        
            
                
                
            
            
                
                
            
            
                
                
            
            
                
                
            
        

        
            
                
                
            
            
                
                
            
            
                
                
            
            
                
                
            
        

        
            
                
                
            
            
                
                
            
            
                
                
            
            
                
                
            
        

        
            
                
                
            
            
                
                
            
            
                
                
            
            
                
                
            
        
    

    

    

game_over.xml – Giao diện Dialog trò chơi kết thúc



    
    
    
    
        
        
    

0
0
Phiếu bầu chọn

Xếp hạng bài viết

Source: https://vh2.com.vn
Category : Tin Học