Android 九宫格移动文字小游戏
2022-08-22 本文已影响0人
silencefun
想起来很久以前玩的那个滑块拼图。
设计思路:用八个textview 展示状态。
1.布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_state"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:gravity="center"
android:onClick="onClick"
android:text="5555 "
android:textSize="22sp" />
<TextView
android:id="@+id/tv5"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerInParent="true"
android:gravity="center"
android:onClick="onClick"
android:text="五"
android:textSize="22sp" />
<TextView
android:id="@+id/tv2"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_above="@id/tv5"
android:layout_centerInParent="true"
android:gravity="center"
android:onClick="onClick"
android:text="二"
android:textSize="22sp" />
<TextView
android:id="@+id/tv1"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_above="@id/tv5"
android:layout_toLeftOf="@id/tv2"
android:gravity="center"
android:onClick="onClick"
android:text="一"
android:textSize="22sp" />
<TextView
android:id="@+id/tv3"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_above="@id/tv5"
android:layout_toRightOf="@id/tv2"
android:gravity="center"
android:onClick="onClick"
android:text="三"
android:textSize="22sp" />
<TextView
android:id="@+id/tv4"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerInParent="true"
android:layout_toLeftOf="@id/tv5"
android:gravity="center"
android:onClick="onClick"
android:text="四"
android:textSize="22sp" />
<TextView
android:id="@+id/tv6"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerInParent="true"
android:layout_toRightOf="@id/tv5"
android:gravity="center"
android:onClick="onClick"
android:text="六"
android:textSize="22sp" />
<TextView
android:id="@+id/tv7"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_below="@id/tv5"
android:layout_toLeftOf="@id/tv2"
android:gravity="center"
android:onClick="onClick"
android:text="七"
android:textSize="22sp" />
<TextView
android:id="@+id/tv8"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_below="@id/tv5"
android:layout_centerInParent="true"
android:gravity="center"
android:onClick="onClick"
android:text="八"
android:textSize="22sp" />
<TextView
android:id="@+id/tv9"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_below="@id/tv5"
android:layout_centerInParent="true"
android:layout_toRightOf="@id/tv5"
android:gravity="center"
android:onClick="onClick"
android:text=""
android:textSize="22sp" />
</RelativeLayout>
2.实现
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
TextView tv1, tv2, tv3, tv4, tv5, tv6, tv7, tv8, tv9;
TextView tv_state;
List<TextView> textViewList = new ArrayList<>();
List<TextView> canClick = new ArrayList<>();
char[] arr = new char[9];
char space = ' ';
String string = "12345678";
String or = string + space;
int whitePos;//最后一个
int colunm = 3;
private int sum = 0;
private int num = 9;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
num = or.length();
initview();
arr = shuffle(or);
updateView(false);
}
private void updateView(boolean isClick) {
for (int i = 0; i < arr.length; i++) {
textViewList.get(i).setText(String.valueOf(arr[i]));
if (String.valueOf(arr[i]).equals(" ")) {
whitePos = i;
}
}
checkCanClick(whitePos);
if (isClick) {
sum++;
tv_state.setText(String.format("一共走了%d步", sum));
}
}
private void initview() {
tv1 = findViewById(R.id.tv1);
tv2 = findViewById(R.id.tv2);
tv3 = findViewById(R.id.tv3);
tv4 = findViewById(R.id.tv4);
tv5 = findViewById(R.id.tv5);
tv6 = findViewById(R.id.tv6);
tv7 = findViewById(R.id.tv7);
tv8 = findViewById(R.id.tv8);
tv9 = findViewById(R.id.tv9);
tv_state = findViewById(R.id.tv_state);
textViewList.add(tv1);
textViewList.add(tv2);
textViewList.add(tv3);
textViewList.add(tv4);
textViewList.add(tv5);
textViewList.add(tv6);
if (num == 9) {
textViewList.add(tv7);
textViewList.add(tv8);
textViewList.add(tv9);
} else {
tv7.setVisibility(View.GONE);
tv8.setVisibility(View.GONE);
tv9.setVisibility(View.GONE);
}
}
private void checkCanClick(int pos) {
whitePos = pos;
canClick.clear();
if (pos - 1 >= 0 && pos % 3 != 0) {
canClick.add(textViewList.get(pos - 1));
}
if (pos + 1 < textViewList.size() && (pos + 1) % 3 != 0) {
canClick.add(textViewList.get(pos + 1));
}
if (pos - colunm >= 0) {
canClick.add(textViewList.get(pos - colunm));
}
if (pos + colunm < textViewList.size()) {
canClick.add(textViewList.get(pos + colunm));
}
for (TextView textView : textViewList) {
if (canClick.contains(textView)) {
textView.setTextColor(getResources().getColor(R.color.purple_700));
} else {
textView.setTextColor(getResources().getColor(R.color.black));
}
}
}
@Override
public void onClick(View view) {
if (canClick.contains(view)) {
int whiteNext = textViewList.indexOf(view);
char temp = arr[whiteNext];
arr[whiteNext] = arr[whitePos];
arr[whitePos] = temp;
updateView(true);
checkSuc();
} else {
}
}
private void checkSuc() {
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < textViewList.size(); i++) {
sb.append(textViewList.get(i).getText().toString());
}
if (sb.toString().equals(or)) {
Toast.makeText(this, String.format("您已完成一共走了%d步", sum), Toast.LENGTH_SHORT).show();
tv_state.setText(String.format("您已完成一共走了%d步", sum));
}
}
public static char[] shuffle(String original) {
char[] arr = original.toCharArray();
Random rnd = new Random();
char tmp;
int j;
for (int i = arr.length; i > 1; i--) {
j = rnd.nextInt(i);
tmp = arr[i - 1];
arr[i - 1] = arr[j];
arr[j] = tmp;
}
return arr;
}
}