当前位置:   article > 正文

基于 Android Studio如何实现找不同游戏(简单易上手)_微信小程序开发者工具做找不同小游戏

微信小程序开发者工具做找不同小游戏

目录

前言

一、项目概述

1、构成以及功能设计

二、开发环境

三、准备工具

四、详细设计

1、新建工程

2、搭建注册登陆面

3、搭建首页界面

4、搭建游戏界面

五、项目运行

1.图片演示

六、项目总结

Get 项目模板源码


前言

        找不同游戏是一种在移动应用程序中非常普遍的游戏体验。这种游戏可以在简单的用户界面下提供寻找游戏中不同点的乐趣。并且,这种游戏对于锻炼观察能力、提高认知能力都非常有帮助。因此,我们可以通过基于Android Studio 开发一个找不同游戏App,来提供这种乐趣和帮助用户提高认知能力。

视频演示:

Android studio期末设计大作业~找不同App

一、项目概述

1、构成以及功能设计

①.用户登录/注册功能

②主页面功能

    - 关卡选择按钮

    - 游戏描述按钮(show按钮)

    - 历史分数和排名按钮

    - 控制背景音乐的播放按钮

③ 关卡选择页面功能

    - 三个级别的游戏

    - 开始游戏

④ 游戏功能

    - 计时器

    - 五个不同之处

    - 结果判断和按钮控制

    - 自定义评价标准

⑤历史数据和排行榜页面

   - 显示最近的游戏分数

   - 显示历史上的最高和最低得分

   - 分享按钮,分享结果、时间和地点的详细信息

二、开发环境

        我的开发环境如下,大家的AS版本不需要和我相同,只要是近两年从官网下载的版本,都是比4.0.0高的,是可以满足运行和开发要求的。

三、准备工具

  1. 选择自己喜欢的找不同背景

  2. 选择一首你喜欢的音乐

四、详细设计

1、新建工程

  • 首先打开Android Studio,并新建一个工程,File——>New——>New Project——>Empty Project,工程名称叫做Game,可以根据自己喜好设置名称。

  • 包名自己随意设定,这里博主用的是com.example,一般是com.example;工程文件的保存路径要修改一下,不要放在C盘,我这里选择的是放在H盘,养成项目统一放在英文路径下的好习惯。

  • 最后选择API 24:Android 7.0,因为这样它就拥有了96.3%的跨平台性(兼容性非常好),因为它版本很低,基本上模拟器API版本都是高于20的,所以这个软件可以运行其他各种设备上。点击Finish完成创建。

2、搭建注册登陆面

  设计一个app的时候,一定要先设计layout文件,再设计java文件,因为布局有了,才能在上面进行代码的编写。我们来看一下activity_register和activity_login布局文件。

注册页面完整代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:background="#afddf4"
  8. tools:context=".Register.RegisterActivity">
  9. <ImageView
  10. android:id="@+id/imageView"
  11. android:layout_width="0dp"
  12. android:layout_height="201dp"
  13. android:scaleType="centerCrop"
  14. app:layout_constraintEnd_toEndOf="parent"
  15. app:layout_constraintStart_toStartOf="parent"
  16. app:layout_constraintTop_toTopOf="parent"
  17. app:srcCompat="@drawable/login" />
  18. <EditText
  19. android:id="@+id/password_edittext"
  20. android:layout_width="236dp"
  21. android:layout_height="42dp"
  22. android:layout_marginTop="24dp"
  23. android:hint="请输入密码"
  24. android:inputType="textPassword"
  25. app:layout_constraintEnd_toEndOf="@+id/username_edittext"
  26. app:layout_constraintStart_toStartOf="@+id/username_edittext"
  27. app:layout_constraintTop_toBottomOf="@+id/username_edittext" />
  28. <Button
  29. android:id="@+id/register_button"
  30. android:layout_width="228dp"
  31. android:layout_height="44dp"
  32. android:layout_marginTop="32dp"
  33. android:textColor="#fff"
  34. android:textSize="20sp"
  35. android:background="@drawable/login_view"
  36. android:text="注 册"
  37. app:layout_constraintEnd_toEndOf="@+id/password_edittext"
  38. app:layout_constraintHorizontal_bias="0.0"
  39. app:layout_constraintStart_toStartOf="@+id/password_edittext"
  40. app:layout_constraintTop_toBottomOf="@+id/password_edittext" />
  41. <EditText
  42. android:id="@+id/username_edittext"
  43. android:layout_width="236dp"
  44. android:layout_height="42dp"
  45. android:layout_marginTop="32dp"
  46. android:hint="请输入账号"
  47. app:layout_constraintEnd_toEndOf="@+id/imageView"
  48. app:layout_constraintStart_toStartOf="@+id/imageView"
  49. app:layout_constraintTop_toBottomOf="@+id/imageView" />
  50. </androidx.constraintlayout.widget.ConstraintLayout>

登陆页面完整代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:background="#afddf4"
  8. tools:context=".Login.LoginActivity">
  9. <ImageView
  10. android:id="@+id/imageView5"
  11. android:layout_width="0dp"
  12. android:layout_height="201dp"
  13. android:scaleType="centerCrop"
  14. app:layout_constraintEnd_toEndOf="parent"
  15. app:layout_constraintStart_toStartOf="parent"
  16. app:layout_constraintTop_toTopOf="parent"
  17. app:srcCompat="@drawable/login" />
  18. <EditText
  19. android:id="@+id/username_edittext"
  20. android:layout_width="236dp"
  21. android:layout_height="42dp"
  22. android:layout_marginTop="32dp"
  23. android:hint="请输入账号"
  24. app:layout_constraintEnd_toEndOf="parent"
  25. app:layout_constraintStart_toStartOf="parent"
  26. app:layout_constraintTop_toBottomOf="@+id/imageView5" />
  27. <Button
  28. android:id="@+id/login_button"
  29. android:layout_width="228dp"
  30. android:layout_height="43dp"
  31. android:layout_marginTop="40dp"
  32. android:background="@drawable/login_view"
  33. android:text="登 陆"
  34. android:textColor="#fff"
  35. android:textSize="20sp"
  36. app:layout_constraintEnd_toEndOf="parent"
  37. app:layout_constraintHorizontal_bias="0.472"
  38. app:layout_constraintStart_toStartOf="parent"
  39. app:layout_constraintTop_toBottomOf="@+id/password_edittext" />
  40. <EditText
  41. android:id="@+id/password_edittext"
  42. android:layout_width="0dp"
  43. android:layout_height="wrap_content"
  44. android:layout_marginTop="24dp"
  45. android:hint="请输入密码"
  46. android:inputType="textPassword"
  47. app:layout_constraintEnd_toEndOf="@+id/username_edittext"
  48. app:layout_constraintStart_toStartOf="@+id/username_edittext"
  49. app:layout_constraintTop_toBottomOf="@+id/username_edittext" />
  50. <Button
  51. android:id="@+id/register_button"
  52. android:layout_width="228dp"
  53. android:layout_height="43dp"
  54. android:layout_marginTop="24dp"
  55. android:background="@drawable/login_view"
  56. android:text="注 册"
  57. android:textColor="#fff"
  58. android:textSize="20sp"
  59. app:layout_constraintEnd_toEndOf="@+id/login_button"
  60. app:layout_constraintHorizontal_bias="1.0"
  61. app:layout_constraintStart_toStartOf="@+id/login_button"
  62. app:layout_constraintTop_toBottomOf="@+id/login_button" />
  63. </androidx.constraintlayout.widget.ConstraintLayout>

        然后回到我们的Activity文件。首先创建需要用到的控件,然后绑定控件,再设置监听器等。

注册页面代码如下:

  1. package com.example.game.Register;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.EditText;
  8. import android.widget.Toast;
  9. import com.example.game.Login.LoginActivity;
  10. import com.example.game.R;
  11. import com.example.game.Data.DatabaseHelper;
  12. public class RegisterActivity extends AppCompatActivity {
  13. private EditText mUserNameEditText;
  14. private EditText mPasswordEditText;
  15. private DatabaseHelper mDatabaseHelper;
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_register);
  20. mUserNameEditText = findViewById(R.id.username_edittext);
  21. mPasswordEditText = findViewById(R.id.password_edittext);
  22. mDatabaseHelper = new DatabaseHelper(this);
  23. Button registerButton = findViewById(R.id.register_button);
  24. registerButton.setOnClickListener(new View.OnClickListener() {
  25. @Override
  26. public void onClick(View v) {
  27. String username = mUserNameEditText.getText().toString().trim();
  28. String password = mPasswordEditText.getText().toString().trim();
  29. if (username.isEmpty() || password.isEmpty()) {
  30. Toast.makeText(getApplicationContext(), "请输入账号或密码", Toast.LENGTH_SHORT).show();
  31. return;
  32. }
  33. boolean result = mDatabaseHelper.insertData(username, password);
  34. if (result) {
  35. Toast.makeText(getApplicationContext(), "注册成功", Toast.LENGTH_SHORT).show();
  36. Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
  37. startActivity(intent);
  38. finish();
  39. } else {
  40. Toast.makeText(getApplicationContext(), "注册失败", Toast.LENGTH_SHORT).show();
  41. }
  42. }
  43. });
  44. }
  45. }

登陆页面代码如下:

  1. package com.example.game.Login;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.EditText;
  8. import android.widget.ImageView;
  9. import android.widget.Toast;
  10. import com.bumptech.glide.Glide;
  11. import com.example.game.MainActivity;
  12. import com.example.game.R;
  13. import com.example.game.Register.RegisterActivity;
  14. import com.example.game.Data.DatabaseHelper;
  15. public class LoginActivity extends AppCompatActivity {
  16. private EditText mUserNameEditText;
  17. private EditText mPasswordEditText;
  18. private Button mLoginButton, rEgisterButton;
  19. private DatabaseHelper mDatabaseHelper;
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_login);
  24. mUserNameEditText = findViewById(R.id.username_edittext);
  25. mPasswordEditText = findViewById(R.id.password_edittext);
  26. mLoginButton = findViewById(R.id.login_button);
  27. rEgisterButton = findViewById(R.id.register_button);
  28. mDatabaseHelper = new DatabaseHelper(this);
  29. rEgisterButton.setOnClickListener(new View.OnClickListener() {
  30. @Override
  31. public void onClick(View v) {
  32. Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
  33. startActivity(intent);
  34. }
  35. });
  36. mLoginButton.setOnClickListener(new View.OnClickListener() {
  37. @Override
  38. public void onClick(View v) {
  39. String username = mUserNameEditText.getText().toString().trim();
  40. String password = mPasswordEditText.getText().toString().trim();
  41. if (username.isEmpty() || password.isEmpty()) {
  42. Toast.makeText(getApplicationContext(), "请输入账号或密码", Toast.LENGTH_SHORT).show();
  43. return;
  44. }
  45. boolean result = mDatabaseHelper.checkUser(username, password);
  46. if (result) {
  47. Toast.makeText(getApplicationContext(), "登陆成功", Toast.LENGTH_SHORT).show();
  48. Intent intent = new Intent(LoginActivity.this, MainActivity.class);
  49. startActivity(intent);
  50. } else {
  51. Toast.makeText(getApplicationContext(), "账号或密码错误", Toast.LENGTH_SHORT).show();
  52. }
  53. }
  54. });
  55. }
  56. }

3、搭建首页界面

        主页主要实现每个按钮的点击事件进行对应页面的跳转

首页页面布局代码如下所示:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:app="http://schemas.android.com/apk/res-auto"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:background="#afddf4"
  7. android:orientation="vertical">
  8. <ImageView
  9. android:id="@+id/imageView6"
  10. android:layout_width="match_parent"
  11. android:layout_height="250dp"
  12. app:srcCompat="@drawable/login" />
  13. <Button
  14. android:id="@+id/button_select_level"
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content"
  17. android:background="#03A9F4"
  18. android:text="选择关卡"
  19. android:textColor="#fff"
  20. android:textSize="18sp" />
  21. <Button
  22. android:id="@+id/button_game_description"
  23. android:layout_width="match_parent"
  24. android:layout_height="wrap_content"
  25. android:layout_marginTop="10dp"
  26. android:background="#03A9F4"
  27. android:text="游戏描述"
  28. android:textColor="#fff"
  29. android:textSize="18sp" />
  30. <Button
  31. android:id="@+id/button_history_score"
  32. android:layout_width="match_parent"
  33. android:layout_height="wrap_content"
  34. android:layout_marginTop="10dp"
  35. android:background="#03A9F4"
  36. android:text="历史分数及排名"
  37. android:textColor="#fff"
  38. android:textSize="18sp" />
  39. <Button
  40. android:id="@+id/button_music_control"
  41. android:layout_width="match_parent"
  42. android:layout_height="wrap_content"
  43. android:layout_marginTop="10dp"
  44. android:background="#03A9F4"
  45. android:text="播放音乐"
  46. android:textColor="#fff"
  47. android:textSize="18sp" />
  48. </LinearLayout>

首页JAVA代码如下所示:

  1. package com.example.game;
  2. import androidx.appcompat.app.AlertDialog;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.content.Context;
  5. import android.content.DialogInterface;
  6. import android.content.Intent;
  7. import android.os.Bundle;
  8. import android.media.MediaPlayer;
  9. import android.view.View;
  10. import android.widget.Button;
  11. import android.widget.ImageView;
  12. import android.widget.Toast;
  13. import com.bumptech.glide.Glide;
  14. import com.example.game.Game.EasyActivity;
  15. import com.example.game.Game.HardActivity;
  16. import com.example.game.Game.NormalActivity;
  17. import com.example.game.Grade.GradeActivity;
  18. import com.example.game.Show.ShowActivity;
  19. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  20. private MediaPlayer mediaPlayer;
  21. private Button buttonMusicControl;
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_main);
  26. Button buttonSelectLevel = findViewById(R.id.button_select_level);
  27. Button buttonGameDescription = findViewById(R.id.button_game_description);
  28. Button buttonHistoryScore = findViewById(R.id.button_history_score);
  29. buttonMusicControl = findViewById(R.id.button_music_control);
  30. buttonSelectLevel.setOnClickListener(this);
  31. buttonGameDescription.setOnClickListener(this);
  32. buttonHistoryScore.setOnClickListener(this);
  33. buttonMusicControl.setOnClickListener(this);
  34. }
  35. @Override
  36. public void onClick(View v) {
  37. switch (v.getId()) {
  38. case R.id.button_music_control:
  39. toggleMusic();
  40. break;
  41. case R.id.button_select_level:
  42. showSelectionDialog();
  43. break;
  44. case R.id.button_game_description:
  45. showAlertDialog();
  46. break;
  47. case R.id.button_history_score:
  48. grade();
  49. break;
  50. }
  51. }
  52. private void grade() {
  53. Intent intent = new Intent(MainActivity.this, GradeActivity.class);
  54. startActivity(intent);
  55. }
  56. private void showSelectionDialog() {
  57. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  58. final String[] options = {"简单", "一般", "困难"};
  59. builder.setTitle("选择合适的关卡:");
  60. builder.setItems(options, new DialogInterface.OnClickListener() {
  61. @Override
  62. public void onClick(DialogInterface dialog, int which) {
  63. switch (options[which]) {
  64. case "简单":
  65. Intent intent = new Intent(MainActivity.this, EasyActivity.class);
  66. startActivity(intent);
  67. break;
  68. case "一般":
  69. Intent intent2 = new Intent(MainActivity.this, NormalActivity.class);
  70. startActivity(intent2);
  71. break;
  72. case "困难":
  73. Intent intent3 = new Intent(MainActivity.this, HardActivity.class);
  74. startActivity(intent3);
  75. break;
  76. }
  77. }
  78. });
  79. AlertDialog dialog = builder.create();
  80. dialog.show();
  81. }
  82. private void showAlertDialog() {
  83. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  84. builder.setTitle("找不同游戏规则如下:");
  85. builder.setMessage("1. 游戏开始后,会出现两张看似相同的图片,实际上有几处细微的差别。\n" +
  86. "\n" +
  87. "2. 玩家需要在规定的时间内,找出这些差别。\n" +
  88. "\n" +
  89. "3. 可以通过点击差异位置的方式来标出发现的差别。\n" +
  90. "\n" +
  91. "4. 游戏一般分为多个关卡,每个关卡的难度逐渐加大。\n" +
  92. "\n" +
  93. "5. 玩家需要在规定的时间内找到所有不同之处,才能晋级到下一个关卡。\n" +
  94. "\n" +
  95. "6. 如果时间到了但是还没有找完,游戏就会结束。\n" +
  96. "\n" +
  97. "7. 如果玩家成功通过关卡,则可以解锁下一个更难的关卡,在游戏中积累高分,以期打败其他玩家。\n" +
  98. "\n" +
  99. "找不同游戏的难点在于玩家需要有较强的观察力、反应力和记忆力,而且需要快速判断不同之处,在有限的时间内完成任务。因此,找不同游戏会不断考验玩家的能力,让玩家在娱乐的同时也可以锻炼自己的大脑。");
  100. builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
  101. @Override
  102. public void onClick(DialogInterface dialog, int which) {
  103. // 处理确定按钮的点击事件
  104. Toast.makeText(getApplicationContext(), "已知晓", Toast.LENGTH_SHORT).show();
  105. }
  106. });
  107. builder.setNegativeButton("show", new DialogInterface.OnClickListener() {
  108. @Override
  109. public void onClick(DialogInterface dialog, int which) {
  110. Intent intent = new Intent(MainActivity.this, ShowActivity.class);
  111. startActivity(intent);
  112. }
  113. });
  114. AlertDialog alertDialog = builder.create();
  115. alertDialog.show();
  116. }
  117. private void toggleMusic() {
  118. if (mediaPlayer != null) {
  119. if (mediaPlayer.isPlaying()) {
  120. mediaPlayer.pause();
  121. buttonMusicControl.setText("播放音乐");
  122. } else {
  123. mediaPlayer.start();
  124. buttonMusicControl.setText("暂停音乐");
  125. }
  126. } else {
  127. mediaPlayer = MediaPlayer.create(this, R.raw.music0);
  128. mediaPlayer.start();
  129. buttonMusicControl.setText("暂停音乐");
  130. }
  131. }
  132. @Override
  133. protected void onDestroy() {
  134. super.onDestroy();
  135. if (mediaPlayer != null) {
  136. mediaPlayer.release();
  137. mediaPlayer = null;
  138. }
  139. }
  140. }

4、搭建游戏界面

        在这里我们创建EasyActivity文件然后在activity_easy.xml文件编辑页面代码,三个游戏难度代码几乎一致,以下为简单游戏。

1. `btn()` 方法用于处理活动中的按钮点击。

2. 在 `btn()` 方法内,有两个按钮点击监听器:

   - 第一个适用于标识为 `btnChong倒计时器(`mCountDownTimer`),创建一个新意图以重新启动当前活动(`EasyActivity`),启动新活动,并结束当前活动。

   - 第二个适用于标识为 `btnEsc` 的按钮。当点击该按钮时,会取消倒计时器,创建一个新意图以启动 `MainActivity`,启动新活动,并结束当前活动。

3. `play()` 方法负责启动一个倒计时器(`mCountDownTimer`),其持续时间为10秒,间隔为1秒。在计时器的 `onTick()` 方法内,剩余时间将显示在一个<TextView>(`mTextView`)上。

4. 在计时器的 `onFinish()` 方法内,当倒计时结束时执行一些操作:

   - 从一个编辑文本框 (`grade`) 中获取得分(以字符串表示)。

   - 使用 `Log.d()` 将得分记录到控制台。

   - 获取 SharedPreferences 对象以存储分数列表。

   - 从 SharedPreferences 中获取先前的分数列表,并向列表添加新的分数。

   - 将修改后的分数列表保存回 SharedPreferences。

   - 如果得分为 "简单关卡得分:5"(表示简单级别得分为5),则显示一个提示消息表明挑战成功。否则,隐藏某些视图,并显示一个提示消息表示挑战失败。

   - 创建一个意图以启动 `GradeActivity` 并启动新活动。最后,结束当前活动。

5. `onClick(View view)` 方法处理活动中各种视图的点击事件。根据所点击视图的ID,它执行不同的操作以更新分数并显示或隐藏某些视图。

activity_easy.xml如下所示:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:background="#afddf4"
  8. tools:context=".Game.EasyActivity">
  9. <Button
  10. android:id="@+id/btn_chongxinkaishi"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:layout_marginTop="8dp"
  14. android:layout_marginEnd="52dp"
  15. android:background="#00BCD4"
  16. android:text="重新开始"
  17. android:textColor="#fff"
  18. android:textSize="18sp"
  19. app:layout_constraintEnd_toEndOf="parent"
  20. app:layout_constraintTop_toTopOf="parent" />
  21. <ImageView
  22. android:id="@+id/img1"
  23. android:layout_width="414dp"
  24. android:layout_height="440dp"
  25. android:layout_marginTop="32dp"
  26. app:layout_constraintEnd_toEndOf="parent"
  27. app:layout_constraintHorizontal_bias="0.666"
  28. app:layout_constraintStart_toStartOf="parent"
  29. app:layout_constraintTop_toBottomOf="@+id/btn_esc"
  30. app:srcCompat="@drawable/easy" />
  31. <View
  32. android:id="@+id/dif_11"
  33. android:layout_width="69dp"
  34. android:layout_height="52dp"
  35. android:layout_marginTop="28dp"
  36. android:layout_marginEnd="144dp"
  37. android:background="@drawable/view"
  38. android:visibility="gone"
  39. app:layout_constraintEnd_toEndOf="parent"
  40. app:layout_constraintTop_toTopOf="@+id/img1" />
  41. <View
  42. android:id="@+id/dif_01"
  43. android:layout_width="69dp"
  44. android:layout_height="52dp"
  45. android:layout_marginEnd="144dp"
  46. android:layout_marginBottom="140dp"
  47. android:background="@drawable/view"
  48. android:visibility="gone"
  49. app:layout_constraintBottom_toBottomOf="@+id/img1"
  50. app:layout_constraintEnd_toEndOf="parent" />
  51. <View
  52. android:id="@+id/dif_22"
  53. android:layout_width="60dp"
  54. android:layout_height="41dp"
  55. android:layout_marginStart="120dp"
  56. android:layout_marginTop="40dp"
  57. android:background="@drawable/view"
  58. android:visibility="gone"
  59. app:layout_constraintStart_toStartOf="parent"
  60. app:layout_constraintTop_toTopOf="@+id/img1" />
  61. <View
  62. android:id="@+id/dif_02"
  63. android:layout_width="56dp"
  64. android:layout_height="30dp"
  65. android:layout_marginStart="124dp"
  66. android:layout_marginBottom="140dp"
  67. android:background="@drawable/view"
  68. android:visibility="gone"
  69. app:layout_constraintBottom_toBottomOf="@+id/img1"
  70. app:layout_constraintStart_toStartOf="@+id/img1" />
  71. <View
  72. android:id="@+id/dif_33"
  73. android:layout_width="55dp"
  74. android:layout_height="27dp"
  75. android:layout_marginStart="124dp"
  76. android:layout_marginTop="112dp"
  77. android:background="@drawable/view"
  78. android:visibility="gone"
  79. app:layout_constraintStart_toStartOf="parent"
  80. app:layout_constraintTop_toTopOf="@+id/img1" />
  81. <View
  82. android:id="@+id/dif_03"
  83. android:layout_width="55dp"
  84. android:layout_height="27dp"
  85. android:layout_marginStart="124dp"
  86. android:layout_marginBottom="76dp"
  87. android:background="@drawable/view"
  88. android:visibility="gone"
  89. app:layout_constraintBottom_toBottomOf="@+id/img1"
  90. app:layout_constraintStart_toStartOf="@+id/img1" />
  91. <View
  92. android:id="@+id/dif_4"
  93. android:layout_width="39dp"
  94. android:layout_height="29dp"
  95. android:layout_marginTop="96dp"
  96. android:layout_marginEnd="124dp"
  97. android:background="@drawable/view"
  98. android:visibility="gone"
  99. app:layout_constraintEnd_toEndOf="parent"
  100. app:layout_constraintTop_toTopOf="@+id/img1" />
  101. <View
  102. android:id="@+id/dif_04"
  103. android:layout_width="32dp"
  104. android:layout_height="25dp"
  105. android:layout_marginEnd="128dp"
  106. android:layout_marginBottom="88dp"
  107. android:background="@drawable/view"
  108. android:visibility="gone"
  109. app:layout_constraintBottom_toBottomOf="@+id/img1"
  110. app:layout_constraintEnd_toEndOf="parent" />
  111. <View
  112. android:id="@+id/dif_5"
  113. android:layout_width="45dp"
  114. android:layout_height="34dp"
  115. android:layout_marginTop="172dp"
  116. android:layout_marginEnd="92dp"
  117. android:background="@drawable/view"
  118. android:visibility="gone"
  119. app:layout_constraintEnd_toEndOf="parent"
  120. app:layout_constraintTop_toTopOf="@+id/img1" />
  121. <View
  122. android:id="@+id/dif_05"
  123. android:layout_width="45dp"
  124. android:layout_height="34dp"
  125. android:layout_marginEnd="92dp"
  126. android:layout_marginBottom="8dp"
  127. android:background="@drawable/view"
  128. android:visibility="gone"
  129. app:layout_constraintBottom_toBottomOf="@+id/img1"
  130. app:layout_constraintEnd_toEndOf="parent" />
  131. <Button
  132. android:id="@+id/btn_esc"
  133. android:layout_width="wrap_content"
  134. android:layout_height="wrap_content"
  135. android:layout_marginTop="16dp"
  136. android:background="#00BCD4"
  137. android:text="退出"
  138. android:textColor="#fff"
  139. android:textSize="18sp"
  140. app:layout_constraintEnd_toEndOf="@+id/btn_chongxinkaishi"
  141. app:layout_constraintTop_toBottomOf="@+id/btn_chongxinkaishi" />
  142. <View
  143. android:id="@+id/y_02"
  144. android:layout_width="57dp"
  145. android:layout_height="35dp"
  146. android:layout_marginStart="120dp"
  147. android:layout_marginTop="44dp"
  148. app:layout_constraintStart_toStartOf="parent"
  149. app:layout_constraintTop_toTopOf="@+id/img1" />
  150. <View
  151. android:id="@+id/y_01"
  152. android:layout_width="78dp"
  153. android:layout_height="47dp"
  154. android:layout_marginTop="24dp"
  155. android:layout_marginEnd="140dp"
  156. app:layout_constraintEnd_toEndOf="parent"
  157. app:layout_constraintTop_toTopOf="@+id/img1" />
  158. <View
  159. android:id="@+id/y_04"
  160. android:layout_width="49dp"
  161. android:layout_height="32dp"
  162. android:layout_marginTop="96dp"
  163. android:layout_marginEnd="120dp"
  164. app:layout_constraintEnd_toEndOf="parent"
  165. app:layout_constraintTop_toTopOf="@+id/img1" />
  166. <View
  167. android:id="@+id/y_05"
  168. android:layout_width="49dp"
  169. android:layout_height="32dp"
  170. android:layout_marginTop="172dp"
  171. android:layout_marginEnd="88dp"
  172. app:layout_constraintEnd_toEndOf="parent"
  173. app:layout_constraintTop_toTopOf="@+id/img1" />
  174. <View
  175. android:id="@+id/y_03"
  176. android:layout_width="67dp"
  177. android:layout_height="24dp"
  178. android:layout_marginStart="120dp"
  179. android:layout_marginTop="112dp"
  180. app:layout_constraintStart_toStartOf="parent"
  181. app:layout_constraintTop_toTopOf="@+id/img1" />
  182. <TextView
  183. android:id="@+id/grade"
  184. android:layout_width="wrap_content"
  185. android:layout_height="wrap_content"
  186. android:layout_marginStart="8dp"
  187. android:layout_marginTop="8dp"
  188. android:text="简单关卡得分:0"
  189. android:textColor="#fff"
  190. android:textSize="30sp"
  191. app:layout_constraintStart_toStartOf="parent"
  192. app:layout_constraintTop_toTopOf="parent" />
  193. <TextView
  194. android:id="@+id/mTextView"
  195. android:layout_width="wrap_content"
  196. android:layout_height="wrap_content"
  197. android:layout_marginTop="8dp"
  198. android:text="1"
  199. android:textColor="#fff"
  200. android:textSize="30sp"
  201. app:layout_constraintStart_toStartOf="@+id/grade"
  202. app:layout_constraintTop_toBottomOf="@+id/grade" />
  203. </androidx.constraintlayout.widget.ConstraintLayout>

接下来是对应java文件代码:

这段代码是一个简单的Android游戏活动(EasyActivity),它实现了一个倒计时功能和一些游戏逻辑。

1. **导入和变量声明**:
   - 代码一开始导入了一些必要的Android库和其他类。
   - 声明了一系列的View对象、TextView、Button、ImageView等,用来处理游戏界面的各个元素。

2. **onCreate方法**:
   - 在Activity创建时调用,设置布局文件为R.layout.activity_easy,并初始化界面和调用play()方法开始游戏。

3. **btn()方法**:
   - 设置了两个按钮的点击事件:
     - `btnChongxinkaishi`:重新开始按钮,点击后取消当前的倒计时并重新启动EasyActivity。
     - `btnEsc`:退出按钮,点击后取消当前的倒计时并跳转到MainActivity。

4. **play()方法**:
   - 创建了一个CountDownTimer对象,进行了10秒的倒计时。
   - 每秒更新一次剩余时间的TextView(mTextView)。
   - 当倒计时结束时,根据得分显示Toast消息和处理逻辑:
     - 如果得分为5(通过grade.getText().toString()获取),显示挑战成功的消息,并将得分保存到SharedPreferences中。
     - 否则,隐藏游戏中的一些元素(y01至y05),显示挑战失败的消息,并提示重新开始游戏。
   - 最后跳转到GradeActivity显示成绩列表,并结束当前Activity。

5. **initView()方法**:
   - 初始化所有的View对象,包括游戏中的难题(dif1至dif5)和答案(y01至y05),以及其他界面元素(grade、mTextView、btnChongxinkaishi等)。

这段代码实现了一个简单的倒计时游戏,玩家需要在规定时间内完成某些任务,并根据完成情况显示不同的结果和消息。同时,它还展示了如何使用SharedPreferences来存储和读取游戏成绩,以及如何通过Intent在不同的Activity之间进行跳转。

  1. package com.example.game.Game;
  2. import android.content.Intent;
  3. import android.content.SharedPreferences;
  4. import android.os.Bundle;
  5. import android.os.CountDownTimer;
  6. import android.text.TextUtils;
  7. import android.util.Log;
  8. import android.view.View;
  9. import android.widget.Button;
  10. import android.widget.ImageView;
  11. import android.widget.TextView;
  12. import android.widget.Toast;
  13. import androidx.appcompat.app.AppCompatActivity;
  14. import com.example.game.Grade.GradeActivity;
  15. import com.example.game.MainActivity;
  16. import com.example.game.R;
  17. import com.google.gson.Gson;
  18. import com.google.gson.reflect.TypeToken;
  19. import java.util.ArrayList;
  20. public class EasyActivity extends AppCompatActivity implements View.OnClickListener {
  21. private View dif1;
  22. private View dif01;
  23. private View dif2;
  24. private View dif02;
  25. private View dif3;
  26. private View dif03;
  27. private View dif4;
  28. private View dif04;
  29. private View dif5;
  30. private View dif05;
  31. private View y02;
  32. private View y01;
  33. private View y04;
  34. private View y05;
  35. private View y03;
  36. private TextView grade;
  37. private int count;
  38. private TextView mTextView;
  39. private Button btnChongxinkaishi;
  40. private ImageView imageView;
  41. private Button btnEsc;
  42. private TextView textView2;
  43. private CountDownTimer mCountDownTimer;
  44. @Override
  45. protected void onCreate(Bundle savedInstanceState) {
  46. super.onCreate(savedInstanceState);
  47. setContentView(R.layout.activity_easy);
  48. initView();
  49. play();
  50. btn();
  51. }
  52. private void btn() {
  53. // 重新开始按钮
  54. btnChongxinkaishi.setOnClickListener(new View.OnClickListener() {
  55. @Override
  56. public void onClick(View view) {
  57. if (mCountDownTimer != null) {
  58. mCountDownTimer.cancel();
  59. }
  60. Intent intent = new Intent(EasyActivity.this, EasyActivity.class);
  61. startActivity(intent);
  62. finish();
  63. }
  64. });
  65. // 退出到主页按钮
  66. btnEsc.setOnClickListener(new View.OnClickListener() {
  67. @Override
  68. public void onClick(View view) {
  69. if (mCountDownTimer != null) {
  70. mCountDownTimer.cancel();
  71. }
  72. Intent intent = new Intent(EasyActivity.this, MainActivity.class);
  73. startActivity(intent);
  74. finish();
  75. }
  76. });
  77. }
  78. private void play() {
  79. mCountDownTimer =new CountDownTimer(10000, 1000) {
  80. public void onTick(long millisUntilFinished) {
  81. // 这里可以更新显示剩余时间的TextView
  82. mTextView.setText("剩余时间: " + millisUntilFinished / 1000);
  83. }
  84. public void onFinish() {
  85. String grades = grade.getText().toString();
  86. // 打印当前得分到控制台
  87. Log.d("play", "当前得分为:" + grades);
  88. // 获取 SharedPreferences 对象
  89. SharedPreferences sharedPreferences = getSharedPreferences("grades", MODE_PRIVATE);
  90. // 获取原有的分数列表
  91. Gson gson = new Gson();
  92. String gradesListString = sharedPreferences.getString("grades_list", "");
  93. ArrayList<String> gradesList = new ArrayList<>();
  94. if (!TextUtils.isEmpty(gradesListString)) {
  95. gradesList = gson.fromJson(gradesListString, new TypeToken<ArrayList<String>>() {}.getType());
  96. }
  97. // 将新的分数添加到列表中
  98. gradesList.add(grades);
  99. // 保存成绩列表到 SharedPreferences 中
  100. SharedPreferences.Editor editor = sharedPreferences.edit();
  101. editor.putString("grades_list", gson.toJson(gradesList));
  102. editor.apply();
  103. // 倒计时结束后,判断得分是否为5,是则弹出对话框
  104. if (grades.equals("简单关卡得分:5")) {
  105. Toast.makeText(EasyActivity.this, "挑战成功," + grades, Toast.LENGTH_SHORT).show();
  106. } else {
  107. y01.setVisibility(View.GONE);
  108. y02.setVisibility(View.GONE);
  109. y03.setVisibility(View.GONE);
  110. y04.setVisibility(View.GONE);
  111. y05.setVisibility(View.GONE);
  112. Toast.makeText(EasyActivity.this, "时间到,挑战失败," + grades + " 请重新开始!", Toast.LENGTH_SHORT).show();
  113. }
  114. // 跳转到成绩列表页面
  115. Intent intent = new Intent(EasyActivity.this, GradeActivity.class);
  116. startActivity(intent);
  117. finish();
  118. }
  119. }.start();
  120. }
  121. private void initView() {
  122. dif1 = (View) findViewById(R.id.dif_11);
  123. dif01 = (View) findViewById(R.id.dif_01);
  124. dif2 = (View) findViewById(R.id.dif_22);
  125. dif02 = (View) findViewById(R.id.dif_02);
  126. dif3 = (View) findViewById(R.id.dif_33);
  127. dif03 = (View) findViewById(R.id.dif_03);
  128. dif4 = (View) findViewById(R.id.dif_4);
  129. dif04 = (View) findViewById(R.id.dif_04);
  130. dif5 = (View) findViewById(R.id.dif_5);
  131. dif05 = (View) findViewById(R.id.dif_05);
  132. y02 = (View) findViewById(R.id.y_02);
  133. y01 = (View) findViewById(R.id.y_01);
  134. y04 = (View) findViewById(R.id.y_04);
  135. y05 = (View) findViewById(R.id.y_05);
  136. y03 = (View) findViewById(R.id.y_03);
  137. y01.setOnClickListener(this);
  138. y02.setOnClickListener(this);
  139. y03.setOnClickListener(this);
  140. y04.setOnClickListener(this);
  141. y05.setOnClickListener(this);
  142. grade = (TextView) findViewById(R.id.grade);
  143. mTextView = (TextView) findViewById(R.id.mTextView);
  144. btnChongxinkaishi = (Button) findViewById(R.id.btn_chongxinkaishi);
  145. imageView = (ImageView) findViewById(R.id.img1);
  146. btnEsc = (Button) findViewById(R.id.btn_esc);
  147. textView2 = (TextView) findViewById(R.id.textView2);
  148. }
  149. }

        至此,完整的找不同游戏项目创建完成。

五、项目运行

1.图片演示

(1)运行app到模拟器上,显示登陆面:


(2)点击注册跳转到注册页面:

(3)注册账号后进行登陆然乎进入首页:

(4)点击选择关卡选择对应的难度进行游戏:

(5)点击历史分数及排名:

        运行效果和功能很完整,至此就完成了非常简单的找不同游戏。大家可以跟着动手做一下,放上自己喜欢的图片,还有喜欢的歌,体验感真的不要太好!

六、项目总结

在本设计中重点是:

1. 实现登录页面和注册页面,以及用户名和密码的验证和本地数据库的操作;

2. 实现主页面,包含关卡选择的按钮、关于游戏描述的按钮、历史分数和排名的按钮、背景音乐的控制按钮;

3. 实现关卡选择页面,定义三个游戏级别,启动游戏;

4. 实现游戏功能,包括计时器、不同之处的寻找、游戏结果的判断和按钮控制、自定义评价标准;

5. 实现历史数据和排行榜页面,显示最近的游戏分数、历史上的最高和最低得分。


Get 项目模板源码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/798332
推荐阅读
相关标签