Android开发示例--井字棋

技术不好,不会封装组件,代码也有很多冗余,如有不足,请见谅,看看乐乐就好。

第一次写博客,分块写的经验不足,就挤到一起了,以后会改进的,下次一定不偷懒

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值