GUI.java
package ccc;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class GUI implements ActionListener {
JFrame f;
JPanel bg, s, a;
JLabel ca, £, cav, co, cov, co2, pr, error;
JTextField tf;
JButton b1, b2;
public GUI(){
f = new JFrame();
bg = new JPanel();
bg.setSize(650, 500);
bg.setBackground(Color.darkGray);
bg.setLayout(null);
bg.setLocation(0, 0);
s = new JPanel();
s.setSize(180, 445);
s.setBackground(Color.white);
s.setLayout(null);
s.setLocation(10, 10);
a = new JPanel();
a.setSize(430, 445);
a.setBackground(Color.white);
a.setLayout(null);
a.setLocation(202, 10);
ca = new JLabel("CASH:");
ca.setSize(70,25);
ca.setLocation(10, 25);
£ = new JLabel("£");
£.setSize(10, 25);
£.setLocation(80, 25);
cav = new JLabel("128.23");
cav.setSize(80, 25);
cav.setLocation(90, 25);
co = new JLabel("COCAINE:");
co.setSize(70, 25);
co.setLocation(10, 50);
cov = new JLabel("6 units");
cov.setSize(70, 25);
cov.setLocation(80, 50);
co2 = new JLabel("COCAINE");
co2.setSize(70, 25);
co2.setLocation(10, 25);
pr = new JLabel("£39.95");
pr.setSize(60, 25);
pr.setLocation(90, 25);
tf = new JTextField();
tf.setSize(70, 25);
tf.setLocation(160, 25);
b1 = new JButton("BUY");
b1.setSize(70, 25);
b1.setLocation(270, 25);
b1.addActionListener(this);
b2 = new JButton("SELL");
b2.setSize(70, 25);
b2.setLocation(350, 25);
b2.addActionListener(this);
error = new JLabel();
error.setSize(200, 25);
error.setLocation(50, 50);
s.add(ca);
s.add(£);
s.add(cav);
s.add(co);
s.add(cov);
a.add(co2);
a.add(pr);
a.add(tf);
a.add(b1);
a.add(b2);
a.add(error);
bg.add(s);
bg.add(a);
f.add(bg);
f.setSize(650, 500);
f.setLayout(null);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
public static void main(String[] args) {
new GUI();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == b1){
Buy a = new Buy();
a.Buy();
}
if (e.getSource() == b2){
}
}
}
Buy.java
package ccc;
public class Buy extends GUI {
String pri, qua, cas, uni, aaa;
double price, quantity, cash, units, total, deduction;
public Buy(){
pri = pr.getText();
price = Double.parseDouble(pri);
qua = tf.getText();
quantity = Double.parseDouble(qua);
cas = cav.getText();
cash = Double.parseDouble(cas);
uni = cov.getText();
units = Double.parseDouble(uni);
total = price * quantity;
if (cash >= total){
deduction = cash - total;
aaa = String.valueOf(deduction);
cav.setText(aaa);
}
else if (cash < total){
error.setText("Sorry, you don't currently have the funds");
}
}
}
嗨大家好,
我目前正在学习java,并希望给自己一个充满挑战和乐趣的项目。当我还是一个名叫dopewars的孩子时,我决定建立一个我记得玩的游戏。
这是我在这场比赛中的第二次尝试。当我开始第一次尝试时,一切顺利。过了一会儿,我的源代码开始疯狂地失控,直到我不再继续,因为我不断迷失在代码之中。
然后我决定重新开始,只是这次我想从逻辑(2个不同的.java文件)中分离gui。这就是我的问题所在。以前这可行。自从分离我的java文件以来,功能已经停止。
当我按下jbutton b1时,我的程序应该取可卡因的价格值和用户输入到jtextfield的单位值,通过访问Buy.java中的方法执行计算,然后更新相应的JLabel在GUI.java的s jpanel中。
例如,用户x想要以指定的价格购买可卡因,因此他输入一个代表他想要的数量的值。然后他按下购买按钮,最终通过使用Buy类中的方法从程序窗口左侧显示的钱包中扣除钱。
我希望你能理解我的解释,我希望很快能收到你的回复。提前致谢。我的源代码如下。
答案 0 :(得分:0)
以下没有形状或形式的答案鼓励真正的涂鸦战争;)
MVC是你的朋友。我这样做的方式通常是首先编写代码的数据和数据操作部分,而不考虑它在屏幕上的显示方式。
首先尝试将代码的“数据”部分分开。把它整齐地放在别处;例如,表示真实世界对象的简单pojo对象。
然后将您可以对这些对象执行的操作写入不同的类。正如我之前所说,使这些完全独立于UI。这可以确保代码的功能部分很好并且是独立的,并且基本上是可测试的。
然后编写您的UI部分。单击按钮可以在代码的操作部分中路由到方法调用,例如。
希望有所帮助。
答案 1 :(得分:0)
你的问题就在这里开始:
public class Buy extends GUI {
尝试重写游戏逻辑,以便它不会对GUI
有任何了解。假设您想通过命令行使您的游戏可玩。您的游戏逻辑应该以不必更改的方式编写,以使其成为可能。
尝试识别用户通过其与游戏模型交互的界面。然后实现此接口。
以下是一些想法(我不知道DopeWars,所以我会给你一些概括性的例子)
public class MyGameEngine {
public PlayerData getPlayerData() { ... }
public void sellSomeStuff(int numberOfStuff) throws InvalidPlayerOperation {
if (numberOfStuff > getPlayerData().getAmountOfStuff() {
throw new InvalidPlayerOperation("Not enough stuff");
}
....
}
}
public class PlayerData {
public int getAmountOfStuff() { ... }
}
public class InvalidPlayerOperation extends RuntimeException { ... }
这个领域有很多模式。但是如果你真的想要学习一些东西,那就试试吧,不要先查看模式。当你使用它时,将有足够的时间来学习模式,然后检查你的代码,如果你直观地使用它们,或者你可以介绍它们来提高它的质量。
特别是MVC模式可能对你的简单游戏来说太过分了,特别是如果你不想使用MVC框架(你没有)。 另一方面,Singleton模式起初看起来很简单,但通常是不好的风格,只会在以后引起问题。