-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathGame.java
251 lines (240 loc) · 8.9 KB
/
Game.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
import java.util.*;
import java.io.*;
/**Kelas utama dalam game ini yang berisi atribut-atribut static yang berada pada dunia game ini,
* yaitu Array of Player, ActionDeck, TrapDeck, GameBoard, dan DiscardPile. Kelas ini juga menghandle
* semua fungsi utama dalam mekanisme game, initialization dan turn */
public class Game{
private static ArrayList<Player> Players;
private static Deck ActionDeck;
private static Deck TrapDeck;
private static Board GameBoard;
private static DiscardPile DumpPile;
private static int CurrentPlayer;
private final int DiceSide = 12;
private static boolean GameFinish;
private static int LapNumber;
/**Konstruktor game yang langsung menginisialisasi semua komponen yang diperlukan dalam game
* @param Nplayer jumlah player yang akan memainkan game, berkisar dari 2-4
*/
Game(int Nplayer){
ActionDeck = new Deck();
TrapDeck = new Deck();
GameBoard = new Board(Nplayer);
DumpPile = new DiscardPile();
Players = new ArrayList<Player>();
PlayerFactory Factory = new PlayerFactory();
Players.add(new Player()); //untuk menutup indeks player ke 0
for(int i=1;i<=Nplayer;i++){
Player playerin = Factory.getRole(SelectTarget());
Players.add(playerin);
}
CurrentPlayer=1;
setNumberLap();
Initialization();
}
/**method yang akan meminta pengguna memasukkan jumlah lap/putaran yang diperlukan untuk menyelesaikan
* permainan*/
public void setNumberLap(){
Scanner targetin = new Scanner(System.in);
System.out.println("Number of lap: ");
try{
LapNumber = targetin.nextInt();
}
catch(Exception e){
LapNumber = 2;
System.out.println("masukan tidak valid, jumlah lap menjadi default 2 lap");
}
}
/**getter untuk jumlah lap yang dibutuhkan untuk finish
* @return jumlah lap yang required untuk finish*/
public static int getLapNumber(){
return LapNumber;
}
/**fungsi untuk meminta pengguna memilih role yang akan dia gunakan
* @return String berupa nama role yang akan dikirim ke PlayerFactory untuk
* menghasilkan instansiasi player yang akan digunakan */
public String SelectTarget(){
Scanner targetin = new Scanner(System.in);
String s;
int i = 0;
do{
if(i>0){
System.out.println("Ulangi pilihan role");
}
System.out.println("Choose Role: ");
System.out.println("(Arjuna/Nakula/Sadewa/Werkudara/Yudhistira)");
s = targetin.next();
i++;
if(s.equalsIgnoreCase("Arjuna") || s.equalsIgnoreCase("nakula") ||
s.equalsIgnoreCase("sadewa") || s.equalsIgnoreCase("werkudara") ||
s.equalsIgnoreCase("yudhistira")){
break;
}
}while(i>0);
return s;
}
/**getter untuk discardpile yang digunakan di dunia game*/
public static DiscardPile getDP(){
return DumpPile;
}
/**getter untuk Array of player yang bermain game*/
public static ArrayList<Player> getPlayers(){
return Players;
}
/**getter untuk board game yang digunakan*/
public static Board getBoard(){
return GameBoard;
}
/**getter untuk index player yang sedang aktif menjalankan gilirannya*/
public static int getCurrentPlayerIdx(){
return CurrentPlayer;
}
/**getter untuk Player yang sedang aktif menjalankan gilirannya*/
public static Player getCurrentPlayer(){
return Players.get(CurrentPlayer);
}
/**getter untuk ActionDeck yang digunakan dalam permainan*/
public static Deck getActionDeck(){
return ActionDeck;
}
/**method untuk memberitahu program bahwa game telah selesai*/
public static void Finish(){
GameFinish = true;
}
/**method untuk menginisialisasi elemen-elemen yang digunakan, seperti meload deck dari file eksternal
* hingga menjadi deck yang bisa dimainkan di dalam game*/
public void Initialization(){
try{
ActionDeck.LoadDeck(new File("ActionDeck.xml"));
TrapDeck.LoadDeck(new File("TrapDeck.xml"));
GameBoard.initRoad();
}
catch(Exception e){}
ActionDeck.Shuffle();
TrapDeck.Shuffle();
for(int i=1;i<Players.size();i++){
Players.get(i).StartLap();
}
}
/**Method utama yang menjalankan semua aksi yang dapat digunakan pemain dalam permainan,
* seperti maju dengan kocokan dadu, mainkan kartu tangan, gunakan aksi, hingga pengguna mengakhiri giliran
* dan game mengganti pemain yang aktif menjalankan giliran*/
public void Turn(){
int opt=0;
int targettilestatus;
int movement;
boolean switchplayer=true;
BufferedReader Buff = new BufferedReader(new InputStreamReader(System.in));
Scanner Option = new Scanner(System.in);
Random Dice = new Random();
Players.get(CurrentPlayer).StartTurn();
while(opt!=5){
GameBoard.drawBoard();
System.out.println("Pemain: " + CurrentPlayer);
System.out.println(Players.get(CurrentPlayer));
System.out.print("1) Kocok Dadu");
if(Players.get(CurrentPlayer).getStop()>0){
System.out.println("(tidak bisa dilakukan, terkena stop untuk " + Players.get(CurrentPlayer).getStop() + " putaran)");
}
else if(Players.get(CurrentPlayer).hasAdvanced()){
System.out.println("(tidak bisa dilakukan, anda telah melangkah)");
}
else{
System.out.println("");
}
System.out.print("2) Mainkan Kartu");
if(Players.get(CurrentPlayer).hasPlayedACard()){
System.out.println("(tidak bisa dilakukan, anda telah memainkan sebuah kartu)");
}
else{
System.out.println("");
}
System.out.print("3) Aksi Khusus");
if(Players.get(CurrentPlayer).isAction()){
System.out.println("(Aksi bisa dilakukan!)");
}
else{
System.out.println("(Tidak bisa melakukan aksi)");
}
System.out.println("4) Cek Status");
System.out.println("5) Akhiri Giliran");
System.out.println("");
System.out.println("Kartu di tangan: ");
if(switchplayer){
System.out.println("Giliran pemain " + CurrentPlayer + ", tekan enter untuk memulai giliran");
try{String line = Buff.readLine();}
catch(Exception e){}
switchplayer=false;
}
else
{
Players.get(CurrentPlayer).getHand().DisplayHand();
System.out.println("\nPilihan Aksi: ");
opt = Option.nextInt();
switch(opt){
case 1: if(Players.get(CurrentPlayer).CanAdvance()){
movement = 1+Dice.nextInt(DiceSide);
targettilestatus = GameBoard.move(Players.get(CurrentPlayer), CurrentPlayer, movement);
Players.get(CurrentPlayer).Advance(movement);
if(targettilestatus==88){
TrapTriggered(CurrentPlayer);
}
}
else{
System.out.println("Anda telah maju dari kocokan dadu putaran ini atau sedang terkena stop");
}
break;
case 2: Players.get(CurrentPlayer).PlayCard(); break;
case 3: Players.get(CurrentPlayer).useAction(); break;
case 4: printStatus(); break;
case 5: Players.get(CurrentPlayer).EndTurn();
switchplayer=true;
if(CurrentPlayer<Players.size()-1){
CurrentPlayer++;
}
else{
CurrentPlayer=1;
}
Players.get(CurrentPlayer).StartTurn();
break;
default: System.out.println("input tidak valid"); break;
}
System.out.println("");
}
}
}
/**method untuk dijalankan saat seorang pemain berhenti di petak yang merupakan jebakan, method ini akan
* memainkan kartu teratas dari deck Trap untuk dikenakan kepada pemain yang menginjaknya
* @param target indeks pemain yang terkena jebakan untuk diberi efek dari kartu teratas deck Trap
* */
public static void TrapTriggered(int target){
System.out.println("Pemain terkena jebakan");
TrapDeck.PlayTopDeck(target);
GameBoard.unsetTrap(Players.get(CurrentPlayer).getPosition());
}
/**method utama untuk memulai menjalankan turn pertama dan mengulang hingga GameFinish dibuat true oleh method Finish
* dan pada saat permainan selesai menuliskan pemenangnya
* */
public void Start(){
GameFinish=false;
while(!GameFinish){
Turn();
}
System.out.println("\n\nDimenangkan oleh pemain: " + CurrentPlayer);
System.out.println("\n\n\nPermainan selesai");
}
/**method untuk menampilkan status seluruh pemain, posisi, role dan aksi yang bisa digunakannya
* */
public void printStatus(){
int i =0;
for(Player e: Players){
if(i>0){
System.out.println("Player ke-"+i);
System.out.println(e.toString());
System.out.println("Aksi:");
System.out.println(e.getDescription());
}
i++;
}
}
}