- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我在使 CheckTie 方法正常工作时遇到问题,我尝试使用 boolean 值使其正常工作,但它只是宣布当我按下第一个按钮时有平局。我确实有一个方法可以检查游戏板是否已满,但当我尝试让我的 View 类实现它时似乎存在一些问题。
它至少正确地显示了获胜者。
我的 checkTie 方法做错了什么?
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
public class Model extends Observable implements ModelInterface {
private int[][] board = new int[3][3];
private int player;
private List<Observer> observers;
private char winner;
private boolean tie;
public Model(){
player =1;
this.observers=new ArrayList<>();
reset();
}
public int [][] getBoard(){
return board;
}
@Override
public void movePlayer(String input) {
int tmp = Integer.parseInt(input);
int x = tmp %3;
int y = tmp /3;
updateBoard(x,y);
checkWin();
checkTie();
}
private void updateBoard(int x, int y) {
if ( board[x][y] == 0){
board[x][y] = player;
if (player == 1)
player = 2;
else
player = 1;
}
this.setChanged();
this.notifyObservers(this);
}
private void checkWin(){
if(board[0][0] != 0 && board[0][0] == board[1][1] && board[1][1] == board[2][2]){
winnerFound(board[0][0]);
}
else if(board[0][2] != 0 && board[0][2] == board[1][1] && board[1][1] == board[2][0]){
winnerFound(board[0][2]);
}
else{
for(int i = 0; i <3; i++){
if(board[i][0] != 0 && board[i][0] == board[i][1] && board[i][1] == board[i][2]){
winnerFound(board[i][0]);
break;
}
if(board[0][i] != 0 && board[0][i] == board[1][i] && board[1][i] == board[2][i]){
winnerFound(board[0][i]);
break;
}
}
}
}
private void winnerFound(int board){
this.winner= (char) board;
reset();
}
private boolean checkTie(){
boolean tie = true;
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
if(board[i][j] == 0)
{
tie = true;
}
}
}
return tie;
}
public int isThereAWinner() {
if (winner ==1)
return 1;
return winner;
}
public boolean isThereATie() {
if (tie = false)
return false;
else
return true;
}
@Override
public void register(Observer obj) {
if (obj == null) throw new NullPointerException();
if(!observers.contains(obj)) observers.add(obj);
}
private void reset() {
// for(JButton label : board){
// label.setText("");
// }
// panel.repaint();
setChanged();
this.notifyObservers();
}
@Override
public void unregister(Observer obj) {
}
@Override
public Object getUpdate(Observer obj) {
return null;
}
}
这是 View 类:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
@SuppressWarnings("serial")
public class View extends JFrame implements ViewInterface, Observer {
Controller controller;
JPanel panel;
ArrayList<JButton> board = new ArrayList();
JPanel messagePanel;
JLabel topText;
JPanel sidePanel;
JPanel westPanel;
JTextField Spelare;
JButton LäggTill, Exit;
JButton test;
JList lista;
DefaultListModel model; //Lista för spelare
//private String letter = " ";
// private int count = 0;
// private char winner;
public View(Controller controller){
super();
this.controller = controller;
setupUI();
}
private void setupUI(){
setupFrame();
setupMessagePanel();
setupPanel();
setupBoard();
setupPlayers();
setupLäggTill();
this.getContentPane().add(panel);
}
private void setupFrame(){
setSize(400,400);
setTitle("Tic-Tac-Toe");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setLayout(new BorderLayout());
}
private void setupMessagePanel(){
messagePanel = new JPanel();
topText = new JLabel("X startar");
messagePanel.add(topText);
this.getContentPane().add(messagePanel, BorderLayout.SOUTH);
}
private void setupPlayers(){
sidePanel = new JPanel();
westPanel = new JPanel();
Spelare = new JTextField("Skriv ditt namn", 9);
Spelare.addActionListener(controller);
model = new DefaultListModel(); //DefaultListModel för att lägga till personer
lista = new JList(model);
lista.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
lista.setLayoutOrientation(JList.VERTICAL);
lista.setVisibleRowCount(7);
lista.setPreferredSize(new Dimension(50,200));
sidePanel.add(Spelare);
westPanel.add(lista);
this.getContentPane().add(sidePanel, BorderLayout.NORTH);
this.getContentPane().add(westPanel, BorderLayout.WEST);
}
private void setupLäggTill()
{
LäggTill = new JButton("Lägg till");
Exit = new JButton("Exit");
LäggTill.setActionCommand("Lägg till");
LäggTill.addActionListener(controller);
Exit.setActionCommand("Exit");
Exit.addActionListener(controller);
sidePanel.add(LäggTill);
messagePanel.add(Exit);
this.getContentPane().add(sidePanel, BorderLayout.NORTH);
}
private void setupPanel(){
panel = new JPanel();
panel.setLayout(new GridLayout(3, 3, -1, -1));
}
private void setupBoard(){
for(int i = 0; i < 9; i++){
JButton symbol = new JButton();
symbol.setText("");
symbol.setSize(new Dimension(400/3,400/3));
symbol.setHorizontalAlignment(JLabel.CENTER);
symbol.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2,Color.RED));
symbol.addActionListener(controller);
symbol.setActionCommand(String.valueOf(i));
board.add(symbol);
panel.add(symbol);
}
}
@Override
public void gameTie() {
giveMessage("Oavgjort", "Otur, ingen vann");
reset();
}
@Override
public void gameWon(char winner) {
giveMessage("Spel klart", winner + " vann!");
reset();
}
private void giveMessage(String header, String message){
JOptionPane.showMessageDialog(this,
message,
header,
JOptionPane.PLAIN_MESSAGE);
}
private void reset() {
for(JButton label : board){
label.setText("");
}
panel.repaint();
}
public void update(Observable o, Object arg) {
Model model_copy = (Model)o;
int[][] test = model_copy.getBoard();
int winner = model_copy.isThereAWinner();
boolean tie = model_copy.isThereATie();
int index = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if(test[j][i] == 1)
{
this.board.get(index).setText("X");
}
else if (test[j][i] == 2)
{
this.board.get(index).setText("O");
}
// else if(test[j][i]==3)
// {
// this.board.get(index).setEnabled(false);
// }
index ++;
}
}
if (winner ==1)
{
giveMessage("Spel klart", "X" + " vann!");
reset();
}
else if (winner ==2)
{
giveMessage("Spel klart", "O" + " vann!");
reset();
}
else if (tie ==false)
{
giveMessage("Oavgjort", "Otur, ingen vann");
}
}
}
最佳答案
您的情况必须符合以下条件。否则,由于您始终返回 true
,因此始终存在平局。如果我们仍然有一个带有 0
的单元格,则意味着游戏尚未结束,不可能是平局。
if(board[i][j] == 0) {
tie = false;
}
<小时/>
private boolean checkTie(){
boolean tie = true;
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
if(board[i][j] == 0) {
tie = false;
}
}
}
return tie;
}
关于java - Java Tic-tac-toe 中的 CheckTie 函数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37088817/
我是初学者,所以我的代码很乱。我还没有完整地评论这个游戏,所以如果你需要澄清一些变量,我可以给你。 (顺便说一句,这是一个要求制作井字游戏的c++项目) 我的主要问题是,我将如何重复我的棋盘(每次有人
我正在为C的Tic Tac Toe代码编写一个简单的游戏。我已经完成了大部分代码,但是我希望AI永不丢失。 我已经阅读了有关minimax算法的信息,但我不理解。如何使用此算法使计算机获胜或平局,但永
感谢这里人们的帮助,我成功地禁用了点击 div 并在已经使用 $(".pos").addClass('already-played'); 选择它们时覆盖它们; 以及 CSS 中的这个: .已经播放{
我有一个井字棋游戏,其中用户(x)玩CPU(o)。游戏开始时,CPU 将 (o) 放置在中心,并在用户之后移动到随机位置。游戏设置为循环,但一旦出现获胜者,它就会重置,并且不会显示“你赢/输的横幅”。
我试图在没有人工智能的情况下实现井字棋游戏。不知怎的,我的点击功能会自动触发。您能帮我理解为什么点击功能会自动触发吗?这是 HTML 代码片段。 Tic Tac Toe Gam
我正在制作一个井字游戏程序。我计划将 minimax 与它一起使用。我制作了一棵树,其中包含所有可能的游戏序列的空间,并且我正在寻找一种方法来填充它。我目前有这种类型: typedef struct
我正在尝试遵循本教程: https://www.youtube.com/watch?v=Db3cC5iPrOM 2:59 我听不懂他在说什么。 我不明白为什么他在构造函数(public static
我在这里为我的java作业编写了井字棋游戏,一切都很好,除了一个小问题,即当您输入最后一步(第九回合)时,最后一个“X”不显示。这不仅很烦人,因为获胜的棋子没有显示,而且还导致了一些问题,即领带方法没
我对编码和 Java 比较陌生,在我的 CS-173 类(class)中,我的任务是创建一个 Tic Tac Toe 游戏。然而,当谈到创建确定获胜者的方法时,每当我获得“胜利”时,代码都不会运行说我
您好,我想尝试制作一个井字游戏,但遇到问题。我仍然是一个初学者,所以请随意提供有关组织和类似内容的提示,但我的问题是我的方法 checkRowWin、checkColoumnWin 和 E.T.C 添
我正在研究 Tic-Tac-Toe 游戏 (3x3) 的 alpha-beta 剪枝算法。目前,对于任何给定的 3x3 网格实例,我都能找出最好的情况: public Best chooseAlpha
我是一名初学者,正在学习 Java super 技能类(class)。我试图尝试 this VS Code 中的 tic tac toe 游戏项目。效果很好。但代码在提交时出错。 代码: packag
我已经研究“死代码”和“无法访问的代码”有一段时间了,但我似乎仍然无法弄清楚我的程序中这个问题是怎么回事。这是我所拥有的一个片段; “gameEnd()”方法检查 Tic Tac Toe 中的获胜者:
我目前正在做一项任务,即创建一个 Tic Tac Toe 游戏。我已经做到了玩家可以在棋盘上放置标记、绘制标记并随后切换回合。但是,只有当玩家将其标记放在左上角(第一个)字段时,我检查是否存在获胜条件
编辑:我注意到,当您为 TicTacToe 表输入错误的数字时,我的程序会输出“无效移动”。什么会导致这种情况呢?我只使用 move(row, col) 方法一次,因此它不会重复无效输入两次。 我一直
import java.util.Scanner; public class TTT{ public static int row, col; public static Scanner scan =
这个问题已经有答案了: Is Java "pass-by-reference" or "pass-by-value"? (91 个回答) 已关闭 7 年前。 我的井字棋程序有一个小问题。我有一个嵌套计
我正在用 python 开发一个 tic-tac-toe 程序。现在,轮到人类了,一切顺利。然而,AI 在玩完第一个回合后,不会再玩任何后续回合。我扫描了代码,似乎找不到任何可能导致此问题的错误。 请
function checkWin(){ if (arro[0] === arro[1] === arro[2] === 1 || arro[3] === arro[4] === arro[5] ==
我尝试更改innerHTML 的所有内容都没有改变任何内容。没有 X 或 O,并且不会显示当前玩家的姓名。我一直在试图解决这个问题。我一直在寻找答案,据我所知,我所做的一切都是我应该做的。我今晚必须交
我是一名优秀的程序员,十分优秀!