1)我无法在GUI中调用实例方法
2)我无法实现特定功能。
我有两个基本问题。首先,我需要GUI来识别我的实例方法(即,当我在GUI中调用isWin方法时,该方法无法识别,“找不到符号”)。
我的另一个问题是执行特定功能。如果我的战斗机是水战斗机,那么他应该能够击败水战斗机高达三级。因此,第8级水手应该击败第10级水手。我不知道如何实现此功能。
我试图将其放入isWin方法中,如果水兵调用该方法,则传递给对方的任何字符都应下降3级;如果调用isWin的战士为FireFighter,则调用它的战士应下降3级。给反对派一个优势。但这显然不起作用,因为如果我得到一名消防员推荐另一名消防员怎么办?然后其中一名战士有不公平的优势。
//我的界面
package OOPFight;
import java.util.ArrayList;
public interface Character {
public boolean isWin(Character c);
public String getName();
public int getLevel();
public String toString();
}
//我的超一流战斗机
package OOPFight;
import java.util.ArrayList;
/**
*
* @author Owner
*/
public class fighter implements Character {
public String name;
public int level;
public String type;
public fighter(String n, int l, String t) {
name = n;
level = l;
type = t;
}
public boolean isWin(Character c) {
if (level > c.getLevel()) {
return true;
} else if (c.getLevel() > level) {
return false;
} else {
int random = (int) (Math.random() * 2 + 1);
if (random == 1) {
return true;
} else {
return false;
}
}
}//end iswin
public String toString() {
String desc;
desc = name + ":" + level + ":" + type;
return desc;
}//end toString()
public String getType() {
return type;
}//end toString()
public String getName() {
return name;
}
public int getLevel() {
return level;
}
}
//我的子类别WaterFighter
import java.util.ArrayList;
public class WaterFighter extends fighter{
public String name;
public int level;
public String type;
public WaterFighter(String n, int l, String t) {
super(n, l, t);
}
public boolean isWin(Character c){
int level2 = c.getLevel() - 3;
int level1 = level;
if (level1 > level2){
return true;
} else if (level2 > level1){
return false;
} else {
int random = (int) (Math.random() * 2 + 1);
if (random == 1) {
return true;
} else {
return false;
}//end if
}//end if
}//end isWin
}//end class
//我的子类FireFighter
package OOPFight;
import java.util.ArrayList;
public class FireFighter extends fighter{
public String name;
public int level;
public String type;
public FireFighter(String n, int l, String t) {
super(n, l, t);
}
public boolean isWin(Character c){
int level2 = c.getLevel();
int level1 = level - 3;
if (level1 > level2){
return true;
} else if (level2 > level1){
return false;
} else {
int random = (int) (Math.random() * 2 + 1);
if (random == 1) {
return true;
} else {
return false;
}//end if
}//end if
}//end isWin
}//end class
//我的桂
package OOPFight;
import java.util.ArrayList;
/**
*
* @author Owner
*/
public class fight extends javax.swing.JFrame {
public static ArrayList allFighters = new ArrayList();
/**
* Creates new form fight
*/
public fight() {
initComponents();
ArrayList allFighterTypes = new ArrayList();
allFighterTypes.add("Water Fighter");
allFighterTypes.add("Fire Fighter");
for (int i = 0; i < 2; i++){
typesComboBox.addItem((String) allFighterTypes.get(i));
}
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
nameField = new javax.swing.JTextField();
createFighter = new javax.swing.JButton();
jLabel4 = new javax.swing.JLabel();
typesComboBox = new javax.swing.JComboBox<>();
jLabel5 = new javax.swing.JLabel();
levelField = new javax.swing.JTextField();
jPanel2 = new javax.swing.JPanel();
jLabel2 = new javax.swing.JLabel();
firstCombo = new javax.swing.JComboBox<>();
jLabel6 = new javax.swing.JLabel();
secondCombo = new javax.swing.JComboBox<>();
jButton2 = new javax.swing.JButton();
display = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jPanel1.setBackground(new java.awt.Color(255, 255, 0));
jLabel1.setFont(new java.awt.Font("Gadugi", 0, 24)); // NOI18N
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel1.setText("Fighter Regristration");
jLabel3.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
jLabel3.setText("Name:");
createFighter.setText("Create Fighter!");
createFighter.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
createFighterActionPerformed(evt);
}
});
jLabel4.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
jLabel4.setText("Type:");
jLabel5.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
jLabel5.setText("Level:");
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 357, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel3)
.addComponent(jLabel4)
.addComponent(jLabel5))
.addGap(18, 18, 18)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(nameField)
.addComponent(typesComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(levelField))))
.addComponent(createFighter))
.addContainerGap(33, Short.MAX_VALUE))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(43, 43, 43)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel3)
.addComponent(nameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(47, 47, 47)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel4)
.addComponent(typesComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(37, 37, 37)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel5)
.addComponent(levelField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(57, 57, 57)
.addComponent(createFighter)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanel2.setBackground(new java.awt.Color(0, 255, 255));
jLabel2.setFont(new java.awt.Font("Gadugi", 0, 24)); // NOI18N
jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel2.setText("Fighting Arena");
jLabel6.setText("VS.");
jButton2.setText("Fight!");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
display.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
display.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jButton2)
.addGap(170, 170, 170))
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(display, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(firstCombo, 0, 184, Short.MAX_VALUE)
.addGap(33, 33, 33)
.addComponent(jLabel6)
.addGap(18, 18, 18)
.addComponent(secondCombo, javax.swing.GroupLayout.PREFERRED_SIZE, 169, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(116, 116, 116)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(firstCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel6)
.addComponent(secondCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(108, 108, 108)
.addComponent(jButton2)
.addGap(67, 67, 67)
.addComponent(display, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(113, Short.MAX_VALUE))
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
pack();
}// </editor-fold>
private void createFighterActionPerformed(java.awt.event.ActionEvent evt) {
String n = nameField.getText();
String leveler = levelField.getText();
int level = Integer.parseInt(leveler);
int typer = typesComboBox.getSelectedIndex();
String type = null;
if (typer == 1){
type = "WaterFighter";
} else if (typer == 2){
type = "FireFighter";
}
allFighters.add( new fighter(n, level, type));
firstCombo.addItem(allFighters.toString());
secondCombo.addItem(allFighters.toString());
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
int monster1 = firstCombo.getSelectedIndex();
int monster2 = secondCombo.getSelectedIndex();
boolean win = allFighters.get(monster1).isWin(allFighters.get(monster2));
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(fight.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(fight.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(fight.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(fight.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new fight().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton createFighter;
private javax.swing.JLabel display;
private javax.swing.JComboBox<String> firstCombo;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JTextField levelField;
private javax.swing.JTextField nameField;
private javax.swing.JComboBox<String> secondCombo;
private javax.swing.JComboBox<String> typesComboBox;
// End of variables declaration
}
//结束代码
我希望我可以在GUI类中正确调用isWin方法,并且可以正确实现该功能,其中在功能上存在区别,其中WaterFighter可以击败FireFighter高3级。因此,级别8的水手可以击败级别10的消防员。
答案 0 :(得分:2)
因此,在进行大量挖掘之后,问题归结为这一行...
boolean win = allFighters.get(monster1).isWin(allFighters.get(monster2));
这会产生错误
fight.java:117: error: cannot find symbol
boolean win = allFighters.get(monster1).isWin(allFighters.get(monster2));
与此相关的问题可以追溯到您如何声明allFighters
...
public static ArrayList allFighters = new ArrayList();
默认情况下,ArrayList
可以管理任何类型的Object
,因此,当您调用get
时,它将返回一个实例Object
,该实例显然没有{ {1}}方法。
您可以转换isWin
的结果,但是更简单的解决方案是利用Java的内置通用支持。
现在,由于您的所有战斗机类型都源自get
,因此您可以将Character
allFighters
约束为ArrayList
,就像...
Character
这将放置一个编译时间约束,以确保public static ArrayList<Character> allFighters = new ArrayList<>();
仅包含allFighters
的实例
查看Generics了解更多详细信息。
您还应该熟悉Java Language Coding Conventions。这将使人们更容易阅读您的代码,并使您阅读其他人的代码
答案 1 :(得分:0)
为帮助您的战斗机制,您应该做的第一件事是在启动战斗机时创建正确的类。也许在createFighterActionPerformed中实现这样的事情:
int typer = typesComboBox.getSelectedIndex();
fighter f;
if (typer == 0) {
f = new fighter(n, level, "Regular fighter");
} else if (typer == 1) {
f = new WaterFighter(n, level, "WaterFighter");
} else if (typer == 2) {
f = new FireFighter(n, level, "FireFighter");
}
allFighters.add(f);
要使战斗机比较成为现实,您可以在每个战斗机的isWin类中使用子句的实例来检查特定的对手。喜欢:
if (c instanceof FireFighter) {
// Do special stuff
}
我还建议您重新考虑将接口命名为Character,因为它很容易与java.lang.Character类混淆。