P18 井字游戏(穷举法)
两玩家依此下棋, 一人执X棋, 一人执O棋;
X棋先手, 问: 从给定数组中, 判定该数组生成的盘面在实际下棋中是否有可能出现,并判定盘面情况;
盘面情况:
- 1、X玩家胜利: X为先手, 若胜利则比O多1, 故X-O=1
- 2、O玩家胜利: O为后手, 若胜利则O和X一样多, 故X-O=0
- 3、平手: X==O, 并且两者旗子总数为9
- 4、没下完: X-O=1 || X==O,并且没有胜利者
- 5、否则是不可能出现的盘面
例如[]string{“XXX”,“X O”,“OOO”}; X和O旗子相同,但出现两方胜利,是不可能出现的盘面
例如[]string{“OXX”,“XOX”," O"}; X比O多1,但O为胜利者,是不可能出现的盘面
func GameBoard(array []string) (status string) {var countX, countO intfor i := 0; i < len(array); i++ {for _, bs := range array[i] {if bs == rune('X') { // 字符串用下标为byte, range为runecountX++}if bs == rune('O') {countO++}}}xIsWinner := win(array, 'X')oIsWinner := win(array, 'O')// 1. X玩家胜利, O不能胜利if countX-countO == 1 && xIsWinner && !oIsWinner {return "X玩家胜利"}// 2. O玩家胜利, X不能胜利if countX == countO && oIsWinner && !xIsWinner {return "O玩家胜利"}// 3.平手if countX == countO && 2*countX == 3*3 {return "平手"}// 4.没下完if (countX-countO == 1 || countX == countO) && !xIsWinner && !oIsWinner {return "没下完"}return "不可能出现的盘面"
}func win(array []string, flag byte) bool {for i := 0; i < 3; i++ {// 1.三棋子横向if array[i] == string(flag+flag+flag) {return true}// 2.三旗子纵向if array[i][0] == flag && array[i][1] == flag && array[i][2] == flag {return true}}// 3.三旗子斜对角if array[0][0] == flag && array[1][1] == flag && array[2][2] == flag {return true}if array[0][2] == flag && array[1][1] == flag && array[2][0] == flag {return true}return false
}
func main() {fmt.Println(GameBoard([]string{"XOX", "OXO", "X "}))fmt.Println(GameBoard([]string{"XXX", "X O", "OOO"}))fmt.Println(GameBoard([]string{"OXX", "XOX", " O"}))
}
X玩家胜利
不可能出现的盘面
不可能出现的盘面
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
