2016-04-20 18 views
3

私が作っている小さなゲームの数学の書き方について、私は困惑しています。このゲームは、Javaについてより多くのことを学ぶ私自身の個人的な旅のためのものであり、主にMonolith、http://monolith.greenpixel.ca/に基づいています。私はゲームのソースコードを見てきましたが、開発者が数学をどのようにしているかを確認することはできません。インクリメンタル数学の問題

これまでの私のコードです。

package DamageDealer; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Take1 { 

    int dmg = 0; 
    int epoints = 1000; 
    int intUnit1 = 0; 

    public static void main(String[] args) { 
     new Take1(); 
    } 

    public Take1() { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } 
       catch (UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); } 
       catch (IllegalAccessException ex) { 
        ex.printStackTrace(); } 
       catch (InstantiationException ex) { 
        ex.printStackTrace(); } 
       catch (ClassNotFoundException ex) { 
        ex.printStackTrace(); } 

       JFrame frame = new JFrame("Button Clicker"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.getContentPane().add(new addComponentsToPane()); 



       frame.setSize(300, 500); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
       frame.setResizable(false); 
      } 
     }); 
    } 

    protected class addComponentsToPane extends JPanel { 


     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 

     public addComponentsToPane() { 
      JPanel appPanel = new JPanel(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints();    

      gbc.fill = GridBagConstraints.HORIZONTAL; 
      gbc.anchor = GridBagConstraints.CENTER; 
      gbc.insets = new Insets(5, 5, 5, 5); 

      JLabel EvoPoints = new JLabel(); 
      EvoPoints.setText("Points: " + String.valueOf(epoints)); 
      gbc.gridx = 1; 
      gbc.gridy = 0; 
      appPanel.add(EvoPoints, gbc); 

      JButton jbtUnit1 = new JButton("Unit 1"); 
      gbc.gridx = 0; 
      gbc.gridy = 1; 
      appPanel.add(jbtUnit1, gbc); 

      JLabel lblUnit1 = new JLabel(); 
      lblUnit1.setText(String.valueOf(intUnit1)); 
      gbc.gridx = 1; 
      gbc.gridy = 1; 
      appPanel.add(lblUnit1, gbc); 

      JButton jbtDamage = new JButton("Damage");      
      gbc.gridx = 0; 
      gbc.gridy = 10; 
      appPanel.add(jbtDamage, gbc); 

      JLabel DamageOutput = new JLabel(); 
      DamageOutput.setText(String.valueOf(dmg)); 
      gbc.gridx = 1; 
      gbc.gridy = 10; 
      appPanel.add(DamageOutput, gbc); 

      add(appPanel, gbc); 

      jbtDamage.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        dmg++; 
        DamageOutput.setText(String.valueOf(dmg)); 
        if ((dmg % 10) == 0) { 
         epoints++; 
         EvoPoints.setText("Points: " + String.valueOf(epoints)); 
        } 

       } 
      }); 

      jbtUnit1.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        if (epoints >= 10) { 
         intUnit1++; 
         epoints = epoints - 10; 
         lblUnit1.setText(String.valueOf(intUnit1)); 
         EvoPoints.setText("Points: " + String.valueOf(epoints)); 
        } 
       } 
      }); 
     }   
    } 
} 

は今のところ、私は2つのボタンのみ、jbtUnit1jbtDamageを持っています。そしてそれぞれのアクションリスナーは下部にあります。

私が現在行っている計算は、dmgの値が10で割り切れる場合にのみ有効です。その時点で(dmgが10で割り切れる場合)、epointsの値がインクリメントされます。しかし、私のjbtUnit1は、私のdmg出力を各ユニットの追加ポイントとして増やす予定です。したがって、正確な%10に達する前に複数回値を超えてしまうため、(dmg % 10) == 0は機能しません。

質問:私は数学をどのようにすべきですか?それとももっと良いのですか?このタイプの計算を行うためのより良い(または推奨の)方法は何ですか?

ありがとうございました!これで

dmg++; 
DamageOutput.setText(String.valueOf(dmg)); 
if ((dmg % 10) == 0) { 
    epoints++; 
    EvoPoints.setText("Points: " + String.valueOf(epoints)); 
} 

: マイキー

+0

ああ、レイアウトを無視してください。私はそれが正しいとは思わない。しかし、私はまだレイアウトを扱う方法を自分自身で教えています。 –

+0

したがって、数学はdmg%10 == 0のときにのみ機能します。私はこれまであなたと付き合っています。しかし、何をしたいですか?丸め(dmg/10)? – nhouser9

+0

私は10ポイントのダメージごとに自分の 'epoints'を1ずつ増やしたいと思っています。しかし私の 'jbtUnit1'はダメージ出力を1単位増やします。したがって、ある時点で、3ダメージ出力と言うと、3,6,9,12,15,18,21,24,27,30が得られます。どちらのポイントで1ポイントしか受け取らないのでしょうか? 3. 10,20,30で1つ。 –

答えて

1

はこれを交換してみてください

dmg+= 1+intUnit1; //Deal more damage with more units 
DamageOutput.setText(String.valueOf(dmg)); 
int newEPoints = dmg/10 - spentEPoints; 
if(epoints != newEPoints) { 
    EvoPoints.setText("Points: " + String.valueOf(newEPoints)); 
} 
epoints = newEPoints; 

その後、支出額を追跡するためにあなたのメインクラスでspentEPointsフィールドを追加し、代わりにあなたのepointsからsubstractingのカウンタを購入するたびに、使用済みの金額をspentEPointsカウンターに加算します。

ただし、これらのゲームでは数値が非常に急速に増加する傾向があり、整数型の変数が最終的にオーバーフローすることに注意してください。 がほぼの無限大になるように、BigIntegerクラスを見てください。

+0

したがって、このメソッドはローカル変数現在のポイントと照合してポイントを追加しないようにするために使用されます。 –

+0

申し訳ありませんが、私はゲームのメカニックの重要な部分を忘れました、私は瞬時にコードを修正します。 – Gonzalo

+0

これは非常に近いですが、それほどではありません。私のエポイントを適切に増やしています。ただし、ユニットを購入した後、再度「jbtDamage」ボタンをクリックした後、エポイントを返します。ユニット1を購入するたびに、10個のエポイントがかかります。だから、それぞれの購入で、epoints!= newEPoints。再びエポイントを調整します。 –