java - 计时器的运行速度比代码中的值快吗?

标签 java cookies project

我为学校项目创建了自己版本的 cookie clicker,除了计时器之外,一切似乎都正常。我对计时器的概念很陌生,不确定我的公式是否正确。任何反馈都是有帮助的。我的计时器的公式是 双倍速度 = 1/每秒 * 1000; 计时器速度 = (int)Math.round(速度); 目的是每 0.1 秒添加一个 cookie 作为基线,并在您每秒升级 cookie 时 perSec();它增加了。当我的一些 friend 玩这个游戏时,他们意识到他们每秒获得更多的 cookies 。我想知道这是否是我的计时器的问题,或者我在 switch 语句中使用 addActionCommands 做了什么错误

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.Timer;

public class CookieMain
{
    //Region Fields
    JLabel counterLabel, perSecLabel;
    JButton button1, button2, button3, button4, button5, button6;
    int cookieCounter, timerSpeed, cursorNumber, cursorPrice, grandpaNumber, grandpaPrice, factoryNumber, factoryPrice, artificialNumber, artificialPrice, gordonNumber, gordonPrice, prestigePrice, prestigeNumber;
    double perSecond;
    boolean timerOn, grandpaUnlocked, factoryUnlocked, artificialUnlocked, gordonUnlocked, prestigeUnlocked;
    Font font1, font2;
    CookieHandler cHandler = new CookieHandler();
    Timer timer;
    JTextArea descriptionText;
    MouseHandler mHandler = new MouseHandler();

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

   //Creating default values
   public CookieMain()
   {
       timerOn = false;
       perSecond = 0.0;
       cookieCounter = 0;
       cursorNumber = 0;
       cursorPrice = 10;
       grandpaNumber = 0;
       grandpaPrice = 100;
       factoryNumber = 0;
       factoryPrice = 1000;
       artificialNumber = 0;
       artificialPrice = 15000;
       gordonNumber = 0;
       gordonPrice = 100000;
       prestigeNumber = 0;
       prestigePrice = 10000000;

       createFont();
       createUI();
   }

   public void createFont() 
   {
       font1 = new Font("Comic Sans MS", Font.PLAIN, 32);
       font2 = new Font("Comic Sans MS", Font.PLAIN, 15);
   }

   public void createUI()
   {
       //Creates the frame for the game
      JFrame frame = new JFrame();
      frame.setSize(800, 600);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().setBackground(Color.black);
      frame.setLayout(null);

      //Creates a new panel for the cookie ImageIcon
      JPanel cookiePanel = new JPanel();
      cookiePanel.setBounds(100, 220, 200, 200);
      cookiePanel.setBackground(Color.black);
      frame.add(cookiePanel);

      //Instantiates an ImageIcon with the name "cookie" with the image cookie.png
      ImageIcon cookie = new ImageIcon(getClass().getClassLoader().getResource("cookie.png"));

      //ImageIcon prestige = new ImageIcon(getClass().getClassLoader().getResource(""))

      //Adds button and sets ImageIcon "cookie" onto the button
      JButton cookieButton = new JButton();
      cookieButton.setBackground(Color.black);
      cookieButton.setFocusPainted(false);
      cookieButton.setBorder(null);
      cookieButton.setIcon(cookie);
      cookieButton.addActionListener(cHandler);
      cookieButton.setActionCommand("cookie");
      cookiePanel.add(cookieButton);

      //Creates a new panel for labels
      JPanel counterPanel = new JPanel();
      counterPanel.setBounds(100, 100, 200, 100);
      counterPanel.setBackground(Color.black);
      counterPanel.setLayout(new GridLayout(2,1));
      frame.add(counterPanel);

      //Creates a label for the cookie counter
      counterLabel = new JLabel(cookieCounter + " cookies");
      counterLabel.setForeground(Color.white);
      counterLabel.setFont(font1);
      counterPanel.add(counterLabel);

      //Craetes a label for the cookies per second counter
      perSecLabel = new JLabel();
      perSecLabel.setForeground(Color.white);
      perSecLabel.setFont(font2);
      counterPanel.add(perSecLabel);

      //Creates a panel for the 4 items on the right
      JPanel itemPanel = new JPanel();
      itemPanel.setBounds(500, 170, 250, 250);
      itemPanel.setBackground(Color.black);
      itemPanel.setLayout(new GridLayout(6,1));
      frame.add(itemPanel);

      //Creates first item "Cursor"
      button1 = new JButton("Cursor");
      button1.setFont(font1);
      button1.setFocusPainted(false);
      button1.addActionListener(cHandler);
      button1.setActionCommand("Cursor");
      button1.addMouseListener(mHandler);
      itemPanel.add(button1);

      //Creates second item "Grandpa"
      button2 = new JButton("?");
      button2.setFont(font1);
      button2.setFocusPainted(false);
      button2.addActionListener(cHandler);
      button2.setActionCommand("Grandpa");
      button2.addMouseListener(mHandler);
      itemPanel.add(button2);

      //Creates third item "Factory"
      button3 = new JButton("?");
      button3.setFont(font1);
      button3.setFocusPainted(false);
      button3.addActionListener(cHandler);
      button3.setActionCommand("Factory");
      button3.addMouseListener(mHandler);
      itemPanel.add(button3);

      //Creates fourth item "Artificial Cookie Plant"
      button4 = new JButton("?");
      button4.setFont(font1);
      button4.setFocusPainted(false);
      button4.addActionListener(cHandler);
      button4.setActionCommand("ArtificialCookies");
      button4.addMouseListener(mHandler);
      itemPanel.add(button4);

      //Creates secret fith item "GORDON RAMSEY"
      button5 = new JButton("?");
      button5.setFont(font1);
      button5.setFocusPainted(false);
      button5.addActionListener(cHandler);
      button5.setActionCommand("Gordon");
      button5.addMouseListener(mHandler);
      itemPanel.add(button5);

      //Creates 10,000,000 cookie prestige upgrade
      button6 = new JButton("?");
      button6.setFont(font1);
      button6.setFocusPainted(false);
      button6.setBackground(Color.yellow);
      button6.addActionListener(cHandler);
      button6.setActionCommand("Prestige");
      button6.addMouseListener(mHandler);
      itemPanel.add(button6);


      JPanel descriptionPanel = new JPanel();
      descriptionPanel.setBounds(500, 70, 250, 150);
      descriptionPanel.setBackground(Color.black);
      frame.add(descriptionPanel);

      descriptionText = new JTextArea();
      descriptionText.setBounds(500, 70, 250, 150);
      descriptionText.setForeground(Color.white);
      descriptionText.setBackground(Color.black);
      descriptionText.setFont(font2);
      descriptionText.setLineWrap(true);
      descriptionText.setWrapStyleWord(true);
      descriptionText.setEditable(false);
      descriptionPanel.add(descriptionText);

      //Sets frame to be visible
      frame.setVisible(true);
   }

   //setTimer method that adds 1 cookies every 1000 milliseconds (1 second)
   public void setTimer()
   {
       timer = new Timer(timerSpeed, new ActionListener()
       {

               @Override
               public void actionPerformed(ActionEvent e) 
               {
                   cookieCounter++;
                   counterLabel.setText(cookieCounter + " cookies");

                if(grandpaUnlocked == false)
                   {
                       if(cookieCounter >= 100)
                       {
                           grandpaUnlocked = true;
                           button2.setText("Grandpa " + "(" + grandpaNumber + ")");
                       }
                   }
                if(factoryUnlocked == false)
                {
                    if(cookieCounter >= 1000)
                    {
                        factoryUnlocked = true;
                        button3.setText("Factory " + "(" + factoryNumber + ")");
                    }
                }
                if(artificialUnlocked == false)
                {
                    if(cookieCounter >= 15000)
                    {
                        artificialUnlocked = true;
                        button4.setText("Artificial " + "(" + artificialNumber + ")");
                    }
                }
                if(gordonUnlocked == false)
                {
                    if(cookieCounter >= 100000)
                    {
                        gordonUnlocked = true;
                        button5.setText("Gordons " + "(" + gordonNumber + ")");
                    }
                }
                if(prestigeUnlocked == false)
                {
                    if(cookieCounter >= 10000000)
                    {
                        prestigeUnlocked = true;
                        button6.setText("Pretige " + "(" + prestigeNumber + ")");
                    }
                }
               }
       });
   }

   public void timerUpdate()
   {
       if(timerOn == false)
       {
           timerOn = true;
       }

       //Divides perSecond by 1 to get seconds than multiply by 1000 to get milliseconds
       double speed = 1/perSecond * 1000;
       timerSpeed = (int)Math.round(speed);

       String s = String.format("%.1f", perSecond);
       perSecLabel.setText("per second " + s);

       setTimer();
       timer.start();
   }

   //Action listener containing a switch statement with all of the items
   public class CookieHandler implements ActionListener
   {
       public void actionPerformed(ActionEvent event)
       {
           String action = event.getActionCommand();

           //Switch statement with all of the items and their function
           switch(action) 
           {
           case "cookie": 
               cookieCounter++;
               counterLabel.setText(cookieCounter + " cookies");
               break;
           case "Cursor":
               if(cookieCounter >= cursorPrice)
               {
                   cookieCounter = cookieCounter - cursorPrice;
                   cursorPrice = cursorPrice + 5;
                   counterLabel.setText(cookieCounter + " cookies");

                   cursorNumber++;
                   button1.setText("Cursor " + "(" + cursorNumber + ")");
                   descriptionText.setText("Cursor\n[price " + cursorPrice + "]\nAutoClicks once every 10 seconds.");
                   perSecond = perSecond + 0.1;
                   timerUpdate();
               }
               else
               {
                   descriptionText.setText("You need more cookies.");
               }
               break;
           case "Grandpa":
               if(cookieCounter >= grandpaPrice)
               {
                   cookieCounter = cookieCounter - grandpaPrice;
                   grandpaPrice = grandpaPrice + 50;
                   counterLabel.setText(cookieCounter + " cookies");

                   grandpaNumber++;
                   button2.setText("Grandpa " + "(" + grandpaNumber + ")");
                   descriptionText.setText("Grandpa\n[price " + grandpaPrice + "]\nEach grandpa produces 1 cookie per second.");
                   perSecond = perSecond + 1;
                   timerUpdate();
               }
               else
               {
                   descriptionText.setText("You need more cookies.");
               }
               break;
           case "Factory":
               if(cookieCounter >= factoryPrice)
               {
                   cookieCounter = cookieCounter - factoryPrice;
                   factoryPrice = factoryPrice + 500;
                   counterLabel.setText(cookieCounter + " cookies");

                   factoryNumber++;
                   button3.setText("Factory " + "(" + factoryNumber + ")");
                   descriptionText.setText("Factory\n[price " + factoryPrice + "]\nEach factory produces 10 cookies per second.");
                   perSecond = perSecond + 10;
                   timerUpdate();
               }
               else
               {
                   descriptionText.setText("You need more cookies.");
               }
               break;
           case "ArtificialCookies":
               if(cookieCounter >= artificialPrice)
               {
                   cookieCounter = cookieCounter - artificialPrice;
                   artificialPrice = artificialPrice + 5000;
                   counterLabel.setText(cookieCounter + " cookies");

                   artificialNumber++;
                   button4.setText("Artificial " + "(" + artificialNumber + ")");
                   descriptionText.setText("Artificial\n[price " + artificialPrice + "]\nEach Artificial Cookie Plant produces 100 cookies per second.");
                   perSecond = perSecond + 100;
                   timerUpdate();
               }
               else
               {
                   descriptionText.setText("You need more cookies.");
               }
               break;
           case "Gordon": 
               if(cookieCounter >= gordonPrice)
               {
                   cookieCounter = cookieCounter - gordonPrice;
                   gordonPrice = gordonPrice + 50000;
                   counterLabel.setText(cookieCounter + " cookies");

                   gordonNumber++;
                   button5.setText("Gordons " + "(" + gordonNumber + ")");
                   descriptionText.setText("Gordon Ramsey\n[price " + gordonPrice + "]\nEach GORDON RAMSEY produces 10000 cookies per second.");
                   perSecond = perSecond + 1000;
                   timerUpdate();
               }
               else
               {
                   descriptionText.setText("You need more cookies.");
               }
               break;
           case "Prestige": 
               if(cookieCounter >= gordonPrice)
               {
                   cookieCounter = cookieCounter - prestigePrice;
                   prestigePrice = prestigePrice * 2;
                   counterLabel.setText(cookieCounter + " cookies");

                   prestigeNumber++;
                   button6.setText("Prestige " + "(" + prestigeNumber + ")");
                   descriptionText.setText("Prestige\n[price " + prestigePrice + "]\nThis is unlocked when you reach 10,000,000 cookies. It resets your cookie count to 0.");
                   cookieCounter = 0;
                   perSecond = 0.1;
                   timerSpeed = 1;
                   cursorNumber = 0;
                   gordonNumber = 0;
                   factoryNumber = 0;
                   grandpaNumber = 0;
                   artificialNumber = 0;
                   button1.setText("Cursor ");
                   button2.setText("Grandpa ");
                   button3.setText("Factory ");
                   button4.setText("Artificial ");
                   button5.setText("Gordons "); 
                   cursorPrice = 10;
                   gordonPrice = 100000;
                   factoryPrice = 1000;
                   grandpaPrice = 100;
                   artificialPrice = 15000;
                   timerUpdate();
               }
               else
               {
                   descriptionText.setText("You need more cookies.");
               }
           }
       }
   }

   public class MouseHandler implements MouseListener
   {
       @Override
       public void mouseClicked(MouseEvent e)
       {

       }

       @Override
       public void mousePressed(MouseEvent e)
       {

       }

       @Override
       public void mouseReleased(MouseEvent e)
       {

       }

       @Override
       public void mouseEntered(MouseEvent e)
       {
           JButton button = (JButton)e.getSource();

           if(button == button1)
           {
               descriptionText.setText("Cursor\n[price " + cursorPrice + "]\nAutoClicks once every 10 seconds.");
           }
           else if(button == button2)
           {
               if(grandpaUnlocked==false)
               {
               descriptionText.setText("This item is currently locked.");
               }
               else
               {
                   descriptionText.setText("Grandpa\n[price " + grandpaPrice + "]\nEach grandpa produces 1 cookie per second.");
               }
           }
           else if(button == button3)
           {
               if(factoryUnlocked == false)
               {
               descriptionText.setText("This item is currently locked.");
               }
               else
               {
                   descriptionText.setText("Factory\n[price " + factoryPrice + "]\nEach factory produces 10 cookies per second.");

               }
           }
           else if(button == button4)
           {
               if(artificialUnlocked == false)
               {
                   descriptionText.setText("This item is currently locked.");

               }
               else
               {
                   descriptionText.setText("Artificial Cookie\n[price " + artificialPrice + "]\nEach Artificial Cookie Plant produces 100 cookies per second.");
               }
           }
           else if(button == button5)
           {
               if(gordonUnlocked == false)
               {
                   descriptionText.setText("This item is currently locked.");
               }

               else
               {
                   descriptionText.setText("Gordon\n[price " + gordonPrice + "]\nEach GORDON RAMSEY produces 10000 cookies per second.");
               }
           }
           else if(button == button6)
           {
               if(prestigeUnlocked == false)
               {
                   descriptionText.setText("This item is currently locked.");
               }

               else
               {
                   descriptionText.setText("Prestige\n[price " + prestigePrice + "]\nThis is unlocked when you reach 10,000,000 cookies. It resets your cookie count to 0.");
               }
           }
       }

       @Override
       public void mouseExited(MouseEvent e)
       {
           JButton button = (JButton)e.getSource();

           if(button == button1)
           {
               descriptionText.setText(null);
           }

           else if(button == button2)
           {
               descriptionText.setText(null);
           }

           else if(button == button3)
           {
               descriptionText.setText(null);
           }

           else if(button == button4)
           {
               descriptionText.setText(null);
           }
           else if(button == button5)
           {
               descriptionText.setText(null);
           }
       }
   }

}``` 



最佳答案

每次调用 setTimer() 时,都会创建一个新计时器。因此,如果您调用 setTimer() 三次,则会创建三个新计时器,并且每个计时器都会继续创建 cookie。

关于java - 计时器的运行速度比代码中的值快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60327392/

相关文章:

html - 为了绕过网站的登录屏幕,您可以加载带有用户名和密码的链接吗?

xcode - 如何在 Xcode 项目中包含 txt 文件?

java - 如何访问 Netbeans 中的调用计数?

java - Spring 启动: Inject beans from tests into web environment

java - 如何检查一个列表是否与另一个列表具有相同的元素,能够有重复

c# - 如何在我的 ASP.NET 应用程序中长时间使用 Session

ios - 添加 Xcode 子项目 : Shouldn't all the source files get copied?

java - 使用Java 7 nio读写文件

java - 如何提高从 AWS Lambda (Java) 初始调用 AWS 服务的性能?

javascript - 插入 cookie 以输入值