master
huang 3 years ago
parent 5150982c36
commit 1e8fa0aa40

@ -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

@ -0,0 +1,116 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<codeStyleSettings language="XML">
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>ANDROID_ATTRIBUTE_ORDER</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
</code_scheme>
</component>

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<compositeConfiguration>
<compositeBuild compositeDefinitionSource="SCRIPT" />
</compositeConfiguration>
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="resolveModulePerSourceSet" value="false" />
<option name="testRunner" value="PLATFORM" />
</GradleProjectSettings>
</option>
</component>
</project>

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
</set>
</option>
</component>
</project>

@ -0,0 +1 @@
/build

@ -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'
}

@ -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

@ -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 <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@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());
}
}

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.game2048">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.NoActionBar">
<service
android:name=".MyService"
android:enabled="true"
android:exported="true"></service>
<activity
android:name=".MainActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".GameActivity" />
<activity android:name=".RegisterActivity" />
<activity android:name=".GameActivityII" />
<activity android:name=".MenuActivity" />
</application>
</manifest>

@ -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();
}
}

@ -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();
}
}

@ -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);
}
}

@ -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<User> getAllData(){
ArrayList<User> list = new ArrayList<User>();
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;
}
}

@ -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();
}
}

@ -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();
}
}

@ -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<Point> points = new ArrayList<Point>();
public GameView(Context context) {
super(context);
gameView = this;
initGameView();
}
public GameView(Context context, AttributeSet attrs) {
super(context, attrs);
gameView = this;
initGameView();
}
public GameView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
gameView = this;
initGameView();
}
/**
*
*/
private void initGameView(){
Log.d("233","0");
setColumnCount(4); //指名是4列的
setBackgroundColor(0xffbbada0);
addCards(getCardWitch(),getCardWitch());
startGame();
setOnTouchListener(new OnTouchListener() {
private float startX,startY;//初始的位置
private float offsetX,offsetY; //偏移的值
@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();
}
}
}
}
}

@ -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<Point> points = new ArrayList<Point>();
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();
}
}
}
}
}

@ -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<User> 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;
}
}
}

@ -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);//开始切换
}
}
}

@ -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();
}
}

@ -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;
}
}
}

@ -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 + '\'' +
'}';
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

@ -0,0 +1,34 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillType="evenOdd"
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
android:strokeWidth="1"
android:strokeColor="#00000000">
<aapt:attr name="android:fillColor">
<gradient
android:endX="78.5885"
android:endY="90.9159"
android:startX="48.7653"
android:startY="61.0927"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 784 KiB

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--相当于做了一张圆角的图片,然后给button作为背景图片-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!--设置背景色-->
<solid android:color="#DEB887" />
<!--设置圆角-->
<corners android:radius="105dip" />
</shape>

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#008577"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/bj">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_marginTop="30dp"
android:orientation="vertical">
<ImageView
android:layout_width="250dp"
android:layout_height="120dp"
android:layout_gravity="center_horizontal"
android:src="@drawable/t"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_marginTop="30dp"
android:orientation="horizontal">
<ImageView
android:layout_marginTop="15dp"
android:layout_width="35dp"
android:layout_height="35dp"
android:src="@drawable/account" />
<EditText
android:id="@+id/username"
android:layout_width="270dp"
android:layout_height="60dp"
android:textColor="#FFFFFF"
android:textColorHint="#FFF3E0"
android:hint="username"
android:maxLength="16"
android:maxLines="1" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal">
<ImageView
android:layout_marginTop="15dp"
android:layout_width="35dp"
android:layout_height="35dp"
android:src="@drawable/ps" />
<EditText
android:id="@+id/password"
android:layout_width="270dp"
android:layout_height="60dp"
android:textColor="#FFFFFF"
android:textColorHint="#FFF3E0"
android:hint="password"
android:inputType="textPassword"
android:maxLength="16"
android:maxLines="1" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal">
<EditText
android:id="@+id/phoneCodes"
android:layout_width="290dp"
android:layout_height="60dp"
android:textColor="#FFFFFF"
android:textColorHint="#FFF3E0"
android:maxLength="16"
android:maxLines="1"
android:hint="请输入4位验证码" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/showCode"
android:layout_width="120dp"
android:layout_height="70dp"
android:layout_marginLeft="140dp"
android:clickable="true"
android:onClick="onClick"
android:layout_marginRight="50dp" />
</LinearLayout>
<Button
android:id="@+id/login"
android:layout_width="250dp"
android:layout_height="50dp"
android:textSize="18sp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="60dp"
android:text="登录"
android:background="@drawable/button_drawable"
android:textColor="#FFFF"/>
<Button
android:id="@+id/register"
android:layout_width="250dp"
android:layout_height="50dp"
android:textSize="18sp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:text="注册"
android:background="@drawable/button_drawable"
android:textColor="#FFFF"/>
</LinearLayout>

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.game2048.GameActivity"
android:background="#FFEFD5">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="horizontal">
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginTop="5dp"
android:layout_marginLeft="10dp"
android:background="#FFEFD5"
android:src="@drawable/b"/>
<TextView
android:id="@+id/hy"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="#FFEFD5"
android:gravity="center"
android:text="2048"
android:textSize="30sp"
android:textColor="#844200"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="分数:"
android:textColor="#844200"
android:textSize="20sp" />
<TextView
android:id="@+id/tvSorce"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#844200"
android:background="@drawable/button_drawable"/>
<TextView
android:layout_width="145dp"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="最高分数:"
android:textColor="#844200"
android:textSize="20sp" />
<TextView
android:id="@+id/maxSorce"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#844200"
android:background="@drawable/button_drawable"/>
</LinearLayout>
<com.example.game2048.GameView
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/gameView" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="128dp"
android:orientation="horizontal">
<Button
android:id="@+id/bt_cx"
android:layout_width="80dp"
android:layout_height="40dp"
android:layout_marginTop="40dp"
android:layout_marginLeft="10dp"
android:background="@drawable/button_drawable"
android:text="重来"
android:textColor="#844200"/>
<Button
android:id="@+id/bk"
android:layout_width="80dp"
android:layout_height="40dp"
android:layout_marginTop="40dp"
android:layout_marginLeft="10dp"
android:background="@drawable/button_drawable"
android:text="返回"
android:textColor="#844200" />
<Button
android:id="@+id/bt_wf"
android:layout_width="80dp"
android:layout_height="40dp"
android:layout_marginTop="40dp"
android:background="@drawable/button_drawable"
android:layout_marginLeft="10dp"
android:text="玩法"
android:textColor="#844200" />
<ImageButton
android:id="@+id/music"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginTop="40dp"
android:layout_marginLeft="80dp"
android:background="#FFEFD5"
android:src="@drawable/mo"/>
</LinearLayout>
</LinearLayout>

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.game2048.GameActivity"
android:background="#FFEFD5">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="horizontal">
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginTop="5dp"
android:layout_marginLeft="10dp"
android:background="#FFEFD5"
android:src="@drawable/b"/>
<TextView
android:id="@+id/hy2"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="#FFEFD5"
android:gravity="center"
android:text="2048"
android:textSize="30sp"
android:textColor="#844200"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="分数:"
android:textColor="#844200"
android:textSize="20sp" />
<TextView
android:id="@+id/Sorce"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#844200"
android:background="@drawable/button_drawable"/>
<TextView
android:layout_width="145dp"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="最高分数:"
android:textColor="#844200"
android:textSize="20sp" />
<TextView
android:id="@+id/mSorce"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#844200"
android:background="@drawable/button_drawable"/>
</LinearLayout>
<com.example.game2048.GameViewII
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/gameView2" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="128dp"
android:orientation="horizontal">
<Button
android:id="@+id/cx"
android:layout_width="80dp"
android:layout_height="40dp"
android:layout_marginTop="40dp"
android:layout_marginLeft="10dp"
android:background="@drawable/button_drawable"
android:text="重来"
android:textColor="#844200"/>
<Button
android:id="@+id/bk2"
android:layout_width="80dp"
android:layout_height="40dp"
android:layout_marginTop="40dp"
android:layout_marginLeft="10dp"
android:background="@drawable/button_drawable"
android:text="返回"
android:textColor="#844200" />
<Button
android:id="@+id/wf"
android:layout_width="80dp"
android:layout_height="40dp"
android:layout_marginTop="40dp"
android:background="@drawable/button_drawable"
android:layout_marginLeft="10dp"
android:text="玩法"
android:textColor="#844200" />
<ImageButton
android:id="@+id/music2"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginTop="40dp"
android:layout_marginLeft="80dp"
android:background="#FFEFD5"
android:src="@drawable/mo"/>
</LinearLayout>
</LinearLayout>

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFEFD5">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="80dp"
android:orientation="horizontal">
<TextView
android:id="@+id/hy"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_marginTop="20dp"
android:background="#FFEFD5"
android:gravity="center"
android:text="user"
android:textSize="30sp"
android:textColor="#844200"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="300dp"
android:orientation="horizontal">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="120dp"
android:layout_marginLeft="60dp"
android:background="#FFEFD5"
android:src="@drawable/fo"/>
<Button
android:id="@+id/bt_ks"
android:layout_width="80dp"
android:layout_height="40dp"
android:layout_marginTop="120dp"
android:layout_marginLeft="80dp"
android:background="@drawable/button_drawable"
android:text="4*4模式"
android:textColor="#844200"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="300dp"
android:orientation="horizontal">
<ImageView
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_marginTop="100dp"
android:layout_marginLeft="60dp"
android:background="#FFEFD5"
android:src="@drawable/f"/>
<Button
android:id="@+id/bt_st"
android:layout_width="80dp"
android:layout_height="40dp"
android:layout_marginTop="100dp"
android:layout_marginLeft="80dp"
android:background="@drawable/button_drawable"
android:text="5*5模式"
android:textColor="#844200"/>
</LinearLayout>
</LinearLayout>

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bj">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_marginTop="70dp"
android:orientation="vertical">
<ImageView
android:layout_width="250dp"
android:layout_height="120dp"
android:layout_gravity="center_horizontal"
android:src="@drawable/t"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_marginTop="30dp"
android:orientation="horizontal">
<EditText
android:id="@+id/reg_username"
android:layout_width="290dp"
android:layout_height="60dp"
android:textColor="#FFFFFF"
android:textColorHint="#FFF3E0"
android:maxLength="10"
android:maxLines="1"
android:hint="用户名2-10位"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal">
<EditText
android:id="@+id/reg_password"
android:layout_width="290dp"
android:layout_height="60dp"
android:textColor="#FFFFFF"
android:textColorHint="#FFF3E0"
android:hint="密码6-16位"
android:inputType="textPassword"
android:maxLength="16"
android:maxLines="1" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal">
<EditText
android:id="@+id/reg_sure_password"
android:layout_width="290dp"
android:layout_height="60dp"
android:textColor="#FFFFFF"
android:textColorHint="#FFF3E0"
android:hint="确认密码"
android:inputType="textPassword"
android:maxLength="16"
android:maxLines="1" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal">
<EditText
android:id="@+id/et_registeractivity_phoneCodes"
android:layout_width="290dp"
android:layout_height="60dp"
android:textColor="#FFFFFF"
android:textColorHint="#FFF3E0"
android:maxLength="16"
android:maxLines="1"
android:hint="请输入4位验证码" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/showCode"
android:layout_width="120dp"
android:layout_height="70dp"
android:layout_marginLeft="140dp"
android:clickable="true"
android:onClick="onClick"
android:layout_marginRight="50dp" />
</LinearLayout>
<Button
android:id="@+id/button"
android:layout_width="280dp"
android:layout_height="50dp"
android:layout_marginTop="40dp"
android:layout_gravity="center_horizontal"
android:text="注册"
android:textSize="18sp"
android:textColor="#FFFF"
android:background="@drawable/button_drawable"/>
</LinearLayout>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#008577</color>
<color name="colorPrimaryDark">#00574B</color>
<color name="colorAccent">#D81B60</color>
</resources>

@ -0,0 +1,3 @@
<resources>
<string name="app_name">Game2048</string>
</resources>

@ -0,0 +1,11 @@
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>

@ -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 <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}

@ -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
}

@ -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

Binary file not shown.

@ -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

172
Game2048/gradlew vendored

@ -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" "$@"

@ -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

@ -0,0 +1,2 @@
include ':app'
rootProject.name='Game2048'
Loading…
Cancel
Save