JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 程式分享區 » Game  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
作者 怪物大進擊!!
haur576





發文: 271
積分: 1
於 2013-12-25 19:30 user profilesend a private message to usersend email to haur576reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
寫好了,預計在今天完成並發布~
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
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
/*本程式擁有26個方法(不知道算不算多),
有些程式碼會重複利用,所以使用多個方法(但感覺分的太細)
程式的變數很多,所以必須給他們一個規定,比較整齊
以下是變數參考表:
1.種類
mon=怪物(monster)
bow=箭(本來想用arrow,但"arr"...)
gun=槍手(gunner,本來想用"can"non...)
bul=子彈(bullet)
cd =等待時間(回合)
up =升級時執行的升級條件次數
2.種類資訊
pos=位置(行數)(position)
pow=力量(power)
bas=最低(basic,怪物(箭,子彈)最低的攻擊力,最大則是max_pow+(mon,bow,bul)_bas_pow)
lim=限制(limit,預防太多,程式跑很久)
num=紀錄第幾個(number)
all=回合會有的總數
3.地形
stage=列數,例如:
prints:00  01  02  03  04  05  06  07  08  09
previe:___ __3 _55 ___ ___ __8 _19 _11 ___ ___

stage1:__+ __+ __+ __3 __9 __+ __+ __7 __1 __5
stage2:__8 __6 _11 __9 _10 __+ __+ __+ __+ __5 
stage3:+++ +++ +++ +++ ++6 +++ +++ +++ +11 ++2
stage4:_13 _+9 _+5 _+7 _++ _+6 _+3 _++ _++ _++
stage5:___ _35 ___ _66 __2 _12 _20 __6 ___ _13
spikes: _^  _^  _^  _^  _^  _^  _^  _^  _^  _^

heal=補給站,城堡的防衛

剩餘不在此列表中的變數,會比較不整齊,但旁邊都有註解說明
*/
import java.util.Scanner;
import java.text.DecimalFormat;
import java.io.Console;
class defender{
  //怪物
static int mon_pos;//怪物的位置
static int mon_pow,mon_bas_pow;//怪物的力量
static int mon_num,mon_all;//第幾個怪物(Monsummon),一回合的怪物數
  //箭
static int bow_pos;//箭的位置
static int bow_pow,bow_bas_pow;//箭的力量
static int bow_num,bow_all;//第幾支箭(Shoots),一回合的弓箭數
  //槍手
static int gun_arr,gun_row;//槍手射擊的位置
static int gun_num,gun_all;//第幾個槍手(Gun),一回合的槍手數
static int bul_pow,bul_bas_pow; //子彈的力量
static int bul_num,bul_all;//第幾發子彈(Gun),一支槍手的子彈數
  //其他
static int add;//增加的數量
static int max_pow;//最大的數量(加在bas_pow上)
static int attack,castle;//攻擊位置(attack),生命
static int gain,cd_value,cd_count;//得到多少倍的生命,倒數幾回合升級,升級倒數
static int upgrade,level,stage;//隨機升級選項,等級,10x等級
static int print,stage_line;//列印,場地行數
static int check;//查看是否有怪物在場上
static boolean no_mon;//查看是否有怪物在場上
static int copy;//讓stage5的怪物不要因為arraycopy死掉(被stage4覆蓋)
static int up_count,up_value;//升級會有幾次改變
static int preview_heal,stage1_heal,stage2_heal,stage3_heal,stage4_heal,stage5_heal;//設定補給站的補血量
static boolean enter;//讓升級不再需要按enter
static int gun_lim,bul_lim,mon_lim,bow_lim,castle_lim,gain_lim,up_lim,stage_lim;//設定限制,超過時更改(Upgrade)
  //場地與怪物存放區(陣列)
static int[] empty=new int[100];//讓stage arraycopy(Forward)(Start)
static int[] preview=new int[empty.length];//預覽(打不到)
static int[] stage1=new int[empty.length];//第一條
static int[] stage2=new int[empty.length];//第二條
static int[] stage3=new int[empty.length];//第三條
static int[] stage4=new int[empty.length];//第四條
static int[] stage5=new int[empty.length];//最後一條
  //其他
static DecimalFormat format=new DecimalFormat("00");//格式化(Land)(Gun)
static Scanner in=new Scanner(System.in);//取得使用者輸入
static Console stop=System.console();//用來暫停畫面(Upgrade)(Gun)
static char[] stops;//用來接stop的password(Upgrade)(Gun)
 
public static void main(String[] args){//主方法,因主方法不知怎麼呼叫(被Lose呼叫,重新開始),所以讓他呼叫Start方法
    Start();
  }//main結束
 
static void Start(){//遊戲開始(main)(Lose)
    Initial();//賦值
    Help();//輸入幫助
    Monsummon();//生成怪物
    Forward();//前進,因一開始怪物在preview而已,故要先讓他生成+前進,才不會說:場上沒有怪物了
    Run();//遊戲真正開始
  }//Start結束
  
static void Initial(){//賦值(Start)
    enter=true;//在升級及槍手射擊時會提示,若改成false則不提示,讓遊戲更快速(不需按Enter)
    castle=100;//一開始的血量=100
    level=0;stage=0;cd_value=10;cd_count=10;//等級(x1)=0 等級(x10)=0 倒數回合數(計值)=10 倒數回合數(計算)=10
    mon_bas_pow=bow_bas_pow=bul_bas_pow=1;//最低攻擊力
    mon_all=bow_all=1;gun_all=0;bul_all=3;//總數 
    max_pow=0;//最大攻擊力與最小攻擊力的差距=0
    add=gain=1;//一次增加的_all=打死怪物得到的磚塊倍數=0
    stage_line=2;up_count=1;up_value=1;//場地行數,升級執行次數(計算),升級執行次數(計值)
    preview_heal=stage1_heal=stage2_heal=stage3_heal=stage4_heal=0;//補給站一開始都是0
    stage5_heal=-3;//防衛裝置(-)or補給站(+)
    gun_lim=mon_lim=up_lim=bow_lim=gain_lim=3;//大多的限制一開始都是2
    stage_lim=3;bul_lim=5;castle_lim=500;//其他的限制
    //把所有的陣列歸零
    System.arraycopy(empty,0,preview,0,empty.length);
    System.arraycopy(empty,0,stage1,0,empty.length);
    System.arraycopy(empty,0,stage2,0,empty.length);
    System.arraycopy(empty,0,stage3,0,empty.length);
    System.arraycopy(empty,0,stage4,0,empty.length);
    System.arraycopy(empty,0,stage5,0,empty.length);
  }//Initial結束
  
static void Help(){//開始(Start)
    System.out.println("歡迎來到防禦城堡遊戲,遊戲規則:\n");
    System.out.println("1.每回合都會跑出"+mon_all+"隻怪物,你會得到"+bow_all+"支箭");
    System.out.println("2.用箭把怪物打死,並增加磚塊");
    System.out.println("3.怪物如果在有\"+\"號的地方,他們會加血(補給站,多少個\"+\"補多少血量)");
    System.out.println("4.怪物跑到第五行,在回合內沒有打死他,你的城堡就會受傷");
    System.out.println("5.如果被怪物入侵(磚塊沒了),你就輸了");
    System.out.println("6.每"+cd_value+"回合會升級一次");
    System.out.println("7.注意:槍手不一定會打到,一個槍手一回合會射"+bul_all+"發子彈");
    System.out.println("8.如果箭的攻擊力大於怪物的血量,箭就會穿過怪物攻球擊");
    System.out.println("9.怪物的攻擊力=他的血量");
    System.out.println("10.在靠近城堡的地方把怪物打死,會有額外的磚塊");
    System.out.println("11.怪物在攻擊你的城堡時,他會"+stage5_heal+"血量");
    System.out.println("12.想退出時,可在輸入行數時輸入非數字,即可跳出");
    System.out.println("13.若前面是0,可不須輸入");
    System.out.println("14.第一排是行號,第二排是預覽(打不到)");
    System.out.println("15.當排數減少時,那些排的怪物會隱形,且不會前進,直到下次排數增加");
    System.out.println("16.加油!努力闖到100級吧!");
    System.out.println("\n==========遊戲開始!!==========\n");
  }//Help結束
  
static void Monsummon(){//生成怪物(Run)(OptionUp-15)
    for(mon_num=1;mon_num<=mon_all;mon_num++){//多個怪物
    do{mon_pos=(int)(Math.random()*stage_line);}while(preview[mon_pos]!=0);//預防重疊
    mon_pow=(int)(Math.random()*(max_pow+1)+mon_bas_pow);//設定力量
    preview[mon_pos]=mon_pow;//放置
    }//for結束
    for(copy=0;copy<stage_line;copy++)preview[copy]+=preview_heal;
  }//MonSummon結束
  
static void Forward(){//前進(Run)(OptionUp-15)
    for(copy=0;copy<stage_line;copy++)stage5[copy]+=stage4[copy];//stage5的怪物若執行arraycopy,會被蓋掉,所以用加的
    System.arraycopy(stage3,0,stage4,0,stage_line);
    System.arraycopy(stage2,0,stage3,0,stage_line);
    System.arraycopy(stage1,0,stage2,0,stage_line);
    System.arraycopy(preview,0,stage1,0,stage_line);
    System.arraycopy(empty,0,preview,0,stage_line);//清空preview
  }//Forward結束
  
static void Run(){//執行(Start)  
  for(;;){//回合的迴圈
    if(cd_count<=0)Upgrade();//升級
    Monsummon();//生成怪物
    Bow();//箭攻擊
    Check();
    if(gun_all>0){
    if(no_mon){
    if(bow_num==0)System.out.println("\n場上沒有怪物了,將跳過槍手");
    else System.out.println("與槍手");}//if(no_mon)結束
    else Gun();}//if(gun_all>0)結束
    Mon();//怪物攻擊
    if(castle<=0){Lose();break;}//結束遊戲
    Forward();//怪物前進
    Heal();//怪物補給
    NextRound();//進至下一回合的輸出
    }//下一回合,for結束
  }//Run結束
  
static void Upgrade(){//調整數值(Run)
    EveryUp();//升級的例行公事
    ChoUp();//主要的升級選項
    if(cd_count>1)System.out.println("\n離下次升級還有"+cd_count+"回合");
  }//Upgrade結束
 
static void EveryUp(){//每次升級前的加減判斷(副要)(Upgrade)
    level++;//升級!!
    up_count=up_value;//有??個升級
    //輸出~
    if(enter){
      System.out.println("目前等級是"+(stage*10+level)+"級\t\t\t[enter]");//叫使用者按enter
      stops=stop.readPassword();//給使用者按enter而按其他鍵都無效
    }
    else System.out.println("目前等級是"+(stage*10+level)+"級\n");
    //一堆if
    if((stage==10)&&(level==0))System.out.println("恭喜你已經破台了,你還可以繼續玩,生存下去吧!");//if 1結束~
    System.out.println("此回合的變更如下:");
    if((level==10)){//n0等了!
    level-=10;stage++;
      if(cd_value>1){//不能讓他為0
      cd_value--;up_count--;
      System.out.println("每"+cd_value+"回合升級一次");
      }//if 2結束
      if((stage>=10)&&(enter)&&(up_count>0)){//enter是讓他只改變一次,up_count不要變負的
      enter=false;up_count--;
      System.out.println("以後升級及槍手射擊不再提示");
      }//if 3結束
      }//n0等結束
    CutAll();//處理過大(超過限制)的變數
    cd_count+=cd_value;//增加等待回合(因為已經沒了)
  }//EveryUp結束
  
static void CutAll(){//把太多的數值減低,不然會執行很久,例如:45隻槍手,37發子彈,68發箭(Upgrade-EveryUp)
    if((gun_all>=gun_lim)&&(up_count>0)){//第一個if
      int gun_minus=gun_all-1;gun_all=1;bul_bas_pow+=gun_lim;up_count--;
      System.out.println("現在你剩"+gun_all+"隻槍手(減少"+gun_minus+"),但是子彈的攻擊力是"+bul_bas_pow+"~"+(bul_bas_pow+max_pow)+"了(最大最小各增加"+gun_lim+")");
      gun_lim+=1;
    }//第一個if結束
    if((stage_line>=stage_lim)&&(up_count>0)&&(mon_all>1)){//第二個if
      int stage_minus=stage_line-1;stage_line=1;//讓他變1,並紀錄他減了多少
      int mon_minus=mon_all-1;mon_all=1;
      up_count--;mon_bas_pow+=stage_lim/2;
      System.out.println("路剩下"+stage_line+"條(減少"+stage_minus+"),怪物一回合剩出現"+mon_all+"隻(減少"+mon_minus+"),但是怪物的攻擊力是"+mon_bas_pow+"~"+(mon_bas_pow+max_pow)+"(最大最小各增加"+(stage_lim/2)+")");
      stage_lim+=1;
    }//第二個if結束
    if((bul_all>=bul_lim)&&(up_count>0)){//第三個if
      int bul_minus=bul_all-1;bul_all=1;add+=1;up_count--;
      System.out.println("現在槍手一回合剩"+bul_all+"發子彈(減少"+bul_minus+"),但是每次增加數量時增加"+add+"(增加1)");
      bul_lim*=3;
    }//第三個if結束
    if((mon_all>=mon_lim)&&(up_count>0)){//第四個if
      mon_all-=mon_lim/2;mon_bas_pow+=mon_lim/3;up_count--;
      if(mon_lim/3==0)System.out.println("怪物每回合剩出現"+mon_all+"隻(減少"+(mon_lim/2)+")");
      else System.out.println("怪物每回合剩出現"+mon_all+"隻(減少"+(mon_lim/2)+"),但是攻擊力是"+mon_bas_pow+"~"+(mon_bas_pow+max_pow)+"(最小最大各增加"+(mon_lim/3)+")");
      mon_lim+=1;
    }//第四個if結束
    if((bow_all>=bow_lim)&&(up_count>0)){//第五個if
      bow_all-=bow_lim/2;bow_bas_pow+=bow_lim/3;up_count--;
      if(bow_lim/3==0)System.out.println("你每回合剩得"+bow_all+"支箭(減少"+(bow_lim/2)+")");
      else System.out.println("你每回合剩得"+bow_all+"支箭(減少"+(bow_lim/2)+"),但是攻擊力是"+bow_bas_pow+"~"+(bow_bas_pow+max_pow+2)+"(最大最小各增加"+(bow_lim/3)+")");
      bow_lim+=1;
    }//第五個if結束
    if((castle>castle_lim)&&(up_count>0)){//第六個if
      int castle_minus=castle-1;castle=1;bow_bas_pow+=castle_lim/250;up_count--;
      System.out.println("你的城堡剩"+castle+"塊磚(減少"+castle_minus+"),但是箭的攻擊力是"+bow_bas_pow+"~"+(bow_bas_pow+max_pow+2)+"(最大最小各增加"+(castle_lim/250)+")");
      castle_lim+=500;
    }//第六個if結束
    if((gain>=gain_lim)&&(up_count>0)){//第七個if
      int gain_minus=gain-1;gain=1;up_value+=1;up_count--;
      if(gain_lim/5==0)System.out.println("以後打死怪物只得"+gain+"倍磚(減少"+gain_minus+")");
      else System.out.println("以後打死怪物只得"+gain+"倍磚(減少"+gain_minus+"),但是升級有"+up_value+"個改變(增加1)");
      gain_lim+=1;
    }//第七個if結束
    if((up_value>=up_lim)&&(up_count>0)){//第八個if
      int up_minus=up_value-1;up_value=1;mon_bas_pow+=2;up_count--;
      System.out.println("以後升級只會有"+up_value+"個變更(減少"+up_minus+"),但是怪物的攻擊力是"+mon_bas_pow+"~"+(mon_bas_pow+max_pow)+"(最大最小各增加2)");
      up_lim+=1;
    }//第八個if結束
  }//CutAll結束
  
static void ChoUp(){//升級的隨機選擇(主要)(Upgrade)
while(up_count>0){//因為會有0~N次,所以用while來作
    upgrade=(int)(Math.random()*8)+1;//有十個機率~
    /*本區使用一種格式:
    if((第幾種upgrade)){
      if((第幾個upgrade)){
      設定第幾個upgrade;升級}
      else continue;
    }*/
    if((upgrade>=1)&&(upgrade<=4)){//主要數量
      upgrade=(int)(Math.random()*9)+1;
      if((upgrade>=1)&&(upgrade<=4)&&(mon_all<mon_lim)&&(mon_all+add<=stage_line)){
      upgrade=1;OptionUp();}
      else if((upgrade>=5)&&(upgrade<=6)&&(bow_all<bow_lim)){
      upgrade=2;OptionUp();}
      else if((upgrade>=7)&&(upgrade<=8)&&(gun_all<gun_lim)){
      upgrade=3;OptionUp();}
      else if((upgrade==9)&&(gun_all>0)&&(bul_all<bul_lim)){
      upgrade=4;OptionUp();}
      else continue;//沒有就continue
    }//主要數量if結束
    else if((upgrade>=5)&&(upgrade<=6)){//副要數量
      upgrade=(int)(Math.random()*8)+1;
      if((upgrade>=1)&&(upgrade<=3)&&(stage_line<stage_lim)){
      upgrade=5;OptionUp();}
      else if((upgrade>=4)&&(upgrade<=6)&&(gain<gain_lim)){
      upgrade=6;OptionUp();}
      else if((upgrade==7)&&(up_value<up_lim)){
      upgrade=7;OptionUp();}
      else if((upgrade==8)&&(level%4==0)){//max_pow++
      upgrade=8;OptionUp();}
      else continue;//沒有就continue
    }//副要數量if結束
    else if((upgrade>=6)&&(upgrade<=7)){//補給站
      upgrade=(int)(Math.random()*4)+1;
           if((upgrade==1)&&(stage1_heal<3)&&(bul_all>10)){
      upgrade=9;OptionUp();}
      else if((upgrade==2)&&(stage2_heal<3)&&(gun_all>10)){
      upgrade=10;OptionUp();}
      else if((upgrade==3)&&(stage3_heal<3)&&(mon_all>10)){
      upgrade=11;OptionUp();}
      else if((upgrade==4)&&(stage4_heal<3)&&(bow_all>10)){
      upgrade=12;OptionUp();}
      else continue;//沒有就continue
    }//補給站if結束
    else if((upgrade==8)&&(stage>=5)){//其他
      upgrade=(int)(Math.random()*3)+1;
      if((upgrade==1)&&(bul_all>4)){
      upgrade=13;OptionUp();}
      else if((upgrade==2)&&(stage1_heal+stage2_heal+stage3_heal+stage4_heal>6)){
      upgrade=14;OptionUp();}
      else if(upgrade==3){
      upgrade=15;OptionUp();}
      else continue;
    }//其他if結束
    else continue;//沒有就continue
    up_count--;
    }//while結束
  }//ChoUp結束
  
static void OptionUp(){//升級選項(Upgrade-ChoUp)
    switch(upgrade){
    case 1:
      mon_all+=add;
      System.out.println("怪物每回合會出來"+mon_all+"隻(增加"+add+")");
    break;
    case 2:
      bow_all+=add;
      System.out.println("每回合會拿到"+bow_all+"支箭(增加"+add+")");
    break;
    case 3:
      gun_all+=add;
      System.out.println("有"+gun_all+"個槍手了(增加"+add+")");
    break;
    case 4:
      bul_all+=add;
      System.out.println("槍手一回合會射"+bul_all+"發子彈(增加"+add+")");
    break;
    case 5:
      stage_line++;
      System.out.println("路現在有"+stage_line+"條(增加1)");
    break;
    case 6:
      gain++;
      System.out.println("以後打死怪物得"+gain+"倍磚(增加1)");
    break;
    case 7:
      up_value++;
      System.out.println("以後升級有"+up_value+"個改變(增加1)");
    break;
    case 8:
      max_pow+=stage_line;
      System.out.println("所有的最大攻擊力增加"+stage_line+",現在的攻擊力:\n怪物: "+mon_bas_pow+"~"+(mon_bas_pow+max_pow)+",\n箭: "+bow_bas_pow+"~"+(bow_bas_pow+max_pow)+",\n子彈: "+bul_bas_pow+"~"+(bul_bas_pow+max_pow));
    break;
    case 9:
      stage1_heal++;
      System.out.println("現在怪物從預覽出來會加"+stage1_heal+"血量了喔!!!");
    break;
    case 10:
      stage2_heal++;
      System.out.println("現在怪物到第二行會加"+stage2_heal+"血量了喔!!!");
    break;
    case 11:
      stage3_heal++;
      System.out.println("現在怪物到第三行會加"+stage3_heal+"血量了喔!!!");
    break;
    case 12:
      stage4_heal++;
      System.out.println("現在怪物到第四行會加"+stage4_heal+"血量了喔!!!");
    break;
    case 13:
      preview_heal++;
      System.out.println("每回合開始預覽排怪物的攻擊力會增加"+preview_heal+",若無怪物則會自動生成");
    break;
    case 14:
      stage5_heal++;
      if(stage5_heal<0)System.out.println("現在怪物在第五排攻擊完後只會"+stage5_heal+"血量");
      else if(stage5_heal==0)System.out.println("現在怪物在第五排攻擊完後不會減血了");
      else if(stage5_heal>0)System.out.println("現在怪物在第五排攻擊完後會+"+stage5_heal+"血量");
    break;
    case 15:
      Monsummon();//生成怪物
      Forward();//前進
      Mon();//攻擊
      Heal();//補血(怪物)
      System.out.println("怪物前進了一排:");
      Land();//列印場地
    break;
    }//switch結束
  }//OptionUp結束
  
static void Bow(){//箭攻擊(Run)
    for(bow_num=bow_all;bow_num>0;bow_num--){//一支箭一支箭來
    Check();//查看是否有怪物在場上
    if(no_mon){System.out.print("\n場上沒有怪物了,將跳過其他的箭");break;}
    //如果有(沒有break)
    Land();//列印場地
    Shoots();//選擇射擊排數
    BowAtkCall();//攻擊
    }//一支箭一支箭來結束
  }//Bow結束
  
static void Land(){//列印場地(Bow)(Gun)(OptionUp-15)
    //列印行號
    for(print=1;print<=stage_line;print++)System.out.print(format.format(print)+"  ");
    System.out.println();
    
    for(print=0;print<stage_line;print++){//列印預覽排
      if(preview[print]==0){
      if(preview_heal!=0)System.out.print("... ");
      else System.out.print("    ");
      }
      
      else if(preview[print]<=9){
      if(preview_heal!=0)System.out.print(".."+preview[print]+" ");
      else System.out.print("  "+preview[print]+" ");
      }
      
      else if(preview[print]<=99){
      if(preview_heal!=0)System.out.print("."+preview[print]+" ");
      else System.out.print(" "+preview[print]+" ");
      }
      
      else System.out.print(preview[print]+" ");
    }//for結束
    System.out.println("\n");
    
    LandHealSta(stage1,stage1_heal);
    LandHealSta(stage2,stage2_heal);
    LandHealSta(stage3,stage3_heal);
    LandHealSta(stage4,stage4_heal);
    LandHealSta(stage5,stage5_heal);
    
    for(print=0;print<stage_line;print++){//列印牆壁
      switch(stage5_heal){
      case -3:
        System.out.print("^^^ ");
        break;
      case -2:
        if(castle>2000)System.out.print("^-^ ");
        else System.out.print("^ ^ ");
        break;
      case -1:
        if(castle>2000)System.out.print("-^- ");
        else if(castle>1000)System.out.print(" ^- ");
        else System.out.print(" ^  ");
        break;
      default:
        if(castle>2000)System.out.print("--- ");
        else if(castle>1000)System.out.print("- - ");
        else if(castle>500) System.out.print(" -  ");
        break;
      }//switch結束
    }//for結束
    System.out.println();
  }//Land結束
 
static void LandHealSta(int[] array,int heal){//讓Land相同的語法不要寫多次(Land)
    for(print=0;print<stage_line;print++){//列印第四排
    if(array[print]==0){//0
      switch(heal){
      case  3:System.out.print("+++ ");break;
      case  2:System.out.print("_++ ");break;
      case  1:System.out.print("__+ ");break;
      default:System.out.print("___ ");break;
        }//switch結束
    }//if 0 結束
    else if(array[print]<=9){//一位數
      switch(heal){
      case  3:System.out.print("++"+array[print]+" ");break;
      case  2:System.out.print("_+"+array[print]+" ");break;
      default:System.out.print("__"+array[print]+" ");break;
      }//switch結束
    }//if 1~9 結束
    else if(array[print]<=99){//二位數
      switch(heal){
      case  3:System.out.print("+"+array[print]+" ");break;
      default:System.out.print("_"+array[print]+" ");break;
      }//switch結束
    }//if 10~99 結束
    else System.out.print(array[print]+" ");//三位數
    }//for結束
    System.out.println();
  }//LandHealSta結束
  
static void Shoots(){//選擇射擊排數(Bow)
    bow_pow=(int)(Math.random()*(max_pow+3)+bow_bas_pow);//設定攻擊力
    System.out.print("你有一支攻擊力 "+bow_pow+" 的箭,");//輸出
    do{
    System.out.print("請問你要射哪一排?:");//問句,使用者預備輸入
    try{
    bow_pos=in.nextInt();//使用者輸入
    }
    catch(java.util.InputMismatchException ex){//輸入不能轉為int的例外
    System.out.print("====================輸入非整數,遊戲結束!!!====================");
    System.exit(0);//離開
    }//catch結束
    if((bow_pos<1)||(bow_pos>stage_line)){//輸出不正確
    System.out.print("沒有這一排,");
    continue;//回到System.out.print("請問你要射哪一排?:");//問句,使用者預備輸入
    }
    else break;
    }while(true);//如果正確執行完(或發生例外),就退出迴圈(發生例外會結束程式)
    bow_pos--;//符合陣列索引值
  }//Shoots結束
  
static void BowAtkCall(){//攻擊(Bow)
    //同樣的方法5次,就寫在一起
    BowAtk(stage5);
    BowAtk(stage4);
    BowAtk(stage3);
    BowAtk(stage2);
    BowAtk(stage1);
  }//BowAtkcall結束
  
static void BowAtk(int[] array){//讓BowAtkCall相同的語法不要寫多次(Bow-BowAtkCall)
    //計算方式:如果有怪物,攻擊,死了的話(<=0),設成0(讓Land輸出預設值)
    
    if((array[bow_pos]!=0)&&(bow_pow>0)){//有怪物跟攻擊力嗎?
    array[bow_pos]-=bow_pow;bow_pow=-array[bow_pos];//攻擊!!把剩餘的攻擊力取回來
    
    if(array[bow_pos]<=0){//死了?
    array[bow_pos]=0;//設成0
      if(gain>0){//如果會回血(磚塊)
      castle+=gain;
      System.out.println("你殺死了怪物,得到"+gain+"塊磚,目前有"+castle+"塊磚");
      }//如果會回血(磚塊)結束
    }//死了?結束
    }//有怪物跟攻擊力嗎?結束
  }//BowAtk結束
  
static void Check(){//檢查場上是否無怪物存在(Bow)(Gun)
    no_mon=true;
    for(check=0;check<stage_line;check++){//一行一行檢查
    //如果有怪物,就把no_mon設成false,然後就不用再檢查了
    if(stage1[check]!=0){no_mon=false;break;}
    if(stage2[check]!=0){no_mon=false;break;}
    if(stage3[check]!=0){no_mon=false;break;}
    if(stage4[check]!=0){no_mon=false;break;}
    if(stage5[check]!=0){no_mon=false;break;}
    }//for結束
  }//Check結束  
  
static void Gun(){//槍手攻擊(Run)
    //選擇輸出(需不需要使用者確認)
    if(enter){
    System.out.println("輪到槍手射擊\t\t\t[enter]");
    stops=stop.readPassword();
    }
    else System.out.println("輪到槍手射擊\n");
    
    for(gun_num=1;gun_num<=gun_all;gun_num++){//槍手個數
    //檢查有沒有怪物
    Check();if(no_mon){System.out.println("場上沒有怪物了,將跳過其他槍手");break;}
    //如果有(沒有break)
    if(gun_num!=1)Land();
    System.out.println("第"+gun_num+"隻槍手開始射擊");
    
    for(bul_num=1;bul_num<=bul_all;bul_num++){//子彈個數
    //檢查有沒有怪物(因為在裡面打完後可能沒怪物)
    Check();if(no_mon){System.out.println("場上沒有怪物了,將跳過其他子彈");break;}
    //如果有(沒有break)
    gun_arr=(int)(Math.random()*5)+1;//設定行數
    gun_row=(int)(Math.random()*stage_line);//設定排數
    bul_pow=(int)(Math.random()*(max_pow+1))+bul_bas_pow;//設定攻擊力
    System.out.print("第"+bul_num+"個子彈射在第"+format.format(gun_row+1)+"排的第"+gun_arr+"行,攻擊力是"+bul_pow+",");
    GunAtkCall();
    }//子彈for結束
    }//槍手for結束
  }//Gun結束
  
static void GunAtkCall(){//槍手攻擊呼叫(Gun)
    switch(gun_arr){//看是第幾排
    case 1:GunAtk(stage1);break;
    case 2:GunAtk(stage2);break;
    case 3:GunAtk(stage3);break;
    case 4:GunAtk(stage4);break;
    case 5:GunAtk(stage5);break;
    }//switch結束
  }//GunAtkCall結束
  
static void GunAtk(int[] array){//讓GunAtkCall相同的語法不要寫多次(Gun-GunAtkCall)
    if(array[gun_row]!=0){//如果打的位置有怪物
      array[gun_row]-=bul_pow;//射擊
      if(array[gun_row]<0)array[gun_row]=0;//調整
      
      if(array[gun_row]!=0)System.out.println("怪物剩下"+array[gun_row]+"血量");//還沒死
      else if(gain>0){//如果沒有沒死,且會得磚塊
        castle+=gain;//加磚塊
        System.out.println("怪物死了,城堡目前有"+castle+"塊磚");
      }
      else System.out.println("怪物死了");//如果沒得磚塊
    }  
    else System.out.println("沒打中任何人");//如果打的位置沒怪物
  }//GunAtk結束
  
static void Mon(){//怪物攻擊(Run)(OptionUp-15)
    for(attack=0;attack<stage_line;attack++){
    if(stage5[attack]!=0){//有怪物要攻擊嗎?
    castle-=stage5[attack];//怪物攻擊
    stage5[attack]+=stage5_heal;//減/加怪物血量
    if(stage5[attack]<0)stage5[attack]=0;//歸零
    
    System.out.println("你的城堡被攻擊了,還有"+castle+"塊磚");
    if(castle<=0)break;//check if lose
    }//if結束
    }//for結束
  }//Mon結束
  
static void Heal(){//補給(Run)(OptionUp-15)
    for(copy=0;copy<stage_line;copy++){//一行一行來
    if(stage2[copy]!=0)stage2[copy]+=stage2_heal;
    if(stage3[copy]!=0)stage3[copy]+=stage3_heal;
    if(stage4[copy]!=0)stage4[copy]+=stage4_heal;
    }
  }//Heal結束
  
static void NextRound(){//下一回合(Run)
    System.out.println("\n\n===============下一回合===============\n");
    cd_count--;
    if(cd_count>0)System.out.println("離下次升級還有"+cd_count+"回合");
  }//NextRound結束
  
static void Lose(){//輸了(Run)
    int restart=0;
    System.out.println("\n\n不~!~!~!~!你被怪獸入侵了!!");
    System.out.print("你還想再玩一次嗎?想再玩一次,請輸入1,結束遊戲請按其他鍵,請輸入:");
    try{restart=in.nextInt();}
    catch(java.util.InputMismatchException ex){}
    if(restart==1)Start();
  }//Lose結束
 
}//class結束

做了兩個禮拜,終於把它做出來了(無bug,注解完畢,大部分時間在註解及增加功能)
這是我第一次用try/catch,這是我第一次程式寫那麼長(原本還有800+...),以及我第一次是用多方法及引入值,希望看過大大能多多少少給點意見
最高紀錄:1030+(1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 ........................這樣刷出來的,我哪有時間玩那麼久阿)


haur576 edited on 2013-12-25 19:35
reply to postreply to post

作者 Re:怪物大進擊!! [Re:haur576]
bluewingsky





發文: 409
積分: 0
於 2013-12-25 22:03 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不錯的練習,建議盡量往物件導向發展,
在程式碼的閱讀上會比較清楚明瞭,
日後想維護或修改的時候,才比較好找到。

例如,你的遊戲畫面(System.out.println())遍布,到處都是,
如果以後想改這個畫面的顯示方式,
又或者可能是修改怪物或是角色的屬性之類的,
你可能就要東找西找的。

我以前也像你這樣寫程式,
寫完後我發現我一點也不想回頭去看,看的很辛苦,
尤其是時間一久,我都不知道我寫了什麼。
程式碼越大,也就越難維護。


reply to postreply to post
作者 Re:怪物大進擊!! [Re:bluewingsky]
haur576





發文: 271
積分: 1
於 2013-12-25 22:33 user profilesend a private message to usersend email to haur576reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
嗯,的確要東找西找的,不過用方法也幫了我很大的忙,不然可能要下下禮拜(兩倍的時間)才會寫好...
bluewingsky大大的提醒,我會好好記住的Blush


reply to postreply to post

作者 Re:怪物大進擊!! [Re:haur576]
haur576





發文: 271
積分: 1
於 2014-01-10 17:52 user profilesend a private message to usersend email to haur576reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
最近新寫的一個遊戲,不怎麼想開發它,因為還在做怪物大進擊的第二版,註解不是很多,就給大家看吧,需要的話我會再補上註解的。
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
/*變數簡介:
mon:怪物
sol:士兵
stage:場地
row/arr:列,行,位置資訊
int:總數(給count存取,你可以修改它的值)
count:遞減數(跑幾次)
變數的名字可混搭,像是:
sol_int=士兵的總數
*/
import java.util.Scanner;
public class Clear{
static int mon_row,mon_arr,mon_num;
static int sol_row,sol_arr,sol_num;
static int mon_int=3,mon_count,sol_int=1,sol_count;//你可以更改他們的大小
static int score,gain;//總分,得分暫存
final static int stage_rows=3,stage_arrs=3;//你可以更改他們的大小來改變場地大小
static int max_num=3;//最大編號,你可以更改他的值,建議不要超過9
static int[][] mon_stage=new int[stage_rows][stage_arrs];//怪物場地
static int[][] sol_stage=new int[stage_rows][stage_arrs];//
static int[][] stage=new int [stage_rows][stage_arrs];
static Scanner input=new Scanner(System.in);
public static void main(String[] args){
    Start();
  }
static void Help(){
    System.out.println("===============幫助===============");
    System.out.println("1.回合在怪物場地會產生"+mon_int+"隻怪物");
    System.out.println("2.你每回合須放置"+sol_int+"隻士兵");
    System.out.println("3.你可以將與怪物同樣編號的士兵放在同一個位置來消滅怪物,清空場地。");
    System.out.println("4.同個位置的士兵跟怪物如果編號相同,周圍(十字)的怪物與士兵就會消失,變成分數。");
    System.out.println("5.當怪物場地或士兵場地其中一個滿了,你就輸了");
  }
static void Start(){
    Help();
    for(;;){
    MonSummon();
    Attack();
    Print();
    SolSummon();
    }
  }
static boolean NoSpace(int[][] arr2D){
    boolean no_space=true;
    for(int[] arr1D:arr2D){
      for(int var:arr1D){
      if(var==0){no_space=false;break;}
      }
      if(!no_space){break;}
    }
    
    return no_space;
  }
static void MonSummon(){
    for(mon_count=mon_int;mon_count>0;mon_count--){
    if(NoSpace(mon_stage))Lose("M");
    do{
    mon_row=(int)(Math.random()*(mon_stage.length));//設定列
    mon_arr=(int)(Math.random()*(mon_stage[0].length));//設定排
    mon_num=(int)(Math.random()*max_num+1);//設定編號
    }while(mon_stage[mon_row][mon_arr]!=0);
    mon_stage[mon_row][mon_arr]=mon_num;
    }
  }
static void Print(){
    int print=0;
    System.out.print("   ");
    while(print<stage[0].length){
    if(print>=9)System.out.print((++print));//因為9以上時,print會變二位數(9會變10)
    else System.out.print((++print)+" ");
    }
    System.out.println("\n");
    print=0;
    for(int[] arr1D:mon_stage){
      if(print>=9)System.out.print(++print+" ");//因為9以上時,print會變二位數(9會變10)
      else System.out.print((++print)+"  ");
      for(int var:arr1D){
        if(var==0)System.out.print("_ ");
        else System.out.print(var+" ");
      }
      System.out.println();
    }
    System.out.println();
    
    print=0;
    for(int[] arr1D:sol_stage){
      if(print>=9)System.out.print(++print+" ");
      else System.out.print((++print)+"  ");
      for(int var:arr1D){
        if(var==0)System.out.print("_ ");
        else System.out.print(var+" ");
      }
      System.out.println();
    }
    System.out.println();
    
    
  }
static void SolSummon(){
    for(sol_count=sol_int;sol_count>0;sol_count--){
      if(NoSpace(sol_stage))Lose("S");
      sol_num=(int)(Math.random()*max_num+1);//設定編號
      System.out.println("這隻士兵是"+sol_num+"號。\n");
    all:
      do{
      
      row:
        while(true){
          System.out.print("請問你要把你的士兵擺在哪一列(對齊左邊數字)?");
          try{sol_row=input.nextInt();}//設定列
          catch(java.util.InputMismatchException ex){//輸入不能轉為int的例外
          System.out.print("====================輸入非整數,遊戲結束!!!====================");
          System.exit(0);//離開
          }//catch結束
          
          if((sol_row<1)||(sol_row>stage.length)){System.out.println("沒有這一列,請重新選擇。");continue;}
          else break;
        }
        
      arr:
        while(true){
          System.out.print("請問你要把你的士兵擺在哪一排(對齊上面數字)?");
          try{sol_arr=input.nextInt();}//設定排
          catch(java.util.InputMismatchException ex){//輸入不能轉為int的例外
          System.out.print("====================輸入非整數,遊戲結束!!!====================");
          System.exit(0);//離開
          }//catch結束
          
          if((sol_arr<1)||(sol_arr>stage[0].length)){System.out.println("沒有這一排,請重新選擇。");continue;}
          else break;
        }
        
        if(sol_stage[sol_row-1][sol_arr-1]!=0){
        System.out.println("對不起,此位置已有士兵,請重新選擇位置。\n");
        }
      else break;}while(true);
      
      sol_stage[sol_row-1][sol_arr-1]=sol_num;
      Attack();
    }
  }
static void Attack(){
    gain=0;
    for(int row=0;row<stage.length;row++){
      for(int arr=0;arr<stage[row].length;arr++){
        if((mon_stage[row][arr]==sol_stage[row][arr])&&(mon_stage[row][arr]!=0)){
        
        //中間消除
        gain+=mon_stage[row][arr]+sol_stage[row][arr];
        mon_stage[row][arr]=sol_stage[row][arr]=0;
        //右邊消除
        if(arr+1<stage.length-1){
        gain+=mon_stage[row][arr+1]+sol_stage[row][arr+1];
        mon_stage[row][arr+1]=sol_stage[row][arr+1]=0;
        }
        //左邊消除
        if(arr-1>=0){
        gain+=mon_stage[row][arr-1]+sol_stage[row][arr-1];
        mon_stage[row][arr-1]=sol_stage[row][arr-1]=0;
        }
        //下面消除
        if(row+1<stage.length-1){
        gain+=mon_stage[row+1][arr]+sol_stage[row+1][arr];
        mon_stage[row+1][arr]=sol_stage[row+1][arr]=0;
        }
        //上面消除
        if(row-1>=0){
        gain+=mon_stage[row-1][arr]+sol_stage[row-1][arr];
        mon_stage[row-1][arr]=sol_stage[row-1][arr]=0;
        }
        
        System.out.println("你殺死了怪物,得到"+gain+"分,目前有"+(score+=gain)+"分。");
        }//if結束
      }//for arr結束
    }//for row結束
  }//Attack結束
static void Lose(String m){
    if(m.equals("M"))m="怪物場地已滿";
    if(m.equals("S"))m="士兵場地已滿";
    System.out.println("因為"+m+",你輸了!!你的得分是:"+score+"分。");
    System.exit(0);
  }
}//CLASS Clear結束


reply to postreply to post

作者 Re:怪物大進擊!! [Re:haur576]
javaX





發文: 188
積分: 0
於 2014-01-10 18:51 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我玩過了可以加個畫面嗎?

reply to postreply to post
教育部:要如何保證畢業即就業
經濟部:所以公司都是我開的
財政部:發前單位請不要幻想能春風化雨
行政院:為什麼該單位發錢的時候都想去當老師
作者 Re:怪物大進擊!! [Re:javaX]
haur576





發文: 271
積分: 1
於 2014-01-10 19:54 user profilesend a private message to usersend email to haur576reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
嗯...沒有這個想法耶...不然這個版權交給你,你來做?Tongue
(反正我也只是作來玩玩的Big Smile)


reply to postreply to post

作者 Re:怪物大進擊!! [Re:haur576]
javaX





發文: 188
積分: 0
於 2014-01-10 20:17 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我對SWING不熟 你找優西吧

reply to postreply to post
教育部:要如何保證畢業即就業
經濟部:所以公司都是我開的
財政部:發前單位請不要幻想能春風化雨
行政院:為什麼該單位發錢的時候都想去當老師
作者 Re:怪物大進擊!! [Re:javaX]
haur576





發文: 271
積分: 1
於 2014-01-10 20:27 user profilesend a private message to usersend email to haur576reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
優西??版主嗎?

reply to postreply to post

作者 Re:怪物大進擊!! [Re:haur576]
javaX





發文: 188
積分: 0
於 2014-01-10 20:42 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我主要意思是找個會SWING的不過畢竟你是設計者畫面呈現要如何你比較清楚

reply to postreply to post
教育部:要如何保證畢業即就業
經濟部:所以公司都是我開的
財政部:發前單位請不要幻想能春風化雨
行政院:為什麼該單位發錢的時候都想去當老師
作者 Re:怪物大進擊!! [Re:haur576]
030251888





發文: 140
積分: 0
於 2014-01-10 21:23 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
其實你可以藉這個機會 學習個Swing阿~

reply to postreply to post
努力尚未成功,松鼠扔須努力
作者 Re:怪物大進擊!! [Re:javaX]
haur576





發文: 271
積分: 1
於 2014-01-10 21:35 user profilesend a private message to usersend email to haur576reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
也是,但我覺得這個程式改起來會不會很複雜阿?如果能改起來的話,那就不需要一直用輸入的了,等以後心血來潮的時候再來吧(Tomcat不能用啦Sad所以只好來寫這個Big Smile)

reply to postreply to post

作者 Re:怪物大進擊!! [Re:030251888]
haur576





發文: 271
積分: 1
於 2014-01-10 21:40 user profilesend a private message to usersend email to haur576reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
可是...可是...我只是要維護網頁系統而已阿??我應該不會要去寫JPanel的東西耶,畢竟我只是要管理資料庫,又沒有要開發程式給人家用(如果說程式的話,提供一個網頁應該也算程式吧?報名,查詢...等等[而已?])

(這些好像都不是理由,我還有一個程式沒做完啦!!)


reply to postreply to post

» JWorld@TW »  Java 程式分享區 » Game

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8