diff --git a/Game2048/.gitignore b/Game2048/.gitignore
new file mode 100644
index 0000000..603b140
--- /dev/null
+++ b/Game2048/.gitignore
@@ -0,0 +1,14 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
diff --git a/Game2048/.idea/codeStyles/Project.xml b/Game2048/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000..681f41a
--- /dev/null
+++ b/Game2048/.idea/codeStyles/Project.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ xmlns:android
+
+ ^$
+
+
+
+
+
+
+
+
+ xmlns:.*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:id
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:name
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ name
+
+ ^$
+
+
+
+
+
+
+
+
+ style
+
+ ^$
+
+
+
+
+
+
+
+
+ .*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+
+ http://schemas.android.com/apk/res/android
+
+
+ ANDROID_ATTRIBUTE_ORDER
+
+
+
+
+
+
+ .*
+
+ .*
+
+
+ BY_NAME
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Game2048/.idea/gradle.xml b/Game2048/.idea/gradle.xml
new file mode 100644
index 0000000..d291b3d
--- /dev/null
+++ b/Game2048/.idea/gradle.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Game2048/.idea/misc.xml b/Game2048/.idea/misc.xml
new file mode 100644
index 0000000..37a7509
--- /dev/null
+++ b/Game2048/.idea/misc.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Game2048/.idea/runConfigurations.xml b/Game2048/.idea/runConfigurations.xml
new file mode 100644
index 0000000..7f68460
--- /dev/null
+++ b/Game2048/.idea/runConfigurations.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Game2048/app/.gitignore b/Game2048/app/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/Game2048/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/Game2048/app/build.gradle b/Game2048/app/build.gradle
new file mode 100644
index 0000000..93fb20a
--- /dev/null
+++ b/Game2048/app/build.gradle
@@ -0,0 +1,29 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 33
+ buildToolsVersion "33.0.2"
+ defaultConfig {
+ applicationId "com.example.game2048"
+ minSdkVersion 29
+ targetSdkVersion 33
+ versionCode 1
+ versionName "1.0"
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation 'androidx.appcompat:appcompat:1.0.2'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.0'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
+}
diff --git a/Game2048/app/proguard-rules.pro b/Game2048/app/proguard-rules.pro
new file mode 100644
index 0000000..f1b4245
--- /dev/null
+++ b/Game2048/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/Game2048/app/src/androidTest/java/com/example/game2048/ExampleInstrumentedTest.java b/Game2048/app/src/androidTest/java/com/example/game2048/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..7ebdf6b
--- /dev/null
+++ b/Game2048/app/src/androidTest/java/com/example/game2048/ExampleInstrumentedTest.java
@@ -0,0 +1,27 @@
+package com.example.game2048;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+ assertEquals("com.example.game2048", appContext.getPackageName());
+ }
+}
diff --git a/Game2048/app/src/main/AndroidManifest.xml b/Game2048/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..14a1448
--- /dev/null
+++ b/Game2048/app/src/main/AndroidManifest.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Game2048/app/src/main/java/com/example/game2048/BastScode.java b/Game2048/app/src/main/java/com/example/game2048/BastScode.java
new file mode 100644
index 0000000..5717521
--- /dev/null
+++ b/Game2048/app/src/main/java/com/example/game2048/BastScode.java
@@ -0,0 +1,26 @@
+package com.example.game2048;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+/**
+ * Created by hasee on 2018/3/18.
+ */
+
+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();
+ }
+}
\ No newline at end of file
diff --git a/Game2048/app/src/main/java/com/example/game2048/Card.java b/Game2048/app/src/main/java/com/example/game2048/Card.java
new file mode 100644
index 0000000..a4ebcbf
--- /dev/null
+++ b/Game2048/app/src/main/java/com/example/game2048/Card.java
@@ -0,0 +1,104 @@
+package com.example.game2048;
+
+import android.content.Context;
+import android.view.Gravity;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+/**
+ * Created by hasee on 2018/3/13.
+ */
+
+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;// #F2B179
+ break;
+ 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();
+ }
+
+
+}
diff --git a/Game2048/app/src/main/java/com/example/game2048/Code.java b/Game2048/app/src/main/java/com/example/game2048/Code.java
new file mode 100644
index 0000000..94b0b20
--- /dev/null
+++ b/Game2048/app/src/main/java/com/example/game2048/Code.java
@@ -0,0 +1,135 @@
+package com.example.game2048;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+
+import java.util.Random;
+
+public class Code {
+
+ //随机数数组
+ private static final char[] CHARS = {
+ '2', '3', '4', '5', '6', '7', '8', '9',
+ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm',
+ 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+ 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
+ };
+
+ private static Code bmpCode;
+
+ public static Code getInstance() {
+ if(bmpCode == null)
+ bmpCode = new Code();
+ return bmpCode;
+ }
+
+ //default settings
+ //验证码默认随机数的个数
+ private static final int DEFAULT_CODE_LENGTH = 4;
+ //默认字体大小
+ private static final int DEFAULT_FONT_SIZE = 25;
+ //默认线条的条数
+ private static final int DEFAULT_LINE_NUMBER = 5;
+ //padding值
+ private static final int BASE_PADDING_LEFT = 10, RANGE_PADDING_LEFT = 15, BASE_PADDING_TOP = 15, RANGE_PADDING_TOP = 20;
+ //验证码的默认宽高
+ private static final int DEFAULT_WIDTH = 100, DEFAULT_HEIGHT = 40;
+
+ //settings decided by the layout xml
+ //canvas width and height
+ private int width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT;
+
+ //random word space and pading_top
+ private int base_padding_left = BASE_PADDING_LEFT, range_padding_left = RANGE_PADDING_LEFT,
+ base_padding_top = BASE_PADDING_TOP, range_padding_top = RANGE_PADDING_TOP;
+
+ //number of chars, lines; font size
+ private int codeLength = DEFAULT_CODE_LENGTH, line_number = DEFAULT_LINE_NUMBER, font_size = DEFAULT_FONT_SIZE;
+
+ //variables
+ private String code;
+ private int padding_left, padding_top;
+ private Random random = new Random();
+ //验证码图片
+ public Bitmap createBitmap() {
+ padding_left = 0;
+
+ Bitmap bp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ Canvas c = new Canvas(bp);
+
+ code = createCode();
+
+ c.drawColor(Color.WHITE);
+ Paint paint = new Paint();
+ paint.setAntiAlias(true);
+ paint.setTextSize(font_size);
+ //画验证码
+ for (int i = 0; i < code.length(); i++) {
+ randomTextStyle(paint);
+ randomPadding();
+ c.drawText(code.charAt(i) + "", padding_left, padding_top, paint);
+ }
+ //画线条
+ for (int i = 0; i < line_number; i++) {
+ drawLine(c, paint);
+ }
+
+ c.save();//保存
+ c.restore();//
+ return bp;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ //生成验证码
+ private String createCode() {
+ StringBuilder buffer = new StringBuilder();
+ for (int i = 0; i < codeLength; i++) {
+ buffer.append(CHARS[random.nextInt(CHARS.length)]);
+ }
+ return buffer.toString();
+ }
+ //画干扰线
+ private void drawLine(Canvas canvas, Paint paint) {
+ int color = randomColor();
+ int startX = random.nextInt(width);
+ int startY = random.nextInt(height);
+ int stopX = random.nextInt(width);
+ int stopY = random.nextInt(height);
+ paint.setStrokeWidth(1);
+ paint.setColor(color);
+ canvas.drawLine(startX, startY, stopX, stopY, paint);
+ }
+ //生成随机颜色
+ private int randomColor() {
+ return randomColor(1);
+ }
+
+ private int randomColor(int rate) {
+ int red = random.nextInt(256) / rate;
+ int green = random.nextInt(256) / rate;
+ int blue = random.nextInt(256) / rate;
+ return Color.rgb(red, green, blue);
+ }
+ //随机生成文字样式,颜色,粗细,倾斜度
+ private void randomTextStyle(Paint paint) {
+ int color = randomColor();
+ paint.setColor(color);
+ paint.setFakeBoldText(random.nextBoolean()); //true为粗体,false为非粗体
+ float skewX = random.nextInt(11) / 10;
+ skewX = random.nextBoolean() ? skewX : -skewX;
+ paint.setTextSkewX(skewX); //float类型参数,负数表示右斜,整数左斜
+ //paint.setUnderlineText(true); //true为下划线,false为非下划线
+ //paint.setStrikeThruText(true); //true为删除线,false为非删除线
+ }
+ //随机生成padding值
+ private void randomPadding() {
+ padding_left += base_padding_left + random.nextInt(range_padding_left);
+ padding_top = base_padding_top + random.nextInt(range_padding_top);
+ }
+}
\ No newline at end of file
diff --git a/Game2048/app/src/main/java/com/example/game2048/DBOpenHelper.java b/Game2048/app/src/main/java/com/example/game2048/DBOpenHelper.java
new file mode 100644
index 0000000..783eafe
--- /dev/null
+++ b/Game2048/app/src/main/java/com/example/game2048/DBOpenHelper.java
@@ -0,0 +1,54 @@
+package com.example.game2048;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+import java.util.ArrayList;
+
+public class DBOpenHelper extends SQLiteOpenHelper {
+ private SQLiteDatabase db;
+
+ public DBOpenHelper(Context context){
+ super(context,"db_map",null,1);
+ db = getReadableDatabase();
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db){
+ db.execSQL("CREATE TABLE IF NOT EXISTS user(" +
+ "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
+ "name TEXT," +
+ "password TEXT)");
+ }
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
+ db.execSQL("DROP TABLE IF EXISTS user");
+ onCreate(db);
+ }
+
+ public void add(String name,String password){
+ db.execSQL("INSERT INTO user (name,password) VALUES(?,?)",new Object[]{name,password});
+ }
+ public void delete(String name,String password){
+ db.execSQL("DELETE FROM user WHERE name = AND password ="+name+password);
+ }
+ public void updata(String password){
+ db.execSQL("UPDATE user SET password = ?",new Object[]{password});
+ }
+
+
+ public ArrayList getAllData(){
+
+ ArrayList list = new ArrayList();
+ Cursor cursor = db.query("user",null,null,null,null,null,"name DESC");
+ while(cursor.moveToNext()){
+ String name = cursor.getString(cursor.getColumnIndex("name"));
+ String password = cursor.getString(cursor.getColumnIndex("password"));
+ list.add(new User(name,password));
+ }
+ return list;
+ }
+}
+
diff --git a/Game2048/app/src/main/java/com/example/game2048/GameActivity.java b/Game2048/app/src/main/java/com/example/game2048/GameActivity.java
new file mode 100644
index 0000000..28acbad
--- /dev/null
+++ b/Game2048/app/src/main/java/com/example/game2048/GameActivity.java
@@ -0,0 +1,165 @@
+package com.example.game2048;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.TextView;
+import android.widget.Toast;
+import androidx.appcompat.app.AlertDialog;
+
+import androidx.annotation.RequiresApi;
+
+
+public class GameActivity extends Activity implements View.OnClickListener{
+ public TextView tvScrore;//计分的
+ public TextView tvBestScore;//最高分
+ public int score = 0;
+ private int bestScores;//历史最高成绩
+ private Button bt;
+ private Button bk;
+ private ImageButton music;
+
+ private static GameActivity gameActivity = null;
+ public GameActivity(){
+ gameActivity = this;
+ }
+
+ public static GameActivity getGameActivity() {
+ return gameActivity;
+ }
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.game);
+ inital();
+ initEvent();
+ getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
+
+ music=findViewById(R.id.music);
+ music.setOnClickListener(new View.OnClickListener(){
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ public void onClick(View v){
+ if(MyService.isplay==false){
+ startService(new Intent(GameActivity.this,MyService.class));
+ ((ImageButton)v).setImageDrawable(getResources().getDrawable(R.drawable.mo,null));
+ }else {
+ stopService(new Intent(GameActivity.this,MyService.class));
+ ((ImageButton)v).setImageDrawable(getResources().getDrawable(R.drawable.mc,null));
+ }
+ }
+ });
+ }
+
+ @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);
+ bk = (Button)findViewById(R.id.bk);
+ bk.setOnClickListener(this);
+ BastScode bastScode = new BastScode(this);
+ bestScores = bastScode.getBestScode();
+ tvBestScore.setText(bestScores+"");
+ }
+
+ @Override
+ public void onClick(View v) {
+ GameView.getGameView().startGame();
+ switch (v.getId()) {
+ case R.id.bk:
+ Intent intent = new Intent(GameActivity.this, MenuActivity.class);
+ startActivity(intent);
+ finish();
+ break;
+ }
+ }
+
+ 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);
+ }
+
+ @Override
+ protected void onStart(){
+ stopService(new Intent(GameActivity.this,MyService.class));
+ super.onStart();
+ }
+
+ private void initEvent() {
+ findViewById(R.id.bt_wf).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ showDialog();
+ }
+ });
+ }
+
+ private void showDialog(){
+ AlertDialog.Builder builder=new AlertDialog.Builder(this);
+ builder.setTitle("玩法");
+ builder.setMessage("1、手指向一个方向滑动,所有格子会向那个方向运动。\n" +
+ "\n" +
+ "2、相同数字的两个格子,相撞时数字会相加。\n" +
+ "\n" +
+ "3、每次滑动时,空白处会随机刷新出一个数字的格子。");
+ builder.setPositiveButton("我知道了",
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+
+ }
+ });
+ AlertDialog dialog=builder.create();
+ dialog.show();
+
+ }
+
+}
+
diff --git a/Game2048/app/src/main/java/com/example/game2048/GameActivityII.java b/Game2048/app/src/main/java/com/example/game2048/GameActivityII.java
new file mode 100644
index 0000000..1ac45c7
--- /dev/null
+++ b/Game2048/app/src/main/java/com/example/game2048/GameActivityII.java
@@ -0,0 +1,165 @@
+package com.example.game2048;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.TextView;
+import android.widget.Toast;
+import androidx.appcompat.app.AlertDialog;
+
+import androidx.annotation.RequiresApi;
+
+
+public class GameActivityII extends Activity implements View.OnClickListener{
+ public TextView Scrore;//计分的
+ public TextView BestScore;//最高分
+ public int score = 0;
+ private int bestScores;//历史最高成绩
+ private Button bt;
+ private Button bk;
+ private ImageButton music;
+
+ private static GameActivityII gameActivityII = null;
+ public GameActivityII(){
+ gameActivityII = this;
+ }
+
+ public static GameActivityII getGameActivity() {
+ return gameActivityII;
+ }
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.game2);
+ inital();
+ initEvent();
+ getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
+
+ music=findViewById(R.id.music2);
+ music.setOnClickListener(new View.OnClickListener(){
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ public void onClick(View v){
+ if(MyService.isplay==false){
+ startService(new Intent(GameActivityII.this,MyService.class));
+ ((ImageButton)v).setImageDrawable(getResources().getDrawable(R.drawable.mo,null));
+ }else {
+ stopService(new Intent(GameActivityII.this,MyService.class));
+ ((ImageButton)v).setImageDrawable(getResources().getDrawable(R.drawable.mc,null));
+ }
+ }
+ });
+ }
+
+ @SuppressLint("SetTextI18n")
+ public void inital() {
+ BestScore = (TextView) findViewById(R.id.mSorce);
+ Scrore = (TextView) findViewById(R.id.Sorce);
+ bt = (Button)findViewById(R.id.cx);
+ bt.setOnClickListener(this);
+ bk = (Button)findViewById(R.id.bk2);
+ bk.setOnClickListener(this);
+ BastScode bastScode = new BastScode(this);
+ bestScores = bastScode.getBestScode();
+ BestScore.setText(bestScores+"");
+ }
+
+ @Override
+ public void onClick(View v) {
+ GameViewII.getGameView().startGame();
+ switch (v.getId()) {
+ case R.id.bk2:
+ Intent intent = new Intent(GameActivityII.this, MenuActivity.class);
+ startActivity(intent);
+ finish();
+ break;
+ }
+ }
+
+ public void clearScore(){
+ score = 0;
+ showScore();
+ }
+ public void showScore(){
+ Scrore.setText(score+"");
+ }
+ public void addScore(int s){
+ score+=s;
+ showScore();
+ if (score > bestScores){
+ bestScores = score;
+ BastScode bs = new BastScode(this);
+ bs.setBestScode(bestScores);
+ BestScore.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);
+ }
+
+ @Override
+ protected void onStart(){
+ stopService(new Intent(GameActivityII.this,MyService.class));
+ super.onStart();
+ }
+
+ private void initEvent() {
+ findViewById(R.id.wf).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ showDialog();
+ }
+ });
+ }
+
+ private void showDialog(){
+ AlertDialog.Builder builder=new AlertDialog.Builder(this);
+ builder.setTitle("玩法");
+ builder.setMessage("1、手指向一个方向滑动,所有格子会向那个方向运动。\n" +
+ "\n" +
+ "2、相同数字的两个格子,相撞时数字会相加。\n" +
+ "\n" +
+ "3、每次滑动时,空白处会随机刷新出一个数字的格子。");
+ builder.setPositiveButton("我知道了",
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+
+ }
+ });
+ AlertDialog dialog=builder.create();
+ dialog.show();
+
+ }
+
+}
+
diff --git a/Game2048/app/src/main/java/com/example/game2048/GameView.java b/Game2048/app/src/main/java/com/example/game2048/GameView.java
new file mode 100644
index 0000000..1621455
--- /dev/null
+++ b/Game2048/app/src/main/java/com/example/game2048/GameView.java
@@ -0,0 +1,364 @@
+package com.example.game2048;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.graphics.Point;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.GridLayout;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 游戏界面类
+ */
+
+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 points = new ArrayList();
+
+ 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; //偏移的值
+
+ @Override
+ public 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);
+ }
+ }
+ GameActivity.getGameActivity().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);
+
+
+ GameActivity.getGameActivity().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);
+ GameActivity.getGameActivity().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);
+ GameActivity.getGameActivity().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);
+ GameActivity.getGameActivity().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("2048").setMessage("游戏结束了").setPositiveButton("重来", new DialogInterface.OnClickListener() {
+ @Override
+ public 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("2048").setMessage("你赢了").setPositiveButton("重来", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ startGame();
+ }
+ }).show();
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Game2048/app/src/main/java/com/example/game2048/GameViewII.java b/Game2048/app/src/main/java/com/example/game2048/GameViewII.java
new file mode 100644
index 0000000..a302a03
--- /dev/null
+++ b/Game2048/app/src/main/java/com/example/game2048/GameViewII.java
@@ -0,0 +1,364 @@
+package com.example.game2048;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.graphics.Point;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.GridLayout;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 游戏界面类
+ */
+
+public class GameViewII extends GridLayout {
+ //我们需要定义一个二维数组来记录GameView初始化时生成的25个卡片类
+ private Card[][] cardsMap = new Card[5][5];
+
+ private static GameViewII gameView = null;
+
+
+ public static GameViewII getGameView() {
+ return gameView;
+ }
+
+ private List points = new ArrayList();
+
+ public GameViewII(Context context) {
+ super(context);
+ gameView = this;
+ initGameView();
+ }
+
+ public GameViewII(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ gameView = this;
+ initGameView();
+ }
+
+ public GameViewII(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ gameView = this;
+ initGameView();
+ }
+
+
+ /**
+ * 初始化界面
+ */
+ private void initGameView(){
+ Log.d("233","0");
+ setColumnCount(5); //指名是4列的
+ setBackgroundColor(0xffbbada0);
+ addCards(getCardWitch(),getCardWitch());
+ startGame();
+ setOnTouchListener(new OnTouchListener() {
+ private float startX,startY;//初始的位置
+ private float offsetX,offsetY; //偏移的值
+
+ @Override
+ public 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 < -6) {
+ Log.d("233","left");
+ swipeLeft();
+
+ } else if (offsetX > 6) {
+ Log.d("233","right");
+ swipeRight();
+ }
+ }else {
+ if (offsetY < -6){
+ Log.d("233","up");
+ swipeUp();
+ }else if (offsetY>6){
+ 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< 5;y++){
+ for(int x = 0;x < 5;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)/5;
+ }
+ public void startGame(){
+
+ for (int y = 0;y<5;y++){
+ for (int x = 0;x < 5;x++) {
+ cardsMap[x][y].setNum(0);
+ }
+ }
+ GameActivityII.getGameActivity().score = 0;
+ addRondomNum();
+ addRondomNum();
+
+ }
+
+ private void addRondomNum(){
+ points.clear();
+
+ for (int y = 0;y < 5;y++){
+ for (int x = 0;x <5;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<5;y++){
+ for (int x = 0; x < 5;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 < 5; y++) {
+ for (int x = 0; x < 5; x++) {
+
+ for (int x1 = x+1; x1 < 5; 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);
+
+
+ GameActivityII.getGameActivity().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 < 5; y++) {
+ for (int x = 5-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);
+ GameActivityII.getGameActivity().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 < 5; x++) {
+ for (int y = 0; y < 5; y++) {
+
+ for (int y1 = y+1; y1 < 5; 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);
+ GameActivityII.getGameActivity().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 < 5; x++) {
+ for (int y = 5-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);
+ GameActivityII.getGameActivity().addScore(cardsMap[x][y].getNum());
+ //只要有移动就要加随机数
+ merge = true;
+ }
+ break;
+
+ }
+ }
+ }
+ }
+ if (merge) {
+ addRandomNum();
+ check();
+ }
+ }
+ /**
+ * 判断游戏结束的
+ * 界面格子全满了且相邻的格子没有相同的数字
+ */
+ private void check(){
+ boolean complete = true;
+ ALL: for(int y = 0;y <5;y++){
+ for(int x = 0;x<5;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("2048").setMessage("游戏结束了").setPositiveButton("重来", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ startGame();
+ }
+ }).show();
+ }
+ /**
+ * 这个是判定赢了的逻辑
+ * 只要有一个格子的数字是2048就赢了
+ */
+ for (int x = 0;x < 5;x++){
+ for(int y = 0;y < 5;y++){
+ if (cardsMap[x][y].getNum()==2048){
+ new AlertDialog.Builder(getContext()).setTitle("2048").setMessage("你赢了").setPositiveButton("重来", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ startGame();
+ }
+ }).show();
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Game2048/app/src/main/java/com/example/game2048/MainActivity.java b/Game2048/app/src/main/java/com/example/game2048/MainActivity.java
new file mode 100644
index 0000000..4965523
--- /dev/null
+++ b/Game2048/app/src/main/java/com/example/game2048/MainActivity.java
@@ -0,0 +1,121 @@
+package com.example.game2048;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import java.util.ArrayList;
+
+public class MainActivity extends AppCompatActivity implements View.OnClickListener {
+
+ private String realCode;
+ private DBOpenHelper mDBOpenHelper;
+ private EditText mEtLoginactivityUsername;
+ private EditText mEtLoginactivityPassword;
+ private Button mBtLoginactivityLogin;
+ private Button mBtLoginactivityRegister;
+ private EditText mEtloginactivityPhonecodes;
+ private ImageView mIvloginactivityShowcode;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+ initView();
+
+ mDBOpenHelper = new DBOpenHelper(this);
+
+ //将验证码用图片的形式显示出来
+ mIvloginactivityShowcode.setImageBitmap(Code.getInstance().createBitmap());
+ realCode = Code.getInstance().getCode().toLowerCase();
+
+
+ }
+
+ private void initView() {
+ // 初始化控件
+ mBtLoginactivityLogin = findViewById(R.id.login);
+ mBtLoginactivityRegister = findViewById(R.id.register);
+ mEtLoginactivityUsername = findViewById(R.id.username);
+ mEtLoginactivityPassword = findViewById(R.id.password);
+ mEtloginactivityPhonecodes = findViewById(R.id.phoneCodes);
+ mIvloginactivityShowcode = findViewById(R.id.showCode);
+
+ // 设置点击事件监听器
+ mBtLoginactivityLogin.setOnClickListener(this);
+ mBtLoginactivityRegister.setOnClickListener(this);
+ mIvloginactivityShowcode.setOnClickListener(this);
+
+ }
+
+ public void onClick(View view) {
+ switch (view.getId()) {
+
+ case R.id.register:
+ Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
+ startActivity(intent);
+ finish();
+ break;
+
+ case R.id.showCode: //改变随机验证码的生成
+ mIvloginactivityShowcode.setImageBitmap(Code.getInstance().createBitmap());
+ realCode = Code.getInstance().getCode().toLowerCase();
+ break;
+ case R.id.login:
+ String name = mEtLoginactivityUsername.getText().toString().trim();
+ String password = mEtLoginactivityPassword.getText().toString().trim();
+ String phoneCode = mEtloginactivityPhonecodes.getText().toString().toLowerCase();
+
+ if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(password)&&!TextUtils.isEmpty(phoneCode)) {
+ if (phoneCode.equals(realCode)) {
+ ArrayList data = mDBOpenHelper.getAllData();
+ boolean match = false;
+ for (int i = 0; i < data.size(); i++) {
+ User user = data.get(i);
+ if (name.equals(user.getName()) && password.equals(user.getPassword())) {
+ match = true;
+ break;
+ } else {
+ match = false;
+ }
+ }
+
+ if (match) {
+ Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
+ Intent intent1 = new Intent(this, MenuActivity.class);
+ //获取输入的姓名
+ String account = mEtLoginactivityUsername.getText().toString();
+ //将获得的姓名通过intent的putExtra方法传递到界面2
+ intent1.putExtra("Name",account);
+ startActivity(intent1);
+ finish();//销毁此Activity
+ } else {
+ Toast.makeText(this, "用户名或密码不正确,请重新输入", Toast.LENGTH_SHORT).show();
+ }
+ }else {
+ Toast.makeText(this, "验证码错误,注册失败", Toast.LENGTH_SHORT).show();
+ }
+ } else {
+ Toast.makeText(this, "请输入你的用户名或密码", Toast.LENGTH_SHORT).show();
+ }break;
+
+
+ }
+
+
+ }
+}
+
+
+
+
+
diff --git a/Game2048/app/src/main/java/com/example/game2048/MenuActivity.java b/Game2048/app/src/main/java/com/example/game2048/MenuActivity.java
new file mode 100644
index 0000000..fccc539
--- /dev/null
+++ b/Game2048/app/src/main/java/com/example/game2048/MenuActivity.java
@@ -0,0 +1,43 @@
+package com.example.game2048;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+public class MenuActivity extends AppCompatActivity {
+ public TextView hy;
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.menu);//调用xml中activity_main。
+ Button b1 = (Button) this.findViewById(R.id.bt_ks);
+ b1.setOnClickListener(new ButtonListenerI());
+ Button b2 = (Button) this.findViewById(R.id.bt_st);
+ b2.setOnClickListener(new ButtonListenerII());
+
+ Intent intent = getIntent();
+ String hy = intent.getStringExtra("Name");
+ TextView textView = (TextView)findViewById(R.id.hy);
+ textView.setText("Hello, "+hy);
+ }
+ private class ButtonListenerI implements View.OnClickListener{
+ @Override
+ public void onClick(View v){
+ Intent intent=new Intent(MenuActivity.this,GameActivity.class);//设置切换对应activity
+ startActivity(intent);//开始切换
+ }
+ }
+
+ private class ButtonListenerII implements View.OnClickListener{
+ @Override
+ public void onClick(View v){
+ Intent intent=new Intent(MenuActivity.this,GameActivityII.class);//设置切换对应activity
+ startActivity(intent);//开始切换
+ }
+ }
+}
diff --git a/Game2048/app/src/main/java/com/example/game2048/MyService.java b/Game2048/app/src/main/java/com/example/game2048/MyService.java
new file mode 100644
index 0000000..400c45a
--- /dev/null
+++ b/Game2048/app/src/main/java/com/example/game2048/MyService.java
@@ -0,0 +1,41 @@
+package com.example.game2048;
+
+import android.app.Service;
+import android.content.Intent;
+import android.media.MediaPlayer;
+import android.os.IBinder;
+
+public class MyService extends Service {
+ public MyService() {
+ }
+ static boolean isplay; //定义播放状态
+ MediaPlayer player;
+ @Override
+ public IBinder onBind(Intent intent) {
+ // TODO: Return the communication channel to the service.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ @Override
+ public void onCreate(){
+ player=MediaPlayer.create(this,R.raw.summer);
+ }
+
+ @Override
+ public int onStartCommand(Intent intent,int flags,int startId){
+ if (!player.isPlaying()) {
+ player.start();
+ isplay=player.isPlaying();
+ }
+ return super.onStartCommand(intent,flags,startId);
+ }
+
+ @Override
+ public void onDestroy(){
+ player.stop();
+ isplay=player.isPlaying();
+ player.release();
+ super.onDestroy();
+ }
+}
+
diff --git a/Game2048/app/src/main/java/com/example/game2048/RegisterActivity.java b/Game2048/app/src/main/java/com/example/game2048/RegisterActivity.java
new file mode 100644
index 0000000..be4434a
--- /dev/null
+++ b/Game2048/app/src/main/java/com/example/game2048/RegisterActivity.java
@@ -0,0 +1,95 @@
+package com.example.game2048;
+
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+
+public class RegisterActivity extends AppCompatActivity implements View.OnClickListener {
+
+ private String realCode;
+ private DBOpenHelper mDBOpenHelper;
+ private Button mBtRegisteractivityRegister;
+ private EditText mEtRegisteractivityUsername;
+ private EditText mEtRegisteractivityPassword1;
+ private EditText mEtRegisteractivityPassword2;
+ private EditText mEtRegisteractivityPhonecodes;
+ private ImageView mIvRegisteractivityShowcode;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.register);
+
+ initView();
+
+ mDBOpenHelper = new DBOpenHelper(this);
+
+ //将验证码用图片的形式显示出来
+ mIvRegisteractivityShowcode.setImageBitmap(Code.getInstance().createBitmap());
+ realCode = Code.getInstance().getCode().toLowerCase();
+ }
+
+ private void initView(){
+ mBtRegisteractivityRegister = findViewById(R.id.button);
+ mEtRegisteractivityUsername = findViewById(R.id.reg_username);
+ mEtRegisteractivityPassword1 = findViewById(R.id.reg_password);
+ mEtRegisteractivityPassword2 = findViewById(R.id.reg_sure_password);
+ mEtRegisteractivityPhonecodes = findViewById(R.id.et_registeractivity_phoneCodes);
+ mIvRegisteractivityShowcode = findViewById(R.id.showCode);
+
+ /**
+ * 注册页面能点击的就三个地方
+ * top处返回箭头、刷新验证码图片、注册按钮
+ */
+ mIvRegisteractivityShowcode.setOnClickListener(this);
+ mBtRegisteractivityRegister.setOnClickListener(this);
+ }
+
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.showCode: //改变随机验证码的生成
+ mIvRegisteractivityShowcode.setImageBitmap(Code.getInstance().createBitmap());
+ realCode = Code.getInstance().getCode().toLowerCase();
+ break;
+ case R.id.button: //注册按钮
+ //获取用户输入的用户名、密码、验证码
+ String username = mEtRegisteractivityUsername.getText().toString().trim();
+ String password1 = mEtRegisteractivityPassword1.getText().toString().trim();
+ String password2 = mEtRegisteractivityPassword2.getText().toString().trim();
+ String phoneCode = mEtRegisteractivityPhonecodes.getText().toString().toLowerCase();
+ //注册验证
+ if (!TextUtils.isEmpty(username) && !TextUtils.isEmpty(password1)&& !TextUtils.isEmpty(password2) && !TextUtils.isEmpty(phoneCode) ) {
+ if (phoneCode.equals(realCode)) {
+ if (!(password1==password2)) {
+ //将用户名和密码加入到数据库中
+ mDBOpenHelper.add(username, password2);
+ Intent intent2 = new Intent(this, MainActivity.class);
+ startActivity(intent2);
+ finish();
+ Toast.makeText(this, "验证通过,注册成功", Toast.LENGTH_SHORT).show();
+ }else
+ {
+ Toast.makeText(this, "密码输入不一致,请重新输入", Toast.LENGTH_SHORT).show();
+ }
+ } else {
+ Toast.makeText(this, "验证码错误,注册失败", Toast.LENGTH_SHORT).show();
+ }
+ }else {
+ Toast.makeText(this, "未完善信息,注册失败", Toast.LENGTH_SHORT).show();
+ }
+ break;
+ }
+ }
+}
+
+
+
diff --git a/Game2048/app/src/main/java/com/example/game2048/User.java b/Game2048/app/src/main/java/com/example/game2048/User.java
new file mode 100644
index 0000000..16f0612
--- /dev/null
+++ b/Game2048/app/src/main/java/com/example/game2048/User.java
@@ -0,0 +1,31 @@
+package com.example.game2048;
+
+public class User {
+ private String name; //用户名
+ private String password; //密码
+ public User(String name, String password) {
+ this.name = name;
+ this.password = password;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getPassword() {
+ return password;
+ }
+ public void setPassword(String password) {
+ this.password = password;
+ }
+ @Override
+ public String toString() {
+ return "User{" +
+ "name='" + name + '\'' +
+ ", password='" + password + '\'' +
+ '}';
+ }
+}
+
+
diff --git a/Game2048/app/src/main/mk-web.png b/Game2048/app/src/main/mk-web.png
new file mode 100644
index 0000000..ff53d6d
Binary files /dev/null and b/Game2048/app/src/main/mk-web.png differ
diff --git a/Game2048/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Game2048/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..1f6bb29
--- /dev/null
+++ b/Game2048/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Game2048/app/src/main/res/drawable/account.png b/Game2048/app/src/main/res/drawable/account.png
new file mode 100644
index 0000000..27ae418
Binary files /dev/null and b/Game2048/app/src/main/res/drawable/account.png differ
diff --git a/Game2048/app/src/main/res/drawable/b.png b/Game2048/app/src/main/res/drawable/b.png
new file mode 100644
index 0000000..aa0a3b6
Binary files /dev/null and b/Game2048/app/src/main/res/drawable/b.png differ
diff --git a/Game2048/app/src/main/res/drawable/bj.jpg b/Game2048/app/src/main/res/drawable/bj.jpg
new file mode 100644
index 0000000..8760f93
Binary files /dev/null and b/Game2048/app/src/main/res/drawable/bj.jpg differ
diff --git a/Game2048/app/src/main/res/drawable/button_drawable.xml b/Game2048/app/src/main/res/drawable/button_drawable.xml
new file mode 100644
index 0000000..217eeea
--- /dev/null
+++ b/Game2048/app/src/main/res/drawable/button_drawable.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/Game2048/app/src/main/res/drawable/f.png b/Game2048/app/src/main/res/drawable/f.png
new file mode 100644
index 0000000..4f187ad
Binary files /dev/null and b/Game2048/app/src/main/res/drawable/f.png differ
diff --git a/Game2048/app/src/main/res/drawable/fo.png b/Game2048/app/src/main/res/drawable/fo.png
new file mode 100644
index 0000000..30b9d4f
Binary files /dev/null and b/Game2048/app/src/main/res/drawable/fo.png differ
diff --git a/Game2048/app/src/main/res/drawable/ic_launcher_background.xml b/Game2048/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..0d025f9
--- /dev/null
+++ b/Game2048/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Game2048/app/src/main/res/drawable/mc.png b/Game2048/app/src/main/res/drawable/mc.png
new file mode 100644
index 0000000..d6e5867
Binary files /dev/null and b/Game2048/app/src/main/res/drawable/mc.png differ
diff --git a/Game2048/app/src/main/res/drawable/mo.png b/Game2048/app/src/main/res/drawable/mo.png
new file mode 100644
index 0000000..4b48286
Binary files /dev/null and b/Game2048/app/src/main/res/drawable/mo.png differ
diff --git a/Game2048/app/src/main/res/drawable/ps.png b/Game2048/app/src/main/res/drawable/ps.png
new file mode 100644
index 0000000..a2443fc
Binary files /dev/null and b/Game2048/app/src/main/res/drawable/ps.png differ
diff --git a/Game2048/app/src/main/res/drawable/t.png b/Game2048/app/src/main/res/drawable/t.png
new file mode 100644
index 0000000..274e4ad
Binary files /dev/null and b/Game2048/app/src/main/res/drawable/t.png differ
diff --git a/Game2048/app/src/main/res/layout/activity_main.xml b/Game2048/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..4a90bce
--- /dev/null
+++ b/Game2048/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Game2048/app/src/main/res/layout/game.xml b/Game2048/app/src/main/res/layout/game.xml
new file mode 100644
index 0000000..1af23b0
--- /dev/null
+++ b/Game2048/app/src/main/res/layout/game.xml
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Game2048/app/src/main/res/layout/game2.xml b/Game2048/app/src/main/res/layout/game2.xml
new file mode 100644
index 0000000..22cf617
--- /dev/null
+++ b/Game2048/app/src/main/res/layout/game2.xml
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Game2048/app/src/main/res/layout/menu.xml b/Game2048/app/src/main/res/layout/menu.xml
new file mode 100644
index 0000000..549698e
--- /dev/null
+++ b/Game2048/app/src/main/res/layout/menu.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Game2048/app/src/main/res/layout/register.xml b/Game2048/app/src/main/res/layout/register.xml
new file mode 100644
index 0000000..36ecb12
--- /dev/null
+++ b/Game2048/app/src/main/res/layout/register.xml
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Game2048/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Game2048/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Game2048/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Game2048/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Game2048/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Game2048/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Game2048/app/src/main/res/mipmap-hdpi/ic_launcher.png b/Game2048/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..898f3ed
Binary files /dev/null and b/Game2048/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/Game2048/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/Game2048/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..dffca36
Binary files /dev/null and b/Game2048/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/Game2048/app/src/main/res/mipmap-mdpi/ic_launcher.png b/Game2048/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..64ba76f
Binary files /dev/null and b/Game2048/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/Game2048/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/Game2048/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..dae5e08
Binary files /dev/null and b/Game2048/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/Game2048/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/Game2048/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..e5ed465
Binary files /dev/null and b/Game2048/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/Game2048/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/Game2048/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..14ed0af
Binary files /dev/null and b/Game2048/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/Game2048/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Game2048/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..b0907ca
Binary files /dev/null and b/Game2048/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/Game2048/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/Game2048/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..d8ae031
Binary files /dev/null and b/Game2048/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/Game2048/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Game2048/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..2c18de9
Binary files /dev/null and b/Game2048/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/Game2048/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/Game2048/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..beed3cd
Binary files /dev/null and b/Game2048/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/Game2048/app/src/main/res/raw/summer.mp3 b/Game2048/app/src/main/res/raw/summer.mp3
new file mode 100644
index 0000000..6b468d9
Binary files /dev/null and b/Game2048/app/src/main/res/raw/summer.mp3 differ
diff --git a/Game2048/app/src/main/res/values/colors.xml b/Game2048/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..69b2233
--- /dev/null
+++ b/Game2048/app/src/main/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #008577
+ #00574B
+ #D81B60
+
diff --git a/Game2048/app/src/main/res/values/strings.xml b/Game2048/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..5d6afeb
--- /dev/null
+++ b/Game2048/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ Game2048
+
diff --git a/Game2048/app/src/main/res/values/styles.xml b/Game2048/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..5885930
--- /dev/null
+++ b/Game2048/app/src/main/res/values/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/Game2048/app/src/test/java/com/example/game2048/ExampleUnitTest.java b/Game2048/app/src/test/java/com/example/game2048/ExampleUnitTest.java
new file mode 100644
index 0000000..6ed373e
--- /dev/null
+++ b/Game2048/app/src/test/java/com/example/game2048/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.example.game2048;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/Game2048/build.gradle b/Game2048/build.gradle
new file mode 100644
index 0000000..fb516be
--- /dev/null
+++ b/Game2048/build.gradle
@@ -0,0 +1,27 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ google()
+ jcenter()
+
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.5.2'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/Game2048/gradle.properties b/Game2048/gradle.properties
new file mode 100644
index 0000000..199d16e
--- /dev/null
+++ b/Game2048/gradle.properties
@@ -0,0 +1,20 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Automatically convert third-party libraries to use AndroidX
+android.enableJetifier=true
+
diff --git a/Game2048/gradle/wrapper/gradle-wrapper.jar b/Game2048/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..f6b961f
Binary files /dev/null and b/Game2048/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/Game2048/gradle/wrapper/gradle-wrapper.properties b/Game2048/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..cad7896
--- /dev/null
+++ b/Game2048/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Tue May 23 16:12:53 CST 2023
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
diff --git a/Game2048/gradlew b/Game2048/gradlew
new file mode 100644
index 0000000..cccdd3d
--- /dev/null
+++ b/Game2048/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/Game2048/gradlew.bat b/Game2048/gradlew.bat
new file mode 100644
index 0000000..f955316
--- /dev/null
+++ b/Game2048/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/Game2048/settings.gradle b/Game2048/settings.gradle
new file mode 100644
index 0000000..a305376
--- /dev/null
+++ b/Game2048/settings.gradle
@@ -0,0 +1,2 @@
+include ':app'
+rootProject.name='Game2048'