【发布时间】:2014-11-25 01:50:38
【问题描述】:
这是我过去几周在 APCS 中的副项目,我几乎完成了。我基本上是在用 swing 制作一个简单的 gui,它有一个按钮网格并显示像井字游戏这样的图像。但是,我就是无法让获胜序列发挥作用。我已经使用了我在网上找到的方法,但仍然无法正常工作;事实上,它甚至没有意义。我有 1 个打印语句来测试值,它打印了 4 次。我完全迷路了。需要注意的是,我是在我的家用电脑上执行此操作的,所以我没有这台电脑上的图像,但我认为这不会影响程序...?
这是代码(我认为问题出在gameover())
int XgoesFirst=0;
int[] press= {0,0,0,0,0,0,0,0,0};
int count=0;
int over=0;
String Xmess=("Cross for you laymens out there");
String Omess=("Naught for you laymens out there");
String rowWinner="";
String diagWinner="";
String columnWinner="";
private class CellButtonHandler implements ActionListener{
public void actionPerformed(ActionEvent e)
{
ImageIcon xImage = new ImageIcon("images.jpg");
JButton pressed=(JButton)(e.getSource());
if(gameover()){
if(XgoesFirst==0){
pressed.setIcon(xImage);
pressed.setText(Xmess);
XgoesFirst=XgoesFirst+1;
press[count]+=1;
over++;
}else if(XgoesFirst==1){
pressed.setIcon(new ImageIcon("O.jpg",""));
pressed.setText(Omess);
XgoesFirst=XgoesFirst-1;
press[count]+=1;
over++;
}
}
count++;
System.out.println(gameover());
}
}
}
public boolean gameover(){
if(cells[0].getText().equals(cells[1].getText()) && cells[1].getText().equals(cells[2].getText())){
return true;
}else{
if(cells[3].getText().equals(cells[4].getText()) && cells[4].getText().equals(cells[5].getText())){
return true;
}else{
if(cells[6].getText().equals(cells[7].getText()) && cells[7].getText().equals(cells[8].getText())){
return true;
}else{
if(cells[0].getText().equals(cells[3].getText()) && cells[3].getText().equals(cells[6].getText())){
return true;
}else{
if(cells[1].getText().equals(cells[4].getText()) && cells[4].getText().equals(cells[7].getText())){
return true}
else{
if(cells[2].getText().equals(cells[5].getText()) && cells[5].getText().equals(cells[8].getText())){
return true;
}else{
if((cells[0].getText().equals(cells[4].getText()) && cells[4].getText().equals(cells[8].getText())){
return true;
}else{
if(cells[2].getText().equals(cells[4].getText()) && cells[4].getText().equals(cells[6].getText())){
return true;
}else{
if (over>7){
return false;
}else{
return true;
}
}
我知道代码显示是怎么回事,但如果你告诉我如何修复它,我会重新做。
编辑完整代码:
import javax.swing.JFrame;
import java.awt.event.*;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import java.awt.*;
import javax.swing.JButton;
public class TicTacToe extends JFrame
{
private static final int WIDTH = 400;
private static final int HEIGHT = 300;
private Container content;
private JButton[] cells;
private CellButtonHandler[] cellHandlers;
public TicTacToe()
{
// JFrame frame = new JFrame();
Container pane =getContentPane();
pane.setLayout(new GridLayout(3,3));
cells=new JButton[9];
cellHandlers=new CellButtonHandler[9];
for(int i=0; i<9;i++){
cells[i]= new JButton("");
cellHandlers[i]=new CellButtonHandler();
cells[i].addActionListener(cellHandlers[i]);
}
for(int x=0;x<9;x++){
pane.add(cells[x]);
}
setTitle("Tic Tac Toe");
setSize(WIDTH,HEIGHT);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[]args)
{
TicTacToe TicObj= new TicTacToe();
}
int XgoesFirst=0;
int[] press= {0,0,0,0,0,0,0,0,0};
int count=0;
int over=0;
String Xmess=("Cross for you laymens out there");
String Omess=("Naught for you laymens out there");
String rowWinner="";
String diagWinner="";
String columnWinner="";
private class CellButtonHandler implements ActionListener{
public void actionPerformed(ActionEvent e)
{
ImageIcon xImage = new ImageIcon("images.jpg");
JButton pressed=(JButton)(e.getSource());
if(gameover()){
if(XgoesFirst==0){
pressed.setIcon(xImage);
pressed.setText(Xmess);
XgoesFirst=XgoesFirst+1;
press[count]+=1;
over++;
}else if(XgoesFirst==1){
pressed.setIcon(new ImageIcon("O.jpg",""));
pressed.setText(Omess);
XgoesFirst=XgoesFirst-1;
press[count]+=1;
over++;
}
}
count++;
System.out.println(gameover());
}
}
public boolean gameover(){
if(cells[0].getText().equals(cells[1].getText()) && cells[1].getText().equals(cells[2].getText())){
return true;
}else{
if(cells[3].getText().equals(cells[4].getText()) && cells[4].getText().equals(cells[5].getText())){
return true;
}else{
if(cells[6].getText().equals(cells[7].getText()) && cells[7].getText().equals(cells[8].getText())){
return true;
}else{
if(cells[0].getText().equals(cells[3].getText()) && cells[3].getText().equals(cells[6].getText())){
return true;
}else{
if(cells[1].getText().equals(cells[4].getText()) && cells[4].getText().equals(cells[7].getText())){
return true}
else{
if(cells[2].getText().equals(cells[5].getText()) && cells[5].getText().equals(cells[8].getText())){
return true;
}else{
if((cells[0].getText().equals(cells[4].getText()) && cells[4].getText().equals(cells[8].getText())){
return true;
}else{
if(cells[2].getText().equals(cells[4].getText()) && cells[4].getText().equals(cells[6].getText())){
return true;
}else{
if (over>7){
return false;
}else{
return true;
}
}
String winner= "nobody wins cause blame john wells";
public boolean whoWon()
{
boolean rows= rowChecker();
boolean coll= columnChecker();
boolean diag= diagChecker();
if(rows){
winner=rowWinner;
}else if(coll){
winner=columnWinner;
}else if(diag){
winner=diagWinner;
}
Container pane =getContentPane();
pane.removeAll();
pane.repaint();
JButton restart= new JButton(winner+" won click anywhere to restart");
//restart.addActionListener(new Restart());
pane.add(restart);
return true;
}
public boolean rowChecker(){
boolean temp=false;
int p=0;
if(cells[p].getText().equals(cells[p+1].getText())&&cells[p+1].getText().equals(cells[p+2].getText())){
temp=true;
rowWinner= cells[p].getText();
}else{
if(cells[p+3]!=null&&cells[p+3].getText().equals(cells[p+4].getText())&&cells[p+4].getText().equals(cells[p+5].getText())){
temp=true;
rowWinner= cells[p+3].getText();
}else{
if(cells[p+6]!=null&&cells[p+6].getText().equals(cells[p+7].getText())&&cells[p+7].getText().equals(cells[p+8].getText())){
temp=true;
rowWinner= cells[p+6].getText();
}
}
}
return temp;
}
public boolean diagChecker(){
boolean temp1=false;
int w=0;
if(cells[w]!=null&&cells[w].getText().equals(cells[w+4].getText())&&cells[w+4].getText().equals(cells[w+8].getText())){
temp1=true;
diagWinner=cells[w].getText();
}else{
if(cells[w+2]!=null&&cells[w+2].getText().equals(cells[w+4].getText())&&cells[w+4].getText().equals(cells[w+6].getText())){
temp1=true;
diagWinner=cells[w+4].getText();
}
}
return temp1;
}
public boolean columnChecker(){
boolean temp2=false;
int h =0;
if(cells[h]!=null&&cells[h].getText().equals(cells[h+3].getText())&&cells[h+3].getText().equals(cells[h+6].getText())){
columnWinner=cells[h].getText();
temp2=true;
}else{
if(cells[h+1]!=null&&cells[h+1].getText().equals(cells[h+4].getText())&&cells[h+4].getText().equals(cells[h+7].getText())){
temp2=true;
columnWinner=cells[h+1].getText();
}else{
if(cells[h+2]!=null&&cells[h+2].getText().equals(cells[h+5].getText())&&cells[h+5].getText().equals(cells[h+8].getText())){
temp2=true;
columnWinner=cells[h+2].getText();
}
}
}
return temp2;
}
// private class restart implements ActionListener
}
现在我使用的旧方法仍然存在,重启部分还没有完成,但这就是一切。 (我只是无法让逻辑工作的旧方法。我试图让它检测其中一个跳棋是否获胜或游戏是否结束,但我就是无法正确逻辑)
编辑获胜画面
NVM 我现在让它工作了,我只需要知道将它放在哪里,以便它在结束时激活。
【问题讨论】:
-
PC 上没有图像文件会抛出
FileNotFoundException。 -
将每个选项卡更改为 4 个空格。
-
你的
gameover()方法太糟糕了! -
在放弃修改逻辑后,我重新编写了游戏结束方法,所以是的,它很烂
-
让我调试你的项目并修改一些东西,然后我会发布一些工作代码。应该只需要 10 - 20 分钟。