技术不好,不会封装组件,代码也有很多冗余,如有不足,请见谅,看看乐乐就好。
第一次写博客,分块写的经验不足,就挤到一起了,以后会改进的,下次一定不偷懒
package com.example.tictactoe;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
public Button mButton; // 开始按钮对象
public List<ImageView> images; // 界面视图中的ImageView对象集合
public boolean chess; // 表示当前应该下什么子(圆圈,叉叉)
public boolean isClickAble; // 表示当前比赛是否结束,结束则不能继续下子,(实际上有bug,就当没看见就好)
public int[][] flags; // 表示每个位置的子的状态(-1,0,1)-- (叉叉,空,圆圈)
public int tem; // 一个暂时的计数器,用于计算当前局面比赛是否结束
public int filled; // 一个长时的全局计数器,表示当前局面是否下满子了
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init(); // 调用自定义方法,初始化属性
// 为按钮添加事件(清屏,初始化参数)
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
for (int i = 0; i < 9; i++) {
images.get(i).setImageResource(R.drawable.image_selector);
}
isClickAble = true;
filled = 0;
chess=true;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
flags[i][j] = 0;
}
}
Toast.makeText(getApplicationContext(), "比赛开始", Toast.LENGTH_LONG).show();
}
});
// 以下的一堆代码都是重复的,一开始以为可以用for循环或者用一个变量来集中管理,后来试了一下,好像不行,有知道的欢迎留言
images.get(0).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
flags[0][0] = chess?1:-1; // 通过判断下什么子,给它对应的数值,下面有很多雷同操作,不再赘述
if(isFinished()){ // 函数的说明在下面,基本就是判断游戏是否结束
if(isClickAble) { // 结束了还要下一个子,感觉逻辑上有点别扭,不过暂时没想到更好的处理方式
// 由于知道的Android组件不多,所以是采用图片的方式来表示棋子的
images.get(0).setImageResource(chess ? R.drawable.image_selector_bai : R.drawable.image_selector_hei);
// 切换下一个下的子的类型
isClickAble = false;
}
return;
}
if(isClickAble){
// 同上
images.get(0).setImageResource(chess?R.drawable.image_selector_bai:R.drawable.image_selector_hei);
chess = !chess;
}
}
});
images.get(1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
flags[0][1] = chess?1:-1;
if(isFinished()){
if(isClickAble) {
images.get(1).setImageResource(chess ? R.drawable.image_selector_bai : R.drawable.image_selector_hei);
isClickAble = false;
}
return;
}
if(isClickAble){
images.get(1).setImageResource(chess?R.drawable.image_selector_bai:R.drawable.image_selector_hei);
chess = !chess;
}
}
});
images.get(2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
flags[0][2] = chess?1:-1;
if(isFinished()){
if(isClickAble) {
images.get(2).setImageResource(chess ? R.drawable.image_selector_bai : R.drawable.image_selector_hei);
isClickAble = false;
}
return;
}
if(isClickAble){
images.get(2).setImageResource(chess?R.drawable.image_selector_bai:R.drawable.image_selector_hei);
chess = !chess;
}
}
});
images.get(3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
flags[1][0] = chess?1:-1;
if(isFinished()){
if(isClickAble) {
images.get(3).setImageResource(chess ? R.drawable.image_selector_bai : R.drawable.image_selector_hei);
isClickAble = false;
}
return;
}
if(isClickAble){
images.get(3).setImageResource(chess?R.drawable.image_selector_bai:R.drawable.image_selector_hei);
chess = !chess;
}
}
});
images.get(4).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
flags[1][1] = chess?1:-1;
if(isFinished()){
if(isClickAble) {
images.get(4).setImageResource(chess ? R.drawable.image_selector_bai : R.drawable.image_selector_hei);
isClickAble = false;
}
return;
}
if(isClickAble){
images.get(4).setImageResource(chess?R.drawable.image_selector_bai:R.drawable.image_selector_hei);
chess = !chess;
}
}
});
images.get(5).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
flags[1][2] = chess?1:-1;
if(isFinished()){
if(isClickAble) {
images.get(5).setImageResource(chess ? R.drawable.image_selector_bai : R.drawable.image_selector_hei);
isClickAble = false;
}
return;
}
if(isClickAble){
images.get(5).setImageResource(chess?R.drawable.image_selector_bai:R.drawable.image_selector_hei);
chess = !chess;
}
}
});
images.get(6).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
flags[2][0] = chess?1:-1;
if(isFinished()){
if(isClickAble) {
images.get(6).setImageResource(chess ? R.drawable.image_selector_bai : R.drawable.image_selector_hei);
isClickAble = false;
}
return;
}
if(isClickAble){
images.get(6).setImageResource(chess?R.drawable.image_selector_bai:R.drawable.image_selector_hei);
chess = !chess;
}
}
});
images.get(7).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
flags[2][1] = chess?1:-1;
if(isFinished()){
if(isClickAble) {
images.get(7).setImageResource(chess ? R.drawable.image_selector_bai : R.drawable.image_selector_hei);
isClickAble = false;
}
return;
}
if(isClickAble){
images.get(7).setImageResource(chess?R.drawable.image_selector_bai:R.drawable.image_selector_hei);
chess = !chess;
}
}
});
images.get(8).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
flags[2][2] = chess?1:-1;
if(isFinished()){
if(isClickAble) {
images.get(8).setImageResource(chess ? R.drawable.image_selector_bai : R.drawable.image_selector_hei);
isClickAble = false;
}
return;
}
if(isClickAble){
images.get(8).setImageResource(chess?R.drawable.image_selector_bai:R.drawable.image_selector_hei);
chess = !chess;
}
}
});
}
// 判断当前局面是否结束 true表示结束
public boolean isFinished(){
filled++; // 计数,当前局面下的总子数+1,这是有bug的,一个地方可以重复下子,重复计数,就当没看见,优话的话可以改为
// 传参函数,同时维护一个棋子的数组
// 行遍历,看是否有一行成功了
for(int i=0;i<3;i++){
tem = 0;
for(int j=0;j<3;j++){
tem += flags[i][j];
}
if(tem==3||tem==-3){
Toast.makeText(getApplicationContext(), tem==3?"圆圈获胜":"叉叉获胜", Toast.LENGTH_LONG).show();
return true;
}
}
// 列遍历,看是否有一列成功了
for(int i=0;i<3;i++){
tem = 0;
for(int j=0;j<3;j++){
tem += flags[j][i];
}
if(tem==3||tem==-3){
Toast.makeText(getApplicationContext(), tem==3?"圆圈获胜":"叉叉获胜", Toast.LENGTH_LONG).show();
return true;
}
}
// 对角线判断,简陋是简陋了点,不过逻辑是对的,不是吗 (* . *)
tem = flags[0][0] +flags[1][1] +flags[2][2];
if(tem==3||tem==-3){
Toast.makeText(getApplicationContext(), tem==3?"圆圈获胜":"叉叉获胜", Toast.LENGTH_LONG).show();
return true;
}
tem = flags[0][2] +flags[1][1] +flags[2][0];
if(tem==3||tem==-3){
Toast.makeText(getApplicationContext(), tem==3?"圆圈获胜":"叉叉获胜", Toast.LENGTH_LONG).show();
return true;
}
// 判断是否下满了,由于是放在最后判断的,所以不用考虑是否有胜负,到了这,肯定是平局
if(filled==9){
Toast.makeText(getApplicationContext(), "平局了,再来一局不", Toast.LENGTH_LONG).show();
return true;
}
return false;
}
// 初始化参数
public void init() {
filled = 0;
isClickAble = true;
chess = true;
flags = new int[3][3];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
flags[i][j] = 0;
}
}
mButton = findViewById(R.id.start);
images = new ArrayList<>();
images.add(findViewById(R.id.img_1_1));
images.add(findViewById(R.id.img_1_2));
images.add(findViewById(R.id.img_1_3));
images.add(findViewById(R.id.img_2_1));
images.add(findViewById(R.id.img_2_2));
images.add(findViewById(R.id.img_2_3));
images.add(findViewById(R.id.img_3_1));
images.add(findViewById(R.id.img_3_2));
images.add(findViewById(R.id.img_3_3));
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TableLayout android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#FFFFFF"
android:layout_marginTop="100dp">
<TableRow android:layout_width="wrap_content">
<ImageView android:id="@+id/img_1_1"
android:layout_height="120dp"
android:layout_width="120dp"
android:layout_margin="1dp"
android:scaleType="fitXY"
android:src="@mipmap/kong"
android:clickable="true"/>
<ImageView android:id="@+id/img_1_2"
android:layout_height="120dp"
android:layout_width="120dp"
android:layout_margin="1dp"
android:scaleType="centerCrop"
android:src="@mipmap/kong"
android:clickable="true"/>
<ImageView android:id="@+id/img_1_3"
android:layout_height="120dp"
android:layout_width="120dp"
android:layout_margin="1dp"
android:scaleType="centerCrop"
android:src="@mipmap/kong"
android:clickable="true"/>
</TableRow>
<TableRow android:layout_width="wrap_content">
<ImageView android:id="@+id/img_2_1"
android:layout_height="120dp"
android:layout_width="120dp"
android:layout_margin="1dp"
android:scaleType="fitXY"
android:src="@mipmap/kong"
android:clickable="true"/>
<ImageView android:id="@+id/img_2_2"
android:layout_height="120dp"
android:layout_width="120dp"
android:layout_margin="1dp"
android:scaleType="centerCrop"
android:src="@mipmap/kong"
android:clickable="true"/>
<ImageView android:id="@+id/img_2_3"
android:layout_height="120dp"
android:layout_width="120dp"
android:layout_margin="1dp"
android:scaleType="centerCrop"
android:src="@mipmap/kong"
android:clickable="true"/>
</TableRow>
<TableRow android:layout_width="wrap_content">
<ImageView android:id="@+id/img_3_1"
android:layout_height="120dp"
android:layout_width="120dp"
android:layout_margin="1dp"
android:scaleType="fitXY"
android:src="@mipmap/kong"
android:clickable="true"/>
<ImageView android:id="@+id/img_3_2"
android:layout_height="120dp"
android:layout_width="120dp"
android:layout_margin="1dp"
android:scaleType="centerCrop"
android:src="@mipmap/kong"
android:clickable="true"/>
<ImageView android:id="@+id/img_3_3"
android:layout_height="120dp"
android:layout_width="120dp"
android:layout_margin="1dp"
android:scaleType="centerCrop"
android:src="@mipmap/kong"
android:clickable="true"/>
</TableRow>
<Button
android:id="@+id/start"
android:layout_width="200dp"
android:layout_height="60dp"
android:text="开始游戏"></Button>
</TableLayout>
</LinearLayout>