701、五子棋算法簡單實現

可以直接看702 第二篇

在這裏插入圖片描述
如上圖是一個五子棋遊戲圖。

輸贏計算算法
        方式一:沒落下一枚棋子從首行首列開始遍歷每個棋子,如發現棋手贏棋則結束遊戲。
        方式二:每落下一枚棋子,從此棋子開始判斷其,縱-橫-左斜-右斜 四個大方向計算棋手輸贏

兩種方式區別:
        方式一:因爲是遍歷所有棋子則可以計算棋子的->右橫、下縱、左下斜、右下斜四個大方向的一部分即可;但是需要計算每個棋子,會造成大量無效計算

        方式二:根據次落下的棋子判斷其四個大方向,八個小方向,也就是方式一剩餘的部分計算,優勢計算規則複雜點,但是不會造成大量無效計算

代碼實現方式一:

import scala.util.control.Breaks
import scala.util.control.Breaks.{break, breakable}

/**
  * 輸贏規則:按照數組座標從第一行第一個開始遍歷每個棋子的四個方向是否5子相連,
  *           因爲是從上到下遍歷棋子所以這四個方向分別是 右橫-下豎-左下斜-右下斜 這四種情況是否五子相連就能判斷出輸贏
  *
  * 缺點:1.需要遍歷棋盤每個位置
  *       2.沒落下一子需要判斷所有棋子
  *
  * 優化:可以使用稀疏數組解決缺點1,但是稀疏數組保存的棋子需要有序按照從上到下,從左到右,只需要對排序的落子位置遍歷
  *       缺點2無法解決!
  *
  * 缺點2解決方案:每落下一子需要遍歷其4個大方向,橫-豎-左斜-右斜 判斷是否有一個方向五子相連
  *       優點:1.不需要對所有棋子遍歷,只需關注落下的棋子
  *       缺點:1.判斷條件相對複雜
  */
object WuziqiDemo01 {
  def main(args: Array[String]): Unit = {
    println("------------輸贏判斷----------")
    //7. 輸贏判斷
    val rowSize = 11
    val colSize = 11
    val array3 = Array.ofDim[Int](rowSize, colSize)
    array3(0)(0) = 2
    array3(0)(1) = 2
    array3(1)(2) = 1
    array3(1)(3) = 1
    array3(1)(4) = 1
    array3(1)(5) = 1
    array3(1)(6) = 1

    array3(2)(3) = 2
    array3(3)(3) = 2
    array3(4)(3) = 2
    //    array3(5)(3) = 2
    array3(6)(3) = 2
    val res = isSY(array3)
    println("棋手:"+res +" 贏了")
  }
  /**
    * 7.判斷棋手輸贏,遍歷數據發現只有四種結果 橫-豎-左斜-右斜 這四種情況,如下數據只要是一種情況就是贏
    * 05	06	07	08	09
    * 05	15	25	35	45
    * 05	14	23	32	41
    * 05	16	27	38	49
    *
    * @param arr
    * @return 返回0:勝負未分;1:白子;2:黑子
    */
    
  def isSY(array: Array[Array[Int]]) = {
    var res = 0
    val outer = new Breaks;
    val inner = new Breaks;
    var bool = false
    //從上到下遍歷每個棋子的右-下-左下斜-右下斜 是否五子相連
    outer.breakable {
      for (i <- 0 until array.length) {
        inner.breakable {
          for (j <- 0 until array(i).length) {
            if (array(i)(j) != 0) {
               bool = dealSY(array, new Node(i, j, array(i)(j))) //一種情況相連,則棋手就勝利了
              if (bool) {
                res = array(i)(j) //返回贏得棋手
                inner.break() //終止兩層循環
              }
            }
          }
        }
        if(bool){
          outer.break()
        }
      }
    }
    res
  }
  //四種情況判斷
  def dealSY(array: Array[Array[Int]], node: Node): Boolean = {
    if (isHeng(array, node) || isShu(array, node) || isZuoxie(array, node) || isYouxie(array, node)) true else false
  }

  /**
    * 判斷橫
    * @param array  數據
    * @param node   當前棋子
    * @return 結果
    */
  def isHeng(array: Array[Array[Int]], node: Node): Boolean = {
    //1. 初始化數據
    val colSize = array(0).length
    var res = true
    //2. 判斷右邊是否還有4列
    if(node.col + 4 > colSize -1){
      return false
    }
    breakable {
      //3. 縱向是否五子相連
      for (i <- 0 to 4) {
        //判斷餘下只要有一列值不相等,則不用進行了
        if (array(node.row)(node.col+i) != node.value) {
          res = false
          break()
        }
      }
    }
    res //4. 返回結果
  }

  //判斷豎
  def isShu(array: Array[Array[Int]], node: Node):Boolean = {
    val rowSize = array.length
    var res = true
    //判斷下邊是否還有4 行
    if(node.row + 4 > rowSize -1){
      return false
    }
    breakable {//縱向是否五子相連
      for (i <- 0 to 4) {
        if (array(node.row+i)(node.col) != node.value) {
          res = false
          break()
        }
      }
    }
    res
  }

  //判斷左下斜
  def isZuoxie(array: Array[Array[Int]], node: Node): Boolean = {
    val rowSize = array.length
    //    val colSize = array(0).length
    var res = true
    //判斷餘下是否還有4行
    if (node.row + 4 > rowSize - 1) {
      return false
    }
    //判斷左邊是否還有4列
    if (node.col - 4 < 0) {
      return false
    }
    breakable {
      for (i <- 0 to 4) {//從當前子開始,左下斜方形判斷五子是否連接
        if (array(node.row + i)(node.col - i) != node.value) {
          res = false
          break()
        }
      }
    }
    res
  }

  //判斷右下斜
  def isYouxie(array: Array[Array[Int]], node: Node): Boolean = {
    val rowSize = array.length
    val colSize = array(0).length
    var res = true
    //判斷餘下是否還有4行
    if (node.row + 4 > rowSize - 1) {
      return false
    }
    //判斷右邊是否還有4列
    if (node.col + 4 > colSize - 1) {
      return false
    }
    breakable {
      for (i <- 0 to 4) { //從當前子開始,右下斜方形判斷五子是否連接
        if (array(node.row + i)(node.col + i) != node.value) {
          res = false
          break()
        }
      }
    }
    res
  }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章