Java 21点程序创建错误:非静态变量this不能从静态上下文中引用



我正试图为这个问题创建一个解决方案:"让函数BlackjackHighest(strArr(接受正在传递的strArr参数,该参数将是一个代表21点卡的数字和字母数组。数组中的数字将被写出。例如,strArr可能是["two"、"three"、"ace"、"king"]。strArr的完整可能性列表为:二、三、四、五、六、七、八、九、十、杰克、女王、国王、王牌。你的程序应该输出低于、高于或21点,表示你是否有21点(数字加起来是21(,以及你手中与你是否有20点有关的最高牌。如果数组包含一张王牌,但你的手牌将超过21,你必须将该王牌计算为1。你必须尽量保持在21分以下。所以使用上面提到的数组,输出应该低于king。在这个例子中,王牌被计算为1,因为如果不是,你就会超过21分。

另一个例子是,如果strArr是["四"、"十"、"王"],那么这里的输出应该高于王。如果你手里有一张10和一张脸牌之间的平局,将脸牌作为"最高牌"返回。如果你有多张脸牌,重要性的顺序是杰克、王后、国王。">

我尝试了以下代码

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

public class Main {
static String BlackjackHighest(String[] strArr) {
Card[] cards = new Card[strArr.length];
for (int i = 0; i < strArr.length; i++) {
cards[i] = new Card(strArr[i]);
}
Arrays.sort(cards, new Comparator<Card>() {
@Override
public int compare(Card card, Card card2) {
if (card.rating > card2.rating) return 1;
else if (card.rating < card2.rating) return -1;
return 0;
}
});
int total = 0;
boolean hasAce = false, aceUsed = false;
for (Card card : cards) {
if (card.rating == 14) {
hasAce = true;
}
if (total + card.topVal > 21) {
total += card.lowVal;
} else {
if (card.rating == 14) {
aceUsed = true;
}
total += card.topVal;
}
}
Card highest = cards[cards.length - 1];
if (hasAce && !aceUsed) {
highest = cards[cards.length - 2];
}
if (total < 21) {
return "below " + highest.repr;
} else if (total == 21) {
return "blackjack " + highest.repr;
}
return "above " + highest.repr;
}
class Card {
int lowVal = 0, topVal = 0, rating = 0;
String repr;
Card(String card) {
card = card.toLowerCase();
repr = card;
if (card.equals("two")) {
lowVal = 2; topVal = 2; rating = 2;
} else if (card.equals("three")) {
lowVal = 3; topVal = 3; rating = 3;
} else if (card.equals("four")) {
lowVal = 4; topVal = 4; rating = 4;
}  else if (card.equals("five")) {
lowVal = 5; topVal = 5; rating = 5;
} else if (card.equals("six")) {
lowVal = 6; topVal = 6; rating = 6;
} else if (card.equals("seven")) {
lowVal = 7; topVal = 7; rating = 7;
} else if (card.equals("eight")) {
lowVal = 8; topVal = 8; rating = 8;
} else if (card.equals("nine")) {
lowVal = 9; topVal = 9; rating = 9;
} else if (card.equals("ten")) {
lowVal = 10; topVal = 10; rating = 10;
} else if (card.equals("jack")) {
lowVal = 10; topVal = 10; rating = 11;
} else if (card.equals("queen")) {
lowVal = 10; topVal = 10; rating = 12;
} else if (card.equals("king")) {
lowVal = 10; topVal = 10; rating = 13;
} else if (card.equals("ace")) {
lowVal = 1; topVal = 11; rating = 14;
}
}
}
public static void main (String[] args) {
// keep this function call here
Scanner s = new Scanner(System.in);
Main c = new Main();
System.out.print(c.BlackjackHighest(s.nextLine()));
}
}

但是得到一个错误:

Main.java:10: error: non-static variable this cannot be referenced from a static context
cards[i] = new Card(strArr[i]);

此代码使

import java.util.*; 
import java.io.*;
class Main {
public static String BlackjackHighest(String[] strArr) {
Card[] cards = new Card[strArr.length];
for (int i = 0; i < strArr.length; i++) {
cards[i] = new Card(strArr[i]);
}
Arrays.sort(cards, new Comparator<Card>() {
@Override
public int compare(Card card, Card card2) {
if (card.rating > card2.rating) return 1;
else if (card.rating < card2.rating) return -1;
return 0;
}
});
int total = 0;
boolean hasAce = false, aceUsed = false;
for (Card card : cards) {
if (card.rating == 14) {
hasAce = true;
}
if (total + card.topVal > 21) {
total += card.lowVal;
} else {
if (card.rating == 14) {
aceUsed = true;
}
total += card.topVal;
}
}
Card highest = cards[cards.length - 1];
if (hasAce && !aceUsed) {
highest = cards[cards.length - 2];
}
if (total < 21) {
return "below " + highest.repr;
} else if (total == 21) {
return "blackjack " + highest.repr;
}
return "above " + highest.repr;
}
public static class Card {
int lowVal = 0, topVal = 0, rating = 0;
String repr;
Card(String card) {
card = card.toLowerCase();
repr = card;
if (card.equals("two")) {
lowVal = 2; topVal = 2; rating = 2;
} else if (card.equals("three")) {
lowVal = 3; topVal = 3; rating = 3;
} else if (card.equals("four")) {
lowVal = 4; topVal = 4; rating = 4;
}  else if (card.equals("five")) {
lowVal = 5; topVal = 5; rating = 5;
} else if (card.equals("six")) {
lowVal = 6; topVal = 6; rating = 6;
} else if (card.equals("seven")) {
lowVal = 7; topVal = 7; rating = 7;
} else if (card.equals("eight")) {
lowVal = 8; topVal = 8; rating = 8;
} else if (card.equals("nine")) {
lowVal = 9; topVal = 9; rating = 9;
} else if (card.equals("ten")) {
lowVal = 10; topVal = 10; rating = 10;
} else if (card.equals("jack")) {
lowVal = 10; topVal = 10; rating = 11;
} else if (card.equals("queen")) {
lowVal = 10; topVal = 10; rating = 12;
} else if (card.equals("king")) {
lowVal = 10; topVal = 10; rating = 13;
} else if (card.equals("ace")) {
lowVal = 1; topVal = 11; rating = 14;
}
}
}
public static void main (String[] args) {
// keep this function call here
Scanner s = new Scanner(System.in);
Main c = new Main();
System.out.print(c.BlackjackHighest(s.nextLine()));
}
}

最新更新