这是我第一次来这里,我会尝试让这篇文章变得正确。我正在为我的Java类处理继承问题。我有3个文件,DemoSugarSmash.java,SugarSmashPlayer.java和PremiumSugarSmashPlayer.java。
该程序适用于SugarSmashPlayer部分,但是当尝试在PremiumSugarSmashPlayer.java文件中创建数组时,它的长度不应超过10,而它的长度应为50。
以下是练习的说明: 一个名为Sugar Smash的免费在线游戏的开发者已经要求你开发一个名为SugarSmashPlayer的类,它保存有关单个玩家的数据。
该类包含以下字段:
玩家的整数ID号 字符串屏幕名称 一组整数,存储在10个游戏关卡中的每一个中获得的最高分数。 包括每个字段的get和set方法。分数的获取和设置方法应该每个都需要两个参数 - 一个表示已达到的分数,另一个表示要检索或分配的游戏级别。如果用户尝试从超出分数范围的级别分配或检索分数,则显示错误消息。
此外,除非用户在之前的每个级别获得至少100分,否则不应设置除第一级之外的级别。如果用户尝试为尚不可用的级别设置分数,请发出错误消息。
编写来自SugarSmashPlayer的类PremiumSugarSmashPlayer。当用户支付2.99美元以获得40个额外级别的游戏时,该类被实例化。与游戏的免费版本一样,除非用户在之前的所有级别中获得至少100分,否则用户无法为级别设置分数。
我还没有编写付费访问部分的行。
// extend SugarSmashPlayer as PremiumSugarSmashPlayer here
public class PremiumSugarSmashPlayer extends SugarSmashPlayer
{
// declare private variables here
private int levels = 50;
private int[] scores = new int[levels];
public PremiumSugarSmashPlayer()
{
// add constructor code here
}
// override (public!) getLevels() method here
@Override
public int getLevels()
{
return levels;
}
}
public class SugarSmashPlayer
{
// add private varaibles here
protected int IDNumber;
protected String screenName;
private int levels = 10;
private int[] scores = new int[levels];
public SugarSmashPlayer()
{
// add constructor code here
}
public void setIdNumber(int num)
{
// add method code here
IDNumber = num;
}
public void setName(String player)
{
// add method code here
screenName = player;
}
public void setScore(int score, int level)
{
// add method code here
boolean goodScores = false;
if (level == 0)
// Set score to index 0
scores[level] = score;
else
{
// Check if previous level score is greater than 100
if (scores[level - 1] > 100)
goodScores = true;
// Set score to game level
if (goodScores && level < scores.length)
scores[level] = score;
else
{
System.out.println("\nInvalid score");
}
}
}
public int getIdNumber()
{
// add method code here
return IDNumber;
}
public String getName()
{
// add method code here
return screenName;
}
public int getScore(int level)
{
// add method code here
if (level >= scores.length)
{
System.out.println("Invalid game level");
return -1;
}
else
return scores[level];
}
public int getMinScore()
{
// add method code here
return 100;
}
public int getLevels()
{
// add method code here
return levels;
}
}
import java.util.*;
public class DemoSugarSmash
{
public static void main(String[] args)
{
SugarSmashPlayer ssPlayer = new SugarSmashPlayer();
ssPlayer.setIdNumber(1111);
ssPlayer.setName("Alex");
System.out.println("\nAt start");
display(ssPlayer);
ssPlayer.setScore(200, 0);
System.out.println("\nAfter setting first score");
display(ssPlayer);
System.out.println("Trying to set fifth score too soon");
ssPlayer.setScore(30, 4);
System.out.println("\nAfter setting second score");
ssPlayer.setScore(30, 1);
display(ssPlayer);
System.out.println("\nTrying to set third score when second is too low");
ssPlayer.setScore(100, 2);
display(ssPlayer);
System.out.println("\nAfter setting second, third, fourth, and fifth scores");
ssPlayer.setScore(100, 1);
ssPlayer.setScore(300, 2);
ssPlayer.setScore(400, 3);
ssPlayer.setScore(10, 4);
display(ssPlayer);
System.out.println("\nTrying to set eleventh score");
ssPlayer.setScore(100, 10);
PremiumSugarSmashPlayer pssPlayer = new PremiumSugarSmashPlayer();
pssPlayer.setIdNumber(2222);
pssPlayer.setName("Cory");
System.out.println("\nAt start");
display(pssPlayer);
pssPlayer.setScore(200, 0);
System.out.println("\nAfter setting first score");
display(pssPlayer);
System.out.println("Trying to set fifth score too soon");
pssPlayer.setScore(30, 4);
System.out.println("\nAfter setting second score");
pssPlayer.setScore(30, 1);
display(pssPlayer);
System.out.println("\nTrying to set third score when second is too low");
pssPlayer.setScore(100, 2);
display(pssPlayer);
System.out.println("\nAfter setting second through tenth scores");
for(int x = 1; x < 10; ++x)
pssPlayer.setScore(130, x);
display(pssPlayer);
System.out.println("\nTrying to set eleventh score");
pssPlayer.setScore(100, 10);
display(pssPlayer);
System.out.println("\nTrying to set 51st score");
pssPlayer.setScore(100, 50);
display(pssPlayer);
}
public static void display(SugarSmashPlayer p)
{
System.out.println(" ID #" + p.getIdNumber() + " Name: " +
p.getName());
for(int x = 0; x < p.getLevels(); ++x)
System.out.print(" " + p.getScore(x));
System.out.println();
}
}
答案 0 :(得分:1)
我相信你的问题是SugarSmashPlayer和PremiumSugarSmashPlayer都有自己的私人'得分'数组,但是作用于得分的方法(比如setScore)只存在于SugarSmashPlayer中,所以它们总是在SugarSmashPlayer的'得分'上运行。
要解决此问题,您需要弄清楚如何仅在SugarSmashPlayer中获得“分数”,但是数组的大小会因使用的类而异。
答案 1 :(得分:0)
解决问题的一种方法,也许是最好的方法,就是传递display()
方法的声明/定义 SugarSmashPlayer
和{{1} }类,以便您可以按照自己喜欢的方式对其进行更改,并根据要显示的内容覆盖它。
这意味着您必须相应地更改类属性,以便PremiumSugarSmashPlayer可以拥有其所有父级(SSP)属性,并且只使用PremiumSugarSmashPlayer
来改变需要区分的级别(级别,分数)。但是要实现这一点,您必须具有super.levels = 50;
字段的访问权限,因此您可以将其作为受保护的文件传递给您的SugarSmashPlayer类。
之后,您可以使用PSSP类中的levels
关键字覆盖SSP类的display()
方法,然后毫无问题地使用它。
抽象思维可能会拯救你。
SugarSmashPlayer内部
super
PremiumSugarSmashPlayer内部
public void display()
{
System.out.println(" ID #" + IDNumber + " Name: " +
screenName);
for(int x = 0; x < levels; ++x)
System.out.print(" " + scores[x]);
System.out.println();
}