Go方法在骰子游戏中创建堆空间问题

时间:2018-02-03 21:05:58

标签: java

我正在处理代码,其中用户掷出5个自定义骰子,并且每次他们滚动5或10该数字被添加到他们的总分,直到他们达到总分500然后游戏结束。我有构建go方法所需的所有方法,但是如果没有这种方法,我就无法解决这个问题,导致我的堆空间不足。

我现在的go方法给了我一个玩家得到的一系列卷,但只是说更新的分数是0,无论他们实际滚动什么。我然后清除,以便我可以重新滚动,但这需要一个循环,当我这样做时,我得到堆空间问题。我无法弄清楚如何在没有这种类型的堆空间问题的情况下创建合适的游戏。任何有关搞清楚的帮助都将不胜感激!

可能是这样的:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="wrapper">
  <ul>
    <li class="color">Color 1</li>
    <li class="color">Color 2</li>
    <li class="color">Color 3</li>
    <li class="color">Color 4</li>
  </ul>
  <p id="numberofitems"></p>
  <!-- Output 4 COLORS here -->
</div>
<div class="wrapper">
  <ul>
    <li class="color">Color 1</li>
    <li class="color">Color 2</li>
    <li class="color">Color 3</li>
    <li class="color">Color 4</li>
    <li class="color">Color 5</li>
  </ul>
  <p id="numberofitems"></p>
  <!-- Output 5 COLORS here -->
</div>

但这会产生堆空间问题

注意: go方法在游戏类

骰子类:

while (checkIfWinner() != true){
     System.out.println(dice.rollDice());
     dice.addFivesOrTens();
     System.out.println("After that roll your updated score is " + player.getTotalScore());
     dice.rollDice().clear();  
}

玩家类:

import java.util.Random;
import java.util.*;

public class inc1_dice{
   private int die1;
   private int die2;
   private int die3;
   private int die4;
   private int die5;
   Random r = new Random();
   List<Integer> dietype1 = Arrays.asList(2, 3, 4, 5, 6, 10);
   List<Integer> dietype2 = Arrays.asList(1, 2, 4, 5, 6, 10);
   ArrayList<Integer> diesrolled = new ArrayList<Integer>();

   public ArrayList<Integer> rollDice(){
      die1 = (dietype1.get(r.nextInt(dietype1.size())));
      die2 = (dietype1.get(r.nextInt(dietype1.size())));
      die3 = (dietype1.get(r.nextInt(dietype1.size())));
      die4 = (dietype1.get(r.nextInt(dietype1.size())));
      die5 = (dietype2.get(r.nextInt(dietype2.size())));
      diesrolled.add(die1);
      diesrolled.add(die2);
      diesrolled.add(die3);
      diesrolled.add(die4);
      diesrolled.add(die5);
      return diesrolled;
   }
 }

游戏课程:

public class inc1_player{
   private int totalScore;

   public int getTotalScore(){
      return totalScore;
   }

   public void setTotalScore(int score){
      totalScore += score;
   }
}

主要课程:

import java.io.*;
import java.util.*;
import java.util.Scanner;

public class inc1{
   private inc1_player player;
   private inc1_dice dice;

   public inc1(inc1_dice dice, inc1_player player){
      this.dice = dice;
      this.player = player;
   }

   public void go(){
         System.out.println(dice.rollDice());
         System.out.println("After that roll your updated score is " + player.getTotalScore());
         dice.rollDice().clear();            
   }

   public void addFivesOrTens(){
      int score = 0;

      for (int i = 0; i < dice.rollDice().size(); i++) {         
         if (dice.rollDice().get(i) == 5)
            score = score + 5;
            player.setTotalScore(score);              
         if (dice.rollDice().get(i) == 10)
            score = score + 10;
            player.setTotalScore(score);
      }                    
   }

   public boolean checkIfWinner(){
      if (player.getTotalScore() >= 500)
         return true;
      else
         return false;
   }  
}

1 个答案:

答案 0 :(得分:2)

问题在于这部分代码:

  for (int i = 0; i < dice.rollDice().size(); i++) {         
     if (dice.rollDice().get(i) == 5)
        score = score + 5;
        player.setTotalScore(score);              
     if (dice.rollDice().get(i) == 10)
        score = score + 10;
        player.setTotalScore(score);
  }  

您应该只调用dice.rollDice()一次并将其结果存储在变量中。您写的方式ArrayList<Integer> diesrolled不断增长,for循环永远不会结束,因为您在dice.rollDice()循环的每次迭代中调用for并且条件i = dice.rollDice().size()永远不会满足因为size()增长速度超过i - 直到你最终得到OutOfMemoryException

解决方案:

  • ArrayList<Integer> diesrolled = new ArrayList<Integer>();移至rollDice()方法

  • addFivesOrTens()方法重写为:

    public void addFivesOrTens() {
      ArrayList<Integer> a = dice.rollDice();
      for (int i = 0; i < a.size(); i++) {         
         if (a.get(i) == 5)
            player.setTotalScore(5);              
         else if (a.get(i) == 10)
            player.setTotalScore(10);
      }                    
    }
    
  • go()方法重写为:

    while (!checkIfWinner()) {
        dice.addFivesOrTens();
    }