我想提供一个4人骰子游戏的实现,其中每个玩家都被实现为一个线程。每个玩家都有机会按照玩家编号掷骰子。每个掷骰子只返回1到6的数字。当任何玩家获得25分或以上的打印赢家时,游戏就会停止。
我正在考虑创建课程
用于处理骰子的骰子
主席用于处理所有主题和玩家得分
用于开始游戏的TheGame
我的班级骰子
import java.util.Random;
public class Dice {
Random dice;
public Dice()
{
dice=new Random();
}
public int throwDice()
{
int a= dice.nextInt(70);
a=a/10;
if (a==0)
return 1;
else return a;
}
}
我的播放器类
public class Player extends Thread {
Board board;
int num;
public Player(Board b,int n)
{
board=b;
num=n;
}
public void run()
{
System.out.println("Player "+num+" is started, playing game...");
while(board.flag)
{
board.play(num);
}
}
}
游戏类
public class TheGame {
public static void main(String[] args) {
System.out.println("Initializing board...");
Board b=new Board(); //Creating object of class board
System.out.println("Initializing players...");
Player p1=new Player(b,1); // Every player is Thread
Player p2=new Player(b,2);
Player p3=new Player(b,3);
Player p4=new Player(b,4);
p1.start(); //Starting Thread
p3.start();
p2.start();
p4.start();
}
}
我无法想到Logic或决定从哪个课程开始。 请帮我处理董事会代码
这不是作业或作业。 我想自己做,但对线程中的同步
没有任何深刻的想法我正在尝试编码我不是要求完整的教程我只是在询问玩家1(线程)在玩家1完成机会之后如何执行时如何设置顺序。
答案 0 :(得分:3)
这只是为了指出你正确的方向。你需要阅读的内容比我在这里写的要多得多。然后你需要修复各种奇怪和不可挽回的错误。但你确实问过......
如果所有4名球员同时投球,我认为这更简单,也更有趣。 (虽然你可能有不止一个赢家。)为此:
创建全局监视器和字段(可能在Game类中):
public static final turnMonitor = new Object();
public static final controlMonitor = new Object();
public static volatile gameOn = true;
然后使用run方法创建一个Player类。 (Player可以扩展Thread,或者它可以扩展Runnable,你可以将它传递给新的Thread。)像这样:
public void run() {
while (gameOn) {
synchronized (turnMonitor) { turnMonitor.wait(); }
...roll dice here...
...Put sum of Player rolls in volatile instance field or synched field...
...Update volatile player turn counter...
synchronized (controlMonitor) {
// Tell control monitor we're done.
controlMonitor.notifyAll();
}
}
}
然后你会想要控制代码(在Game类中?):
while (true) {
// Roll dice
synchronized (turnMonitor) { turnMonitor.notifyAll(); }
// Wait for dice to roll
do {
synchronized (controlMonitor) { controlMonitor.wait(); }
} while ( ...not all players have rolled this turn... );
if ( there's a winner ) break;
}
gameOn = false;
这应该给你一个开始。研究同步,挥发性,wait()和notifyAll()。如果您无法在任何地方找到好的示例,请查看here(基础知识)。
启动时,打印大量调试信息。当你不期望它们时,线程总是在运行。你 会感到惊讶。
让玩家一次滚动一个,我想你想要多个转弯监视器。您一次只能通知一个等待的线程,但是您无法控制哪个线程得到通知,因此尝试从一个监视器上获取正确的线程将很困难。