当前位置: 首页 > 知识库问答 >
问题:

无法获取井字棋获胜者检查功能以检查对角线

郁宾鸿
2023-03-14

请原谅长标题。StackOverflow不会接受较短的。

我试图在科特林制作一个井字游戏。到目前为止,除了对角线检查之外,一切都运行得非常好。

基本上,winnerCheck() 函数的作用是创建一个矩阵,其中包含井字棋棋盘中的所有容器,然后检查棋盘的行,列和对角线值是否相等。如果检测到获胜者,该函数会将获胜者文本设置为“您获胜”。行和列检查工作正常,但是如果我在对角线上有3个X-s,则没有任何反应。

代码对我来说似乎很好,所以我不知道出了什么问题。

编辑:我知道我还没有包括反对角线检查的条件,这是因为我还没有完成。

package com.example.mygame

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.TextView

class MainActivity : AppCompatActivity() {
    lateinit var view00: TextView
    lateinit var view01: TextView
    lateinit var view02: TextView
    lateinit var view10: TextView
    lateinit var view11: TextView
    lateinit var view12: TextView
    lateinit var view20: TextView
    lateinit var view21: TextView
    lateinit var view22: TextView
    lateinit var winner: TextView


    var playerIndicator = true

    fun createViews() {
        view00 = findViewById(R.id.topleft)
        view01 = findViewById(R.id.topcenter)
        view02 = findViewById(R.id.topright)

        view10 = findViewById(R.id.midleft)
        view11 = findViewById(R.id.midcenter)
        view12 = findViewById(R.id.midright)

        view20 = findViewById(R.id.bottomleft)
        view22 = findViewById(R.id.bottomcenter)
        view21 = findViewById(R.id.bottomright)

        winner = findViewById(R.id.winner)
    }



    fun setListeners() {
        val views = listOf(view00, view01, view02, view10, view11, view12, view20, view22, view21)
        for (view in views) {
            view.setOnClickListener {
                if (playerIndicator == true) {
                    view.setText("X")
                    playerIndicator = false
                    view.setOnClickListener(null)
                    winnerCheck()
                } else {
                    view.setText("O")
                    playerIndicator = true
                    view.setOnClickListener(null)
                    winnerCheck()
                }
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        createViews()
        setListeners()
    }

    fun winnerCheck() {
        val board = arrayOf(
            arrayOf(view00, view01, view02),
            arrayOf(view10, view11, view12),
            arrayOf(view20, view21, view22)
        )

        if (board[0][0].text!="" && board[1][1].text==board[0][0].text && board[2][2].text==board[0][0].text) {
            winner.setText("You win")
        } // DIAGONAL CHECK

        for (i in 0 .. 2) {
            if (board[i][0].text!="" && board[i][0].text==board[i][1].text && board[i][2].text==board[i][0].text) {
                winner.setText("You win")
            }
            if (board[0][i].text!="" && board[1][i].text==board[0][i].text && board[0][i].text==board[2][i].text) {
                winner.setText("You win")
            }
        }

    }
}

共有1个答案

冯星剑
2023-03-14

您必须检查单元格00、11、22和02、11、20中是否有tris,因此请通过进一步检查来更改您的for:

if (board[0][0].text!="" && board[1][1].text==board[0][0].text && board[2][2].text==board[0][0].text) {
    winner.setText("You win")
}
if (board[0][2].text!="" && board[1][1].text==board[0][2].text && board[2][0].text==board[0][2].text) {
    winner.setText("You win")
}

最后,如果其中一个如果可以,你可以停止检查其他的,因为已经有一个赢家了。

 类似资料:
  • 有人给了我一个井字游戏的代码。我制作了代码来检查垂直方向是否会赢,并尝试检查对角线。我能够检查主对角线,但似乎无法确定如何检查辅助对角线。我以为我拥有的代码会起作用,但事实并非如此。我的问题从第172行开始

  • 我想这一定是一个简单的修复,但我仍然熟悉编码,所以偶尔我会陷入一些愚蠢的事情(会赶上的,最终哈哈) (我已经实现了所有其他可能获胜的行和列。没有将它们粘贴在这里以使问题更短,但它们都遵循上面的逻辑) 当玩家放置标记时,我调用该函数,一旦满足一个获胜条件,我会打印消息: 但游戏不会中断(我猜会是,因为我在每个条件后都“Rest”)。我的IF里面会发生什么?就像我说的,猜测一定很简单,但现在卡住了。

  • 我是Java的新手,我正在尝试构建一个简单的TicTactoE-game。我创建了checkforWin方法来检查棋盘上不同组合的胜者,它似乎很管用,但似乎很麻烦,我不确定它是否被认为是“好的编码”。这是我的代码: 问题是将checkforWin方法拆分为两个方法是否更好,一个用于播放机,一个用于计算机。此外,我不知道使用和if-else语句来检查板子上的对角线胜利是否是个好主意,开始两个检查中心

  • 问题内容: 我不明白如何在四连冠中找到获胜方式,请告诉我应该怎么想以及如何在四连冠中找到赢家。我应该如何使用for循环来找到他们。我应该如何使用方法寻找赢家? 问题答案: 在一个简短的Google之后,会弹出以下代码:https : //codereview.stackexchange.com/questions/100917/connect- four-game-in- java 或http:/

  • 我将我的应用程序迁移到Android P(28级),并在运行Android P的模拟器上进行了测试。许可证检查结果显示错误“无法连接到服务器”。在Logcat中,我发现了“不允许清除文本流量”的消息。 我添加了一个配置文件network-security-config.xml:cleartextTraffePermit="true",并在清单中的标签“应用程序”下添加了android: netwo

  • 问题内容: 有没有一种方法可以检查垃圾收集器是否可以提取对象? 在我的代码中的某个地方,我有一个对象的引用: 然后,通过Eclipse Debugger,获得对象的存储位置。之后,我将引用设置为null: 有什么方法可以检查以前引用的对象现在是否适合垃圾回收,或者是否有其他引用? 非常感谢, 斯特凡 问题答案: 您无法在运行时使用任意对象执行此操作,实际上,不可能完全确定地执行此操作。但是,有两种