Android 24点解密代码

119 阅读2分钟

这里是使用 Java 语言编写的 Android 应用程序的完整代码,可用于输入4个数字并解密24点游戏:

`` <?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:padding="16dp">
`` 
``     <TextView
``         android:layout_width="wrap_content"
``         android:layout_height="wrap_content"
``         android:text="请输入四个数字:"/>
`` 
``     <EditText
``         android:id="@+id/editText1"
``         android:layout_width="match_parent"
``         android:layout_height="wrap_content"
``         android:inputType="number"/>
`` 
``     <EditText
``         android:id="@+id/editText2"
``         android:layout_width="match_parent"
``         android:layout_height="wrap_content"
``         android:inputType="number"/>
`` 
``     <EditText
``         android:id="@+id/editText3"
``         android:layout_width="match_parent"
``         android:layout_height="wrap_content"
``         android:inputType="number"/>
`` 
``     <EditText
``         android:id="@+id/editText4"
``         android:layout_width="match_parent"
``         android:layout_height="wrap_content"
``         android:inputType="number"/>
`` 
``     <Button
``         android:id="@+id/button"
``         android:layout_width="match_parent"
``         android:layout_height="wrap_content"
``         android:text="开始解密"
``         android:onClick="startGame"/>
`` 
``     <TextView
``         android:id="@+id/result"
``         android:layout_width="wrap_content"
``         android:layout_height="wrap_content"
``         android:layout_marginTop="16dp"
``         android:text=""/>
`` 
`` </LinearLayout>

MainActivity.java

`` import androidx.appcompat.app.AppCompatActivity;
`` 
`` import android.os.Bundle;
`` import android.view.View;
`` import android.widget.EditText;
`` import android.widget.TextView;
`` import android.widget.Toast;
`` 
`` import java.util.ArrayList;
`` import java.util.List;
`` import java.util.Random;
`` 
`` public class MainActivity extends AppCompatActivity {
`` 
``     private static final int TARGET_NUMBER = 24;
`` 
``     private List<Integer> nums;
``     private Random random;
``     private TextView resultTextView;
`` 
``     @Override
``     protected void onCreate(Bundle savedInstanceState) {
``         super.onCreate(savedInstanceState);
``         setContentView(R.layout.activity_main);
`` 
``         nums = new ArrayList<>();
``         random = new Random();
``         resultTextView = findViewById(R.id.result);
``     }
`` 
``     public void startGame(View view) {
``         nums.clear();
``         EditText editText1 = findViewById(R.id.editText1);
``         EditText editText2 = findViewById(R.id.editText2);
``         EditText editText3 = findViewById(R.id.editText3);
``         EditText editText4 = findViewById(R.id.editText4);
``         String numStr1 = editText1.getText().toString().trim();
``         String numStr2 = editText2.getText().toString().trim();
``         String numStr3 = editText3.getText().toString().trim();
``         String numStr4 = editText4.getText().toString().trim();
``         if (numStr1.isEmpty() || numStr2.isEmpty() || numStr3.isEmpty() || numStr4.isEmpty()) {
``             Toast.makeText(this, "请输入四个数字", Toast.LENGTH_SHORT).show();
``             return;
``         }
``         try {
``             nums.add(Integer.parseInt(numStr1));
``             nums.add(Integer.parseInt(numStr2));
``             nums.add(Integer.parseInt(numStr3));
``             nums.add(Integer.parseInt(numStr4));
``         } catch (NumberFormatException e) {
``             Toast.makeText(this, "请输入有效的数字", Toast.LENGTH_SHORT).show();
``             return;
``         }
``         List<String> expressions = search(nums);
``         boolean foundSolution = false;
``         for (String expression : expressions) {
``             if (isTargetNumber(expression)) {
``                 resultTextView.setText("解密成功!算式为:" + expression + " = " + TARGET_NUMBER);
``                 foundSolution = true;
``                 break;
``             }
``         }
``         if (!foundSolution) {
``             resultTextView.setText("无法解密!");
``         }
``     }
`` 
``     private List<Double> calculate(double a, double b) {
``         List<Double> results = new ArrayList<>();
``         results.add(a + b);
``         results.add(a - b);
``         results.add(b - a);
``         results.add(a * b);
``         if (b != 0) {
``             results.add(a / b);
``         }
``         if (a != 0) {
``             results.add(b / a);
``         }
``         return results;
``     }
`` 
``     private List<String> search(List<Integer> nums) {
``         List<String> expressions = new ArrayList<>();
``         if (nums.size() == 1) {
``             expressions.add(Integer.toString(nums.get(0)));
``             return expressions;
``         }
``         for (int i = 0; i < nums.size(); i++) {
``             for (int j = i + 1; j < nums.size(); j++) {
``                 List<Double> results = calculate(nums.get(i), nums.get(j));
``                 for (Double result : results) {
``                     List<Integer> newNums = new ArrayList<>(nums);
``                     newNums.remove(j);
``                     newNums.set(i, result.intValue());
``                     List<String> subExpressions = search(newNums);
``                     for (String subExpression : subExpressions) {
``                         expressions.add(nums.get(i) + "+" + nums.get(j) + subExpression);
``                         expressions.add(nums.get(i) + "-" + nums.get(j) + subExpression);
``                         expressions.add(nums.get(j) + "-" + nums.get(i) + subExpression);
``                         expressions.add(nums.get(i) + "*" + nums.get(j) + subExpression);
``                         if (nums.get(j) != 0 && result != 0) {
``                             expressions.add(nums.get(i) + "/" + nums.get(j) + subExpression);
``                         }
``                         if (nums.get(i) != 0 && result != 0) {
``                             expressions.add(nums.get(j) + "/" + nums.get(i) + subExpression);
``                         }
``                     }
``                 }
``             }
``         }
``         return expressions;
``     }
`` 
``     private boolean isTargetNumber(String expression) {
``         String[] elements = expression.split("[+\\-*/]");
``         String[] operators = expression.split("\\d+");
``         double result = Double.parseDouble(elements[0]);
``         for (int i = 1; i < elements.length; i++) {
``             switch (operators[i]) {
``                 case "+":
``                     result += Double.parseDouble(elements[i]);
``                     break;
``                 case "-":
``                     result -= Double.parseDouble(elements[i]);
``                     break;
``                 case "*":
``                     result *= Double.parseDouble(elements[i]);
``                     break;
``                 case "/":
``                     result /= Double.parseDouble(elements[i]);
``                     break;
``             }
``         }
``         return Math.abs(result - TARGET_NUMBER) < 1e-6;
``     }
`` }

在这个应用程序中,我们使用了 MainActivity 类,并在其中定义了以下方法:

  • onCreate():初始化数字列表、随机数生成器和结果显示的 TextView
  • startGame():从四个 EditText 中获取输入的数字,调用 search(nums) 方法获取所有可能的算式,遍历这些算式,调用 isTargetNumber(expression) 方法判断其是否等于目标数字。如果找到了一个等于目标数字的算式,则在 resultTextView 中显示该算式及其结果,否则输出无法解密。
  • calculate(a, b):计算两个数的加减乘除结果。
  • search(nums):递归搜索所有可能的算式。
  • isTargetNumber(expression):判断一个算式是否等于目标数字。

在布局文件中,我们使用了垂直方向的 LinearLayout,包含四个 EditText 和一个按钮,以及一个用于显示结果的 TextView。当用户点击按钮时,将调用 startGame() 方法进行解密游戏。