java 游戏中的回合问题
Turns issue in java game
我创建了一个简单的游戏,玩家可以与计算机对战。
我在回合时间上遇到了问题,计算机应该是第一个采取行动的人,而不是真正的玩家应该通过单击 LeftChoice
或 RightChoice
按钮来采取行动。
这是我在代码中遇到的问题:
public class GameForm extends javax.swing.JFrame {
/**
* Creates new form GameForm
*/
final int SIZE = 10;
int CurrentSize = 10;
int PC_SUM=0;
int HUMAN_SUM=0;
boolean PC_TURN = true;
int[] RandArr = new int[SIZE];
public GameForm() {
initComponents();
}
public void init(){
for(int i = 0 ; i<SIZE;i++){
RandArr[i] = (int)(Math.random()*100)+1;
}
jTextField3.setText("");
jTextField4.setText(Integer.toString(PC_SUM));
jTextField5.setText(Integer.toString(HUMAN_SUM));
}
public void HUMAN_updateLeft(){
HUMAN_SUM+=RandArr[0];
jTextField5.setText(Integer.toString(HUMAN_SUM));
jTextField1.setText(Arrays.toString(RandArr));
CurrentSize--;
int [] NewRand = new int[CurrentSize];
for(int i = 1 ; i<=CurrentSize;i++){
NewRand[i-1] = RandArr[i];
}
RandArr = NewRand;
jTextField2.setText(Arrays.toString(RandArr));
PC_TURN = true;
}
public void HUMAN_updateRight(){
HUMAN_SUM+=RandArr[CurrentSize-1];
jTextField5.setText(Integer.toString(HUMAN_SUM));
jTextField1.setText(Arrays.toString(RandArr));
CurrentSize--;
int [] NewRand = new int[CurrentSize];
for(int i = CurrentSize-1 ; i>=0;i--){
NewRand[i] = RandArr[i];
}
RandArr = NewRand;
jTextField2.setText(Arrays.toString(RandArr));
PC_TURN = true;
}
public static boolean WhoIsBigger(int[] arr){
int even=0,odd=0;
for(int i=0;i<arr.length;i+=2){
if(i%2==0){
even+=arr[i];
odd+=arr[i+1];
}
else{
odd+=arr[i];
even+=arr[i+1];
}
}
return even>odd;
}
public void PC_updateLeft(){
PC_SUM+=RandArr[0];
jTextField4.setText(Integer.toString(PC_SUM));
jTextField1.setText(Arrays.toString(RandArr));
CurrentSize--;
int [] NewRand = new int[CurrentSize];
for(int i = 1 ; i<=CurrentSize;i++){
NewRand[i-1] = RandArr[i];
}
RandArr = NewRand;
jTextField2.setText(Arrays.toString(RandArr));
}
public void PC_updateRight(){
PC_SUM+=RandArr[CurrentSize-1];
jTextField4.setText(Integer.toString(PC_SUM));
jTextField1.setText(Arrays.toString(RandArr));
CurrentSize--;
int [] NewRand = new int[CurrentSize];
for(int i = CurrentSize-1 ; i>=0;i--){
NewRand[i] = RandArr[i];
}
RandArr = NewRand;
jTextField2.setText(Arrays.toString(RandArr));
}
public void PC_TURN(){
if(WhoIsBigger(RandArr))
PC_updateLeft();
PC_updateRight();
}
public void FullGame(){
while(RandArr.length>0){
if(PC_TURN){
PC_TURN();
PC_TURN = false;
}
}
}
//start button listener
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
init();
jTextField2.setText(Arrays.toString(RandArr));
jTextField1.setText("-");
jButton1.setEnabled(false);
FullGame();
}
//left button listener
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
HUMAN_updateLeft();
}
//right button listener
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
HUMAN_updateRight();
}
我怎么知道真正的玩家已经做出了他的动作,所以它将 PC_TURN
更改为 True
并且游戏将继续进行?
您应该在左右按钮上附加一个 clickListener
。然后,当用户单击其中一个时,该事件将被触发。您应该在那里将 PC_TURN 更改为 true 并在需要时重新 运行 循环。
示例:
JButton yourButton = new JButton("Your Button");
yourButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
PC_TURN = true;
// extra code
}
});
如果这是 Swing 或其他 GUI,那么您将需要摆脱 while 循环。
请记住,GUI 程序是非线性的并且是事件驱动的,因此与其使用限制性 while 循环(可能会完全耗尽 GUI 的风险),不如根据轮到谁来更改程序的状态 -- 有一个指示轮到谁的变量——然后根据状态改变程序的行为。
如果您需要更具体的帮助,那么您将需要提出一个更完整的问题,包括一个具有足够代码和解释的问题,以便我们更好地理解您的问题(但代码不要太多)。
关于您发布的代码:
- 是的,绝对摆脱那个 while 循环。
- 你的代码很难看懂,主要是你的变量命名不好。不要使用像
jTextField1
这样的变量名,而是使用具有逻辑意义的名称,使您的代码成为 "self-debuggin",例如 humanScoreField
和 computerScoreField
等
- 还学习并遵循标准 Java 命名惯例,包括让所有变量以小写字母开头,类 以大写字母开头,对所有变量使用驼峰命名法,但常量全部大写.
- 详细说明这段代码应该做什么、按钮和 JTextfields 代表什么、您想要什么行为等等...
首先,在命名变量时应遵循 Java 命名约定。就目前而言,PC_TURN
看起来好像是一个常量,尽管它不是一个常量,因为您正在更改它的值。所以更合适的名称是 pcTurn
.
您似乎还有一个名为 PC_TURN()
的方法,我假设它是导致计算机轮到它做某事的方法。因此,如果将其命名为 takePCTurn()
之类的描述性名称会更好。注意整个过程中驼峰式的使用。名称开头的大写字母应保留给 类 和接口,而不是变量或方法。
你的方法名也是如此
public void FullGame()
应该写成
public void fullGame()
遵守这样的编码约定可以让其他人更容易阅读和理解您的代码,并保持一切整洁。养成好习惯。 :)
我不知道你的左右按钮在哪里被声明或者你给它们命名了什么,但是你需要为每个按钮添加一个事件侦听器,这会导致单击它们时发生一些事情。我也不确定 RandArr.length > 0
的目的。你真的不需要这里的循环,因为这是一个带有 GUI 的应用程序,它永远不会关闭,除非你明确告诉它(例如通过单击关闭按钮)。所以我会给你一个通用的解决方案。
您基本上希望玩家轮流触发计算机轮流直到满足某些游戏结束条件。
示例:
//Assuming this is called when the Start button is clicked
public void fullGame() {
takePCTurn();
}
public void takePCTurn() {
//Do PC's turn logic
//You might want to check if the Computer Won the game here
}
class PlayerTurnListener implements ActionListener() {
public void actionPerformed(ActionEvent e) {
//Do Player's turn logic
//You might want to check if the Player Won the game here
takePCTurn();
}
}
//We can create an instance of our listener and add it to both buttons
PlayerTurnListener playerTurnListener = new PlayerTurnListener();
leftButton.addActionListener(playerTurnListener);
rightButton.addActionListener(playerTurnListener);
所以首先发生的事情是 fullGame()
被您的开始按钮调用,然后调用 takePCTurn();
导致计算机轮到它。现在,在玩家单击左键或右键之前什么都不会发生。当他们这样做时,将调用 PlayerTurnListener
的 actionPerformed()
方法,您可以在其中执行一些逻辑,然后将再次调用 takePCTurn();
。
冲洗并重复直到游戏结束。
希望对您有所帮助:)
我创建了一个简单的游戏,玩家可以与计算机对战。
我在回合时间上遇到了问题,计算机应该是第一个采取行动的人,而不是真正的玩家应该通过单击 LeftChoice
或 RightChoice
按钮来采取行动。
这是我在代码中遇到的问题:
public class GameForm extends javax.swing.JFrame {
/**
* Creates new form GameForm
*/
final int SIZE = 10;
int CurrentSize = 10;
int PC_SUM=0;
int HUMAN_SUM=0;
boolean PC_TURN = true;
int[] RandArr = new int[SIZE];
public GameForm() {
initComponents();
}
public void init(){
for(int i = 0 ; i<SIZE;i++){
RandArr[i] = (int)(Math.random()*100)+1;
}
jTextField3.setText("");
jTextField4.setText(Integer.toString(PC_SUM));
jTextField5.setText(Integer.toString(HUMAN_SUM));
}
public void HUMAN_updateLeft(){
HUMAN_SUM+=RandArr[0];
jTextField5.setText(Integer.toString(HUMAN_SUM));
jTextField1.setText(Arrays.toString(RandArr));
CurrentSize--;
int [] NewRand = new int[CurrentSize];
for(int i = 1 ; i<=CurrentSize;i++){
NewRand[i-1] = RandArr[i];
}
RandArr = NewRand;
jTextField2.setText(Arrays.toString(RandArr));
PC_TURN = true;
}
public void HUMAN_updateRight(){
HUMAN_SUM+=RandArr[CurrentSize-1];
jTextField5.setText(Integer.toString(HUMAN_SUM));
jTextField1.setText(Arrays.toString(RandArr));
CurrentSize--;
int [] NewRand = new int[CurrentSize];
for(int i = CurrentSize-1 ; i>=0;i--){
NewRand[i] = RandArr[i];
}
RandArr = NewRand;
jTextField2.setText(Arrays.toString(RandArr));
PC_TURN = true;
}
public static boolean WhoIsBigger(int[] arr){
int even=0,odd=0;
for(int i=0;i<arr.length;i+=2){
if(i%2==0){
even+=arr[i];
odd+=arr[i+1];
}
else{
odd+=arr[i];
even+=arr[i+1];
}
}
return even>odd;
}
public void PC_updateLeft(){
PC_SUM+=RandArr[0];
jTextField4.setText(Integer.toString(PC_SUM));
jTextField1.setText(Arrays.toString(RandArr));
CurrentSize--;
int [] NewRand = new int[CurrentSize];
for(int i = 1 ; i<=CurrentSize;i++){
NewRand[i-1] = RandArr[i];
}
RandArr = NewRand;
jTextField2.setText(Arrays.toString(RandArr));
}
public void PC_updateRight(){
PC_SUM+=RandArr[CurrentSize-1];
jTextField4.setText(Integer.toString(PC_SUM));
jTextField1.setText(Arrays.toString(RandArr));
CurrentSize--;
int [] NewRand = new int[CurrentSize];
for(int i = CurrentSize-1 ; i>=0;i--){
NewRand[i] = RandArr[i];
}
RandArr = NewRand;
jTextField2.setText(Arrays.toString(RandArr));
}
public void PC_TURN(){
if(WhoIsBigger(RandArr))
PC_updateLeft();
PC_updateRight();
}
public void FullGame(){
while(RandArr.length>0){
if(PC_TURN){
PC_TURN();
PC_TURN = false;
}
}
}
//start button listener
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
init();
jTextField2.setText(Arrays.toString(RandArr));
jTextField1.setText("-");
jButton1.setEnabled(false);
FullGame();
}
//left button listener
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
HUMAN_updateLeft();
}
//right button listener
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
HUMAN_updateRight();
}
我怎么知道真正的玩家已经做出了他的动作,所以它将 PC_TURN
更改为 True
并且游戏将继续进行?
您应该在左右按钮上附加一个 clickListener
。然后,当用户单击其中一个时,该事件将被触发。您应该在那里将 PC_TURN 更改为 true 并在需要时重新 运行 循环。
示例:
JButton yourButton = new JButton("Your Button");
yourButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
PC_TURN = true;
// extra code
}
});
如果这是 Swing 或其他 GUI,那么您将需要摆脱 while 循环。
请记住,GUI 程序是非线性的并且是事件驱动的,因此与其使用限制性 while 循环(可能会完全耗尽 GUI 的风险),不如根据轮到谁来更改程序的状态 -- 有一个指示轮到谁的变量——然后根据状态改变程序的行为。
如果您需要更具体的帮助,那么您将需要提出一个更完整的问题,包括一个具有足够代码和解释的问题,以便我们更好地理解您的问题(但代码不要太多)。
关于您发布的代码:
- 是的,绝对摆脱那个 while 循环。
- 你的代码很难看懂,主要是你的变量命名不好。不要使用像
jTextField1
这样的变量名,而是使用具有逻辑意义的名称,使您的代码成为 "self-debuggin",例如humanScoreField
和computerScoreField
等 - 还学习并遵循标准 Java 命名惯例,包括让所有变量以小写字母开头,类 以大写字母开头,对所有变量使用驼峰命名法,但常量全部大写.
- 详细说明这段代码应该做什么、按钮和 JTextfields 代表什么、您想要什么行为等等...
首先,在命名变量时应遵循 Java 命名约定。就目前而言,PC_TURN
看起来好像是一个常量,尽管它不是一个常量,因为您正在更改它的值。所以更合适的名称是 pcTurn
.
您似乎还有一个名为 PC_TURN()
的方法,我假设它是导致计算机轮到它做某事的方法。因此,如果将其命名为 takePCTurn()
之类的描述性名称会更好。注意整个过程中驼峰式的使用。名称开头的大写字母应保留给 类 和接口,而不是变量或方法。
你的方法名也是如此
public void FullGame()
应该写成
public void fullGame()
遵守这样的编码约定可以让其他人更容易阅读和理解您的代码,并保持一切整洁。养成好习惯。 :)
我不知道你的左右按钮在哪里被声明或者你给它们命名了什么,但是你需要为每个按钮添加一个事件侦听器,这会导致单击它们时发生一些事情。我也不确定 RandArr.length > 0
的目的。你真的不需要这里的循环,因为这是一个带有 GUI 的应用程序,它永远不会关闭,除非你明确告诉它(例如通过单击关闭按钮)。所以我会给你一个通用的解决方案。
您基本上希望玩家轮流触发计算机轮流直到满足某些游戏结束条件。
示例:
//Assuming this is called when the Start button is clicked
public void fullGame() {
takePCTurn();
}
public void takePCTurn() {
//Do PC's turn logic
//You might want to check if the Computer Won the game here
}
class PlayerTurnListener implements ActionListener() {
public void actionPerformed(ActionEvent e) {
//Do Player's turn logic
//You might want to check if the Player Won the game here
takePCTurn();
}
}
//We can create an instance of our listener and add it to both buttons
PlayerTurnListener playerTurnListener = new PlayerTurnListener();
leftButton.addActionListener(playerTurnListener);
rightButton.addActionListener(playerTurnListener);
所以首先发生的事情是 fullGame()
被您的开始按钮调用,然后调用 takePCTurn();
导致计算机轮到它。现在,在玩家单击左键或右键之前什么都不会发生。当他们这样做时,将调用 PlayerTurnListener
的 actionPerformed()
方法,您可以在其中执行一些逻辑,然后将再次调用 takePCTurn();
。
冲洗并重复直到游戏结束。
希望对您有所帮助:)