- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在研究纸牌游戏Gin Rummy的基本模拟,虽然目前还不完整,但在我尝试之前它能够运行一副纸牌的基本功能实现一种向每个玩家发牌的方法。
类Player
应该由一个ArrayList
(它保存每个玩家手中的牌)和一个integer
(用作玩家 ID)。我已将它们声明为 static
对象,但这当然意味着我创建的每个 Player
实例现在都具有相同的 Hand
和 playerid
因为变量是静态的。
这就是我当时面临的问题。我相信任何static
类或方法只能访问其他static
类、方法对象等。因为main
方法必须是static
,它可以访问的任何东西肯定也必须是static
等等?我的 Player
类中的对象如何不是静态的,从而允许我为 Player
的每个实例分配不同的 Hand
和 玩家ID
?
我在下面包含了我的代码,很抱歉它太长了,我想我应该把所有内容都放在以防万一。郑重声明,正是在 PlayGinRummy 类中我调用 Player 新实例的点引发了错误 non-static variable Hand Can not be referenced from静态上下文
。
package labexercise1;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
public class DeckOfCardsTest {
public DeckOfCardsTest(){}
private static int Menu;
public static void main(String[] args) throws InterruptedException{
DeckOfCards.FillDeck();
do{
Thread.sleep(1000);
System.out.println("Please select from the following menu options using the corresponding number:");
System.out.println("1. Display Deck | 2. Shuffle Deck | 3. Cut Deck | 4. Start Game | 5. Exit"); //Start game will lead into another switch menu to set no of players etc.
System.out.print("Your choice: ");
Scanner UserInput = new Scanner(System.in);
System.out.println();
Menu = UserInput.nextInt(); // Maybe build in a system that recognises, for example, "1", "one" and "One" as the menu selection 1, using if/else
System.out.println();
switch(Menu){
case 1:
DeckOfCards.DisplayDeck();
break;
case 2:
DeckOfCards.ShuffleDeck();
break;
case 3:
DeckOfCards.CutDeck();
break;
case 4:
PlayGinRummy.DealDeck(); // Maybe shuffle things around so this just calls a method in player, from which everything else is called. Would mean moving things over from DeckOfCards so Player had access to hp, cp1, cp2 and cp3.
break;
case 5:
System.out.println("The program will now end.");
System.out.println();
break;
default:
System.out.println("Your input is not a valid selection.");
System.out.println();
break;
}
} while(Menu!=5);
}
public class DeckOfCards {
public DeckOfCards(){}
public static ArrayList<Integer> Deck = new ArrayList<>();
public static ArrayList<Integer> Discard = new ArrayList<>();
public static void FillDeck() throws InterruptedException{
System.out.print("Compiling deck");
DeckOfCards.CountdownEffect();
for(int count=0; count<52; count++){
Deck.add(count);
}
System.out.println(" Deck compiled!");
System.out.println();
}
public static void DisplayDeck() throws InterruptedException{
System.out.println("Displaying deck contents:");
Thread.sleep(1000);
for(int count=0; count<52; count++){
System.out.println(Deck.get(count));
}
System.out.println();
}
public static void ShuffleDeck() throws InterruptedException{
System.out.print("Shuffling deck");
Thread.sleep(1000);
for(int count=0; count<3; count++){
System.out.print(".");
Thread.sleep(1000);
}
Collections.shuffle(Deck);
System.out.println(" Deck shuffled!");
System.out.println();
}
public static void CutDeck() throws InterruptedException{
System.out.print("Cutting deck");
Thread.sleep(1000);
for(int count=0; count<3; count++){
System.out.print(".");
Thread.sleep(1000);
}
System.out.println();
System.out.println("The cut card is:");
Random random = new Random();
int CutPoint = 51 - (random.nextInt(52));
System.out.println(Deck.get(CutPoint));
System.out.println();
}
public static void CountdownEffect() throws InterruptedException{
Thread.sleep(1000);
for(int count=0; count<3; count++){
System.out.print(".");
Thread.sleep(1000);
}
}
}
public class Player{
public Player(ArrayList<Integer> h, int id, int n){
Hand = new ArrayList<>(h);
playerid = id;
NoOfPlayers = n;
}
public ArrayList<Integer> Hand;
public int playerid;
public static int NoOfPlayers;
public int SizeOfHand(){
int s = Hand.size();
return s;
}
public void DisplayHand() throws InterruptedException{
System.out.print("Displaying ");
if (playerid==1)
System.out.print("player's");
else if (playerid==2)
System.out.print("computer player 1's");
else if (playerid==3)
System.out.print("computer player 2's");
else if (playerid==4)
System.out.print("computer player 3's");
System.out.println(" hand:");
Thread.sleep(1000);
for(int count=0; count<7; count++){
if (count<6)
System.out.print(Hand.get(count) + ", ");
else if (count==6)
System.out.println(Hand.get(count) + ".");
}
}
}
public class PlayGinRummy {
public PlayGinRummy(){}
public static int NoOfPlayers;
public static void DealDeck() throws InterruptedException{
int cardno, playerno; // Tracks index of top card
System.out.println("Please input the desired number of players (2-4): ");
Scanner UserInput = new Scanner(System.in);
NoOfPlayers = UserInput.nextInt();
System.out.println();
System.out.println();
cardno=51;
playerno=0;
do{
if (NoOfPlayers==2){
Player hp = new Player(Player.Hand,1,NoOfPlayers);
Player cp1 = new Player(Player.Hand,2,NoOfPlayers);
do{
if (playerno%2==0)
hp.Hand.add(DeckOfCards.Deck.get(cardno));
else if (playerno%2==1)
cp1.Hand.add(DeckOfCards.Deck.get(cardno));
DeckOfCards.Deck.remove(cardno);
playerno++;
cardno--;
}while(hp.SizeOfHand()!=7 && cp1.SizeOfHand()!=7);
hp.DisplayHand();
cp1.DisplayHand();
}
else if (NoOfPlayers==3){
Player hp = new Player(Player.Hand,1,NoOfPlayers);
Player cp1 = new Player(Player.Hand,2,NoOfPlayers);
Player cp2 = new Player(Player.Hand,3,NoOfPlayers);
do{
if (playerno%3==0)
hp.Hand.add(DeckOfCards.Deck.get(cardno));
else if (playerno%3==1)
cp1.Hand.add(DeckOfCards.Deck.get(cardno));
else if (playerno%3==2)
cp2.Hand.add(DeckOfCards.Deck.get(cardno));
DeckOfCards.Deck.remove(cardno);
playerno++;
cardno--;
}while(hp.SizeOfHand()!=7 && cp1.SizeOfHand()!=7 && cp2.SizeOfHand()!=7);
hp.DisplayHand();
cp1.DisplayHand();
cp2.DisplayHand();
}
else if (NoOfPlayers==4){
Player hp = new Player(Player.Hand,1,NoOfPlayers);
Player cp1 = new Player(Player.Hand,2,NoOfPlayers);
Player cp2 = new Player(Player.Hand,3,NoOfPlayers);
Player cp3 = new Player(Player.Hand,4,NoOfPlayers);
do{
if (playerno%4==0)
hp.Hand.add(DeckOfCards.Deck.get(cardno));
else if (playerno%4==1)
cp1.Hand.add(DeckOfCards.Deck.get(cardno));
else if (playerno%4==2)
cp2.Hand.add(DeckOfCards.Deck.get(cardno));
else if (playerno%4==3)
cp3.Hand.add(DeckOfCards.Deck.get(cardno));
DeckOfCards.Deck.remove(cardno);
playerno++;
cardno--;
}while(hp.SizeOfHand()!=7 && cp1.SizeOfHand()!=7 && cp2.SizeOfHand()!=7 && cp3.SizeOfHand()!=7);
hp.DisplayHand();
cp1.DisplayHand();
cp2.DisplayHand();
cp3.DisplayHand();
}
else{
System.out.println("The choice made is invalid, please try again.");
System.out.println();
}
}while(NoOfPlayers!=2 && NoOfPlayers!=3 && NoOfPlayers!=4);
System.out.println();
}
}
最佳答案
As the "main" method must be static, surely anything it can access has to also be static and so on and so forth?
没有。静态方法可以访问实例方法。他们通过使用实例来做到这一点。 main
创建实例以使用实例方法(无论是 main
类本身还是其他类的实例方法)是非常非常常见的。
一般来说:
public static final void main(String[] args) {
SomeClass instance = new SomeClass();
instance.method();
}
如果您正在制作一些小型且完全独立的东西,那么 main
创建它所在的类是很常见的。例如:
public class Simple {
private String name;
public static final void main(String[] args) {
// Create a couple of instances
Simple s1 = new Simple();
Simple s2 = new Simple();
// Use instance methods
s1.setName("s1");
s2.setName("s2");
System.out.println(s1.getName());
System.out.println(s2.getName());
}
private void setName(String name) {
this.name = name;
}
private String getName() {
return this.name;
}
}
我使用了两个单独的实例来强调。我为它们使用了单独的变量,但当然,如果您要将它们视为分组列表或实例集,您可能会使用数组、List
或 Set
。数组示例:
public class Simple {
private String name;
public static final void main(String[] args) {
// Create the array (no instances are created)
Simple[] simples = new Simple[2];
// Create a couple of instances, set their names
for (int n = 0; n < simples.length; ++n) {
simples[n] = new Simple();
simples[n].setName("s[" + n + "]");
}
// Use instance methods
for (Simple s : simples) {
System.out.println(s.getName());
}
}
private void setName(String name) {
this.name = name;
}
private String getName() {
return this.name;
}
}
关于java - 如何从静态方法轻松访问类的各种实例中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20957026/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
在 C# 静态方法中是否有一种方法可以引用定义该方法的类型? 在实例方法中,您可以通过以下方式确定类型: public void Foo() { Type type = this.GetTyp
WPF:静态、动态资源以及资源词典 静态资源与动态资源 我们常常会使用样式或者控件模板放在Window.Resources中,比如这样: 静态资源与动态资源使用如下: <Window
任何人都知道如何在共享/静态函数中动态加载控件?该函数本身位于 mustinherit/abstract 类中。 (这是 VB 中的 ASP.NET 项目)我想做这样的事情: VB: Publ
在我看来,静态/强类型编程语言最宝贵的一点是它有助于重构:如果/当您更改任何 API,那么编译器会告诉您该更改破坏了什么。 我可以想象用运行时/弱类型语言编写代码......但我无法想象没有编译器的帮
正如我的名字所暗示的,我是一名 .NET 开发人员,但我对 Java 的兴趣越来越大,并且我有兴趣学习更多其他语言,因为这有助于我学习更多关于编程的知识。 无论如何,我的问题是:不带参数/不使用状态的
我在java中使用WireMock来 stub POST请求。该请求返回一个存储在我本地的 json 正文文件。 stub 看起来像这样: wireMockServer.stubFor(get(url
Python 是否有类构造函数的机制,即每当首次引用类时(而不是创建该对象的实例时)调用的函数?我知道其他一些语言中也存在这种情况,但我还没有在 Python 中遇到过。 基本上,我想初始化该函数中的
Python 是否有类构造函数的机制,即每当首次引用类时(而不是创建该对象的实例时)调用的函数?我知道其他一些语言中也存在这种情况,但我还没有在 Python 中遇到过。 基本上,我想初始化该函数中的
这个问题已经有答案了: What is the difference between dynamic and static polymorphism in Java? (14 个回答) 已关闭 4 年
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Static initializer in Java 我想知道这个静态的东西(抱歉,这是我第一次遇到这个)对一个类有
如果c++应用程序是按以下方式组织的 //file1.cpp static Y sgObj = X::getInitObject(0); //declared in file scope //fil
我有一个抽象类(AvergedDataRecord),我需要进一步抽象(DataRecord),这样我就可以将它扩展到原始类和一个新的具体类(SummedDataRecord),并且我在获取某些方法时
我正在尝试制作一个字符串枚举。这是我到目前为止所得到的, private class TypedEnum : IEnumerable { public IEnumerator GetEnume
我选修了一门名为“安全代码”的类(class),在下一个作业中,我们应该对一些 C 文件和 JavaEE Web 项目进行静态/动态分析。 我检查了“源监视器”并在 C 文件上运行它,但是(除非我不知
我有两个类,一个是登录类,一个是用户类。在 loggedIn 类中,我想显示我在用户登录时所做的共享首选项。 loginPrefs = getSharedPreferences("loginprefe
我在同一个 Activity 中有两个静态 fragment ,在“fragmentA”中我有一个自定义列表,当一个项目被点击时必须在“fragmentB”中出现一个细节,细节只在我改变屏幕方向时出现
在 Java 中是未修改方法变量,缺少final,每次都重新初始化限定符 静态方法 实例方法 如果 1. 或 2.(或两者)的答案是 final 限定符允许 Java 执行优化并存储方法变量只有一次?
我有两个类相互交互。第一个是中心的,如下: public class Datenbank { double winkelPanel = 0; double groessePanel = 0; doub
我有一个 mysql 数据库,它连接基于 Web 的 php 应用程序和 FoxPro 应用程序(是的,foxpro)。在之前的“开发人员”被解雇后开始处理这个问题。 无论如何,我熟悉 AES_Enc
我是一名优秀的程序员,十分优秀!