Java团队项目总结
Java团队项目总结
1.项目实现情况
-
项目概述:
我们团队项目准备实现一个有关于大富翁有的游戏程序。
大富翁游戏,以经营权为主要的游戏方式,通过购买经营权与架构经营的星级服务来获得最大的利益,当其他玩家破产后,最后一个玩家取得胜利来结束游戏。在百度词条上示意为,默认多幅地图,以掷骰点数前进,并有多种道具、卡片使用,另外触发一些“特别事件”。主要通过购买房产,收取对方的路费、租金来导致对手的破产。
-
项目预期:
鉴于对java学习的程度和掌握内容,基本实现大富翁的游戏内容我们的项目打算实现以下目标。
-
按照计划,首先需要列出我们要实现的特殊卡牌功能
card
,其中有BarricadeCard
、BlackCard
、DemolitionCard
、EqualizedWealthCard
、FortuneGodCard
、LandCard
、LotteryCard
、MonsterCard
、PlunderCard
、PurchaseCard
、RedCard
、RemoteDiceCard
、RetentionCard
、TaxInspectionCard
、TortoiseCard
TurnCard
、WealthGodCard
同时需要一个CardSystem
用来管理所有设计的Card
类。 -
其次设计大富翁游戏里的杂项功能,比如角色的数量,时间等,就需要一下class文件
Date
、Entrance
、MenuPrint
、Player
、Stock
等,比如Date
就用来实现大富翁游戏中日期的计数,Entrance
实现整个大富翁游戏的入口,MenuPrint
就用来实现游戏中每一步之后显示的菜单选项,Player
就用来实现游戏的参与游戏的数量,Stock
用来返回各项菜单。 -
最后需要设计大富翁游戏的重要的场景,例如医院、彩票站等。
Bank
、Blank
、CardGet
、CardShop
、Hospita
、Hous
、Land
、Landindex
、LottteryStation
、News
、Park
、Piont
、PoliceStation
-
-
项目结果(总项目列表):
-
Card类:
-
PJ类:
-
Place类:
-
2.项目测试
-
项目分析:
因为所要完成总任务的大项都是由小项合并起来完成的。以下举出几个例子。
-
LotteryStation(彩票站):
-
程序代码:
package place; import java.util.Scanner; import PJ.Entrance; import PJ.Player; public class LotteryStation extends Land { LotteryStation(int x, int y,String name) { this.i = x; this.j = y; this.name=name; } @Override public char getchart() { return '彩'; // TODO Auto-generated method stub } public void printInformation(int step) { System.out.println("这里是彩票站~~"); // TODO Auto-generated method stub } @Override public void printaction(int step,int namei){ Player player=new Player(); for(int i=0;i<Entrance.players.size();i++){ if(Entrance.players.get(i).getNamei()==namei){ player=Entrance.players.get(i); } } System.out.println("这里是彩票站,选购彩票将花费您1000元,"+"\n"+"是请输入y,不是请输入n"); Scanner input=new Scanner(System.in); String answer=input.next(); while(true){ if(answer.equals("y")){ if(player.getCash()>=1000){ int i=(int)(Math.random()*5+1); if(i==3){ System.out.println("恭喜您中奖了!获得奖励5000元"); player.setCash(player.getCash()+4000); }else{ System.out.println("很遗憾,您差点中奖,继续购买请输入y,离开请输入n"); player.setCash(player.getCash()-1000); answer=input.next(); } }else{ System.out.println("您的现金不足,彩票不支持刷卡"); break; } }else if(answer.equals("n")){ System.out.println("真是遗憾,下次再来碰碰运气吧"); break; }else{ System.out.println("不好意思,是不是输入错误了啊!"); answer=input.next(); } } } public char getinitialchart() { return '彩'; // TODO Auto-generated method stub }
-
代码分析:
首先关于彩票站是属于
Place
里的一项,为了实现游戏中玩家使相互对方破产的功能。其次代码在编写的时不仅需要
import java.util.Scanner;
用来输入数据,还需要和杂项文件PJ
中的Entrance
和Player
的数据联系起来。使用import PJ.Entrance;
和import PJ.Player;
。再次在这个彩票站的主函数中需要继承Land函数,
Land
函数是整个游戏地图的总揽,当前进到彩票站的环节,就需要继承Land
。注意,因为继承了父类,所以在子类编写的时候加上
@Overrid
编译器会验证下面的方法是否是父类中所有的,如果没有则报错。这样会方便代码的书写和编译。彩票站的主要功能是购买彩票,验证是否中奖,或者选择离开等功能。我们在这里的金额计算采用差额计算法,即第一次购买彩票和之后的结果进行计算,比如购买彩票需要1000,中奖5000,在中奖下面用代码
player.getCash()+4000
来表示,将奖金中的一部分金额用来计算为购买彩票的金额。在编译的时候就要注意到在彩票站会有很多中情况,例如购买彩票的中奖与不中奖、选择继续还是不继续购买彩票、在购买的时候金额会不会足够、在输入时候格式会不会有问题,需要注意很多的细节问题。
-
代码测试结果:
-
显示出输入错误信息,未中奖信息,中奖信息等。
-
-
Player:
-
程序代码:
1 package PJ; 2 3 import java.util.ArrayList; 4 import java.util.Scanner; 5 6 import place.Landindex; 7 import card.CardSystem; 8 9 public class Player { 10 private double deposit ; 11 private double cash; 12 private int Point; 13 private int housequantity; 14 private int step; 15 private double houseValue; 16 private int direction =1; 17 private int location=(int)(Math.random()*67+1); 18 private String name ; 19 private int namei; 20 private String direct ; 21 private int special=0;//=0时正常,=1-6时使用了遥控骰子,=7时处于滞留卡状态,=8时处于乌龟卡状态,=9-16时处于福神保佑状态,=17-24时处于财神保佑状态 22 private int[] cards=new int[17]; 23 private int[] stocks=new int[10]; 24 Player(double deposit,double cash,int point,int housequantity,int housevalue,int direction,String name,int namei,int special){ 25 this.deposit=deposit; 26 this.cash=cash; 27 this.Point=point; 28 this.housequantity=housequantity; 29 this.houseValue=housevalue; 30 this.direction=direction; 31 this.name=name; 32 this.special=special; 33 this.namei=namei; 34 for(int i=0;i<=16;i++){ 35 cards[i]=1; 36 } 37 } 38 public Player() { 39 // TODO Auto-generated constructor stub 40 } 41 public void move(){ 42 if (deposit + cash > 0){ 43 if(direction==1){ 44 direct="顺时针"; 45 }else{ 46 direct="逆时针"; 47 } 48 System.out.println("现在是玩家"+name+"的回合,您的前进方向是"+direct+"。"); 49 if(Date.day==1){ 50 System.out.println("又到了月初,您的存款已在月末获得了10%的利息"); 51 this.deposit=deposit*1.1; 52 } 53 System.out.println("您现在可以进行如下操作:"); 54 MenuPrint.print1(); 55 Scanner input = new Scanner(System.in); 56 int digitalInput = input.nextInt(); 57 while (true) { 58 if (digitalInput >= 0 && digitalInput <= 8) 59 break; 60 else { 61 System.out.print("invalid input, please enter again :"); 62 digitalInput = input.nextInt(); 63 } 64 } 65 while (digitalInput != 6 && digitalInput != 7) { 66 switch (digitalInput) { 67 case 0: 68 MenuPrint.printmap(); 69 System.out.println("还有什么要看的"); 70 MenuPrint.print1(); 71 digitalInput = input.nextInt(); 72 break; 73 case 1: 74 MenuPrint.printinitialmap(); 75 System.out.println("还有什么要看的"); 76 MenuPrint.print1(); 77 digitalInput = input.nextInt(); 78 break; 79 case 2: 80 System.out.println("名称"+"\t\t\t\t"+"功能"+"\t\t"+"类型"+"\t\t"+"价格"+"\t\t"+"适用范围"+"\t\t"+"剩余数量"); 81 for(int i=0;i<=16;i++){ 82 System.out.println(i+":"+CardSystem.cardsystem[i].getName()+"\t\t"+CardSystem.cardsystem[i].getFunction()+"\t\t"+CardSystem.cardsystem[i].getType()+"\t\t"+CardSystem.cardsystem[i].getPoint()+"\t\t"+CardSystem.cardsystem[i].getRange()+"\t\t"+cards[i]); 83 } 84 System.out.println("请选择"); 85 Scanner in=new Scanner(System.in); 86 int inner=in.nextInt(); 87 if(cards[inner]==0){ 88 System.out.println("此卡数量不足"); 89 }else{ 90 CardSystem.cardsystem[inner].print(location, namei); 91 cards[inner]--; 92 } 93 System.out.println("还有什么要看的"); 94 MenuPrint.print1(); 95 digitalInput = input.nextInt(); 96 break; 97 case 3: 98 boolean luzhang=false; 99 for (int i = 1; i <= 10; i++) { 100 if (Landindex.mark[location+i].state == false) { 101 System.out.println("前方第" + i + "步处有路障,小心哦,还有什么要看的"); 102 luzhang=true; 103 } 104 } 105 if(!luzhang){ 106 System.out.println("没有情况;还有什么要看的"); 107 } 108 MenuPrint.print1(); 109 digitalInput = input.nextInt(); 110 break; 111 case 4: 112 System.out.print("请输入您想查询的地方与您相差的步数<后方用负数,按q退出>:"); 113 String Input = input.next(); 114 if (Input.equals("q")) { 115 System.out.println("还有其它想看的么,请输入 :"); 116 MenuPrint.print1(); 117 digitalInput = input.nextInt(); 118 break; 119 } else { 120 int i = Integer.parseInt(Input); 121 Landindex.mark[(location+i)%68].printInformation((location+i)%68); 122 System.out.println("还有其它想的么,请输入 :"); 123 MenuPrint.print1(); 124 digitalInput = input.nextInt(); 125 break; 126 } 127 case 5: 128 System.out.println("玩家"+"\t"+"现金 "+"\t"+"存款 "+"\t"+"房产数"+"\t"+"房产价值"+"\t"+"点券数"); 129 for(int i=0;i<Entrance.players.size();i++){ 130 System.out.println(Entrance.players.get(i).getName()+"\t"+Entrance.players.get(i).getCash()+"\t"+Entrance.players.get(i).getDeposit()+"\t"+Entrance.players.get(i).getHousequantity()+"\t"+Entrance.players.get(i).getHouseValue()+"\t"+Entrance.players.get(i).getPoint()); 131 } 132 System.out.println("还有其它想的么,请输入 :"); 133 MenuPrint.print1(); 134 digitalInput = input.nextInt(); 135 break; 136 case 8: 137 System.out.println("欢迎进入大富翁股市~~"); 138 MenuPrint.printstock(namei); 139 String[] stockinput; 140 String choose; 141 int num; 142 int amount; 143 System.out.println("买股票请输入b*序号*数量,卖股票请输入s*序号*数量,退出请输入q"); 144 String stockin=input.next(); 145 if(stockin.equals("q")){ 146 System.out.println("还有其它想的么,请输入 :"); 147 MenuPrint.print1(); 148 digitalInput = input.nextInt(); 149 break; 150 }else{ 151 stockinput=stockin.split("[*]"); 152 choose=stockinput[0]; 153 num=Integer.parseInt(stockinput[1]); 154 amount=Integer.parseInt(stockinput[2]); 155 while(true){ 156 if(choose.equals("b")){ 157 double allprice=Stock.stocksystem[num-1].getPrice()*amount; 158 double all=deposit+cash; 159 if(all>=allprice){ 160 if(deposit>=allprice){ 161 deposit-=allprice; 162 }else{ 163 cash-=(allprice-deposit); 164 deposit=0; 165 } 166 stocks[num-1]+=amount; 167 Stock.stocksystem[num-1].setHold(Stock.stocksystem[num-1].getHold()+amount); 168 System.out.println("购买成功!"); 169 break; 170 }else{ 171 System.out.println("购买失败,您的金钱不足"); 172 break; 173 } 174 }else if(choose.equals("s")){ 175 //System.out.println("您当前持有量为"+stocks[num-1]+"您要卖出"+amount); 176 if(stocks[num-1]>=amount){ 177 double allprice=Stock.stocksystem[num-1].getPrice()*amount; 178 stocks[num-1]-=amount; 179 deposit+=allprice; 180 Stock.stocksystem[num-1].setHold(Stock.stocksystem[num-1].getHold()-amount); 181 System.out.println("抛售成功!"); 182 break; 183 }else{ 184 System.out.println("抛售失败,您的持有量不足"); 185 break; 186 } 187 }else{ 188 System.out.print("invalid input, please enter again :"); 189 stockin=input.next(); 190 } 191 } 192 System.out.println("还有其它想的么,请输入 :"); 193 MenuPrint.print1(); 194 digitalInput = input.nextInt(); 195 break; 196 } 197 } 198 } 199 if (digitalInput == 6) { 200 int actualStep = (int)(Math.random()*6+1); 201 //System.out.println("前面"+actualStep); 202 //当使用滞留卡时 203 if(special==7){ 204 actualStep=0; 205 special=0; 206 //使用遥控骰子时 207 }else if(special>0&&special<=6){ 208 actualStep=special; 209 special=0; 210 } 211 //遇到路障时 212 for(int i= 1; i < actualStep; i++){ 213 if (Landindex.mark[(location+i* direction)%68].state == false) { 214 System.out.println("前面第" + i + "步遇到了路障,过不去了"); 215 actualStep = i; 216 Landindex.mark[(location+i* direction)%68].state=true; 217 location=(location+i* direction)%68; 218 break; 219 } 220 } 221 //当经过银行时 222 for (int j = 1; j < actualStep; j++) { 223 if (Landindex.mark[(location+j* direction)%68] instanceof place.Bank) { 224 Landindex.mark[(location+j* direction)%68].printaction((location+j* direction)%68, namei); 225 break; 226 } 227 } 228 location=(location+actualStep*direction)%68; 229 // System.out.println("后面"+actualStep); 230 Landindex.mark[location].printaction(location, namei); 231 } 232 if (digitalInput == 7) { 233 System.out.println("祝您下次游戏愉快~~"); 234 for(int i=0;i<Entrance.players.size();i++){ 235 if(Entrance.players.get(i).getNamei()==namei){ 236 Entrance.players.remove(i); 237 } 238 } 239 for(int m=0;m<=67;m++){ 240 if(Landindex.mark[m].owner==namei){ 241 Landindex.mark[m].owner=0; 242 } 243 } 244 if(Entrance.players.size()==1){ 245 System.out.println("胜利的玩家是:"+Entrance.players.get(0).getName()); 246 System.exit(0); 247 } 248 } 249 }else{ 250 System.out.println("真抱歉,您破产了!下次加油吧!"); 251 for(int i=0;i<Entrance.players.size();i++){ 252 if(Entrance.players.get(i).getNamei()==namei){ 253 Entrance.players.remove(i); 254 } 255 } 256 } 257 } 258 public double getDeposit() { 259 return deposit; 260 } 261 public void setDeposit(double deposit) { 262 this.deposit = deposit; 263 } 264 public double getCash() { 265 return cash; 266 } 267 public void setCash(double cash) { 268 this.cash = cash; 269 } 270 public int getPoint() { 271 return Point; 272 } 273 public void setPoint(int point) { 274 Point = point; 275 } 276 public int getHousequantity() { 277 return housequantity; 278 } 279 public void setHousequantity(int housequantity) { 280 this.housequantity = housequantity; 281 } 282 public int getStep() { 283 return step; 284 } 285 public void setStep(int step) { 286 this.step = step; 287 } 288 public double getHouseValue() { 289 return houseValue; 290 } 291 public void setHouseValue(double d) { 292 this.houseValue = d; 293 } 294 public int getDirection() { 295 return direction; 296 } 297 public void setDirection(int direction) { 298 this.direction = direction; 299 } 300 public int getLocation() { 301 return location; 302 } 303 public void setLocation(int location) { 304 this.location = location; 305 } 306 public String getName() { 307 return name; 308 } 309 public void setName(String name) { 310 this.name = name; 311 } 312 public int getNamei() { 313 return namei; 314 } 315 public void setNamei(int namei) { 316 this.namei = namei; 317 } 318 public int getSpecial() { 319 return special; 320 } 321 public void setSpecial(int special) { 322 this.special = special; 323 } 324 public int[] getCards() { 325 return cards; 326 } 327 public void setCards(int[] cards) { 328 cards = cards; 329 } 330 public int[] getStocks() { 331 return stocks; 332 } 333 public void setStocks(int[] stocks) { 334 this.stocks = stocks; 335 } 336 }
-
代码分析:
之前提到的
Playe
r函数,并没有用来作为玩家的初始数据设置。根据游戏性质,玩家在每到一个地方的时候就会发生金钱或者其他数据的变化,不论发生在哪一个场景,发生变化的数据总是这么几个数据,所以就将其列入Player
函数中。在每遇到不同的信息的时候就直接调用,比如在Player
函数中定义的金钱变化的函数private double cash;
this.cash=cash;
等,当遇到金钱的变化时候直接调用函数就可以记录。
-
-
Hospital:
-
程序代码:
1 package place; 2 public class Hospital extends Land{ 3 Hospital(int x, int y,String name) { 4 this.i = x; 5 this.j = y; 6 this.name=name; 7 } 8 9 @Override 10 public char getchart() { 11 // TODO Auto-generated method stub 12 return '医'; 13 } 14 public char getinitialchart() { 15 return '医'; 16 // TODO Auto-generated method stub 17 } 18 public void printInformation(int step){ 19 System.out.println("这里是医院~~"); 20 } 21 @Override 22 public void printaction(int step,int namei){ 23 System.out.println("这里是医院~~"); 24 } 25 }
-
代码分析:
因为在大富翁游戏中存在一些没有没有任何功能的地方,只是简单的等待或者显示什么都不会发生等。比如
Hospital
、PoliceStation
、Land
等,这一类的只需要在继承父类时候加上@Overrid
检查与父类中相同段代码是否相同,方便日后的代码的维护与编译。
-
-
Entrance:
-
程序代码:
1 package PJ; 2 3 import java.util.ArrayList; 4 import java.util.Scanner; 5 6 public class Entrance { 7 public static int playernumber=0; 8 public static ArrayList<Player> players=new ArrayList<Player>(); 9 public static void main(String[] args) throws InterruptedException { 10 System.out.println("==================== 游戏开 始 ======================"); 11 while(true){ 12 System.out.println("请输入参加的玩家数:"); 13 Scanner input = new Scanner(System.in); 14 playernumber = input.nextInt(); 15 if(playernumber<2){ 16 System.out.println("参与玩家数在2-4人之间,请重新输入"); 17 } 18 if(playernumber>4){ 19 System.out.println("参与玩家数在2-4人之间,请重新输入"); 20 } 21 if(playernumber>=2&&playernumber<=4){ 22 System.out.println("设置成功,本次游戏共有"+playernumber+"名玩家,祝您游戏愉快"); 23 break; 24 } 25 } 26 if(playernumber==2){ 27 Player player1=new Player(15000, 15000, 100, 0, 0, 1, "玩家1", 1, 0); 28 Player player2=new Player(15000, 15000, 100, 0, 0, 1, "玩家2", 2, 0); 29 players.add(player1); 30 players.add(player2); 31 } 32 if(playernumber==3){ 33 Player player1=new Player(15000, 15000, 100, 0, 0, 1, "玩家1", 1, 0); 34 Player player2=new Player(15000, 15000, 100, 0, 0, 1, "玩家2", 2, 0); 35 Player player3=new Player(15000, 15000, 100, 0, 0, 1, "玩家3", 3, 0); 36 players.add(player1); 37 players.add(player2); 38 players.add(player3); 39 } 40 if(playernumber==4){ 41 Player player1=new Player(15000, 15000, 100, 0, 0, 1, "玩家1", 1, 0); 42 Player player2=new Player(15000, 15000, 100, 0, 0, 1, "玩家2", 2, 0); 43 Player player3=new Player(15000, 15000, 100, 0, 0, 1, "玩家3", 3, 0); 44 Player player4=new Player(15000, 15000, 100, 0, 0, 1, "玩家4", 4, 0); 45 players.add(player1); 46 players.add(player2); 47 players.add(player3); 48 players.add(player4); 49 } 50 while(true){ 51 Date.print(); 52 if(Date.totalday%7!=6&&Date.totalday%7!=0){ 53 for(int i=0;i<=9;i++){ 54 Stock.stocksystem[i].run(); 55 } 56 System.out.println("今天是工作日,股市正常开市"); 57 }else{ 58 System.out.println("今天是双休日,股市休市"); 59 } 60 for(int i=0;i<players.size();i++){ 61 players.get(i).move(); 62 } 63 } 64 } 65 }
程序分析:
是整个程序的主函数,整个PJ包包含着项目的主要函数,entrance是整个项目的入口,主要定义了玩家的数量,以及每位玩家的初始位置以及初始金币等个人信息。通过scanner函数让用户选择玩家的人数
System.out.println("请输入参加的玩家数:"); Scanner input = new Scanner(System.in); playernumber = input.nextInt();
,并引用之后所需要的数组比如Player player1=new Player(15000, 15000, 100, 0, 0, 1, "玩家1", 1, 0);
-
-
-
Date:
-
程序代码:
1 package PJ; 2 3 public class Date { 4 public static int year=2016,month=5,day=30,totalday=1; 5 public static void print(){ 6 System.out.println("今天是"+year+"年"+month+"月"+day+"日"+"周"+(totalday%7)); 7 totalday++; 8 day++; 9 if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){ 10 if(day==32){ 11 day=1; 12 month++; 13 } 14 if(month==13){ 15 month=1; 16 year++; 17 } 18 } 19 if(month==2){ 20 if(day==29){ 21 day=1; 22 month++; 23 } 24 } 25 if(month==4||month==6||month==9||month==11){ 26 if(day==32){ 27 day=1; 28 month++; 29 } 30 } 31 } 32 }
-
-
程序分析:
主要是定义了日期,用最简单的if语句
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){
,来定义,用户选择后来每月的30 31 28 29天数。当然如果满天数溢出之后month进一if(day==32){ day=1; month++; }
,依次循环。 -
MenuPrint:
-
程序代码:
1 package PJ; 2 3 import card.CardSystem; 4 import place.Landindex; 5 6 public class MenuPrint { 7 public static void print1() { 8 System.out.println("0 - 查看地图\n1 - 查看原始地图\n2 - 使用道具\n3 - 前方十步内示警\n4 - 查看前后指定步数的具体信息\n5 - 查看玩家的资产信息\n6 - 想看的都看了,心满意足扔骰子" 9 + "\n7 - 不玩了,认输\n8 - 股票"); 10 System.out.print("请选择 :"); 11 } 12 public static void printstock(int namei) { 13 Player player=new Player(); 14 int[] stocks ; 15 for(int i=0;i<Entrance.players.size();i++){ 16 if(Entrance.players.get(i).getNamei()==namei){ 17 player=Entrance.players.get(i); 18 } 19 } 20 stocks=player.getStocks(); 21 System.out.println("序号"+"\t\t"+"股票名"+"\t\t\t"+"单价"+"\t\t"+"涨跌幅"+"\t\t"+"持有量"); 22 for(int i=0;i<=9;i++){ 23 System.out.println(Stock.stocksystem[i].getNumber()+"\t\t"+Stock.stocksystem[i].getName()+"\t\t"+Stock.stocksystem[i].getPrice()+"\t\t"+Stock.stocksystem[i].getIncrease()+"\t\t"+stocks[i]); 24 } 25 } 26 public static void printinitialmap(){ 27 char[][] blank=new char[10][20]; 28 for(int i=0;i<=9;i++){ 29 for(int j=0;j<=19;j++){ 30 blank[i][j]=(char)12288;//初始化 31 } 32 } 33 for(int i=0;i<Landindex.mark.length;i++){ 34 for(int x=0;x<=9;x++){ 35 for(int y=0;y<=19;y++){ 36 if(Landindex.mark[i].i==y&&Landindex.mark[i].j==x) 37 blank[x][y]=Landindex.mark[i].getchart(); 38 } 39 } 40 } 41 for(int j=0;j<=9;j++){ 42 for(int i=0;i<=19;i++ ){ 43 System.out.print(blank[j][i]); 44 } 45 System.out.println(); 46 } 47 } 48 public static void printmap(){ 49 char[][] blank=new char[10][20]; 50 for(int i=0;i<=9;i++){ 51 for(int j=0;j<=19;j++){ 52 blank[i][j]=(char)12288; 53 } 54 } 55 for(int i=0;i<Landindex.mark.length;i++){ 56 for(int x=0;x<=9;x++){ 57 for(int y=0;y<=19;y++){ 58 if(Landindex.mark[i].i==y&&Landindex.mark[i].j==x) 59 blank[x][y]=Landindex.mark[i].getchart(); 60 for(int k=0;k<Entrance.players.size();k++){ 61 if(Entrance.players.get(k).getLocation()==i){ 62 if(Entrance.players.get(k).getNamei()==1) 63 blank[Landindex.mark[i].j][Landindex.mark[i].i]='□';//玩家1所在位置 64 if(Entrance.players.get(k).getNamei()==2) 65 blank[Landindex.mark[i].j][Landindex.mark[i].i]='■';//玩家2所在位置 66 if(Entrance.players.get(k).getNamei()==3) 67 blank[Landindex.mark[i].j][Landindex.mark[i].i]='◇';//玩家3所在位置 68 if(Entrance.players.get(k).getNamei()==4) 69 blank[Landindex.mark[i].j][Landindex.mark[i].i]='◆';//玩家4所在位置 70 } 71 } 72 } 73 } 74 } 75 for(int j=0;j<=9;j++){ 76 for(int i=0;i<=19;i++ ){ 77 System.out.print(blank[j][i]); 78 } 79 System.out.println(); 80 } 81 } 82 }
-
程序分析:
这是程序的菜单类,比如每个回合用户走到了哪里,地图上能够print出来
public static void printmap(){ char[][] blank=new char[10][20]; for(int i=0;i<=9;i++){ for(int j=0;j<=19;j++){ blank[i][j]=(char)12288; } }
。设计思想就是类C用一个case语句,来让用户选择每一步的行为。landindex项来确定用户每一步走到了哪里if(Landindex.mark[i].i==y&&Landindex.mark[i].j==x) blank[x][y]=Landindex.mark[i].getchart();
。用if语句来保证,因为最开始并不能确定到底有多少名用户。用四个if套环就能确定 -
-
Stock:
-
程序代码:
1 package PJ; 2 3 public class Stock { 4 String name; 5 int number;//序号 6 double price; 7 int hold=0;//持有量 8 double increase; 9 public boolean state=false; 10 Stock(String name,int number,double price){ 11 this.name=name; 12 this.number=number; 13 this.price=price; 14 } 15 public String getName(){ 16 return name; 17 }; 18 public int getNumber() { 19 return number; 20 } 21 public int getHold() { 22 return hold; 23 } 24 public void setHold(int i) { 25 this.hold=i; 26 } 27 public double getPrice() { 28 return price; 29 } 30 public double getIncrease() { 31 return increase; 32 } 33 public void run() { 34 increase=(Math.random()-0.5)*0.2; 35 increase=Double.parseDouble(String.format("%.2f",increase)); 36 this.price=price*(1+increase); 37 this.price=Double.parseDouble(String.format("%.2f",price)); 38 } 39 public static Stock[] stocksystem = new Stock [10]; 40 static{ 41 stocksystem[0]=new Stock("zhonghaifazhan",1,2.0); 42 stocksystem[1]=new Stock("dongfengqiche",2,1.5); 43 stocksystem[2]=new Stock("jinangangtie",3,1.8); 44 stocksystem[3]=new Stock("zhongguoguomao",4,2.5); 45 stocksystem[4]=new Stock("baoganggufen",5,2.7); 46 stocksystem[5]=new Stock("huanengguoji",6,2.9); 47 stocksystem[6]=new Stock("baoganggufen",7,3.3); 48 stocksystem[7]=new Stock("shanghaidianli",8,3.5); 49 stocksystem[8]=new Stock("zhongyuangaosu",9,3.2); 50 stocksystem[9]=new Stock("shanghaidianli",10,1.7); 51 } 52 }
程序分析:
stock类是用来定义股票的一个类,有利息运算increase函数
increase=(Math.random()-0.5)*0.2;
,其中引用了random函数来确定股票的增长收入,以及每种股票最后写的那样stocksystem[0]=new Stock("zhonghaifazhan",1,2.0);
,每种的价格最开始处于一个固定的值,以后可以在完善的过程中加入新函数,不仅仅是random自带的math函数,更多的是更多杂凑函数的组合,让股票类能更多的无序。 -
-
EqualizedWealthCard
-
程序代码:
1 package card; 2 3 import place.Landindex; 4 import PJ.Entrance; 5 import PJ.Player; 6 7 public class EqualizedWealthCard extends CardSystem { 8 //均富卡 9 String name="EqualizedWealthCard"; 10 String function="将所有人的现金平均分配"; 11 String type="MagicCard"; 12 String range="其他玩家(无视距离)"; 13 EqualizedWealthCard(){ 14 int point=40; 15 this.point=point; 16 } 17 @Override 18 public String getName() { 19 20 return name; 21 } 22 23 @Override 24 public String getFunction() { 25 // TODO Auto-generated method stub 26 return function; 27 } 28 29 @Override 30 public String getType() { 31 // TODO Auto-generated method stub 32 return type; 33 } 34 @Override 35 public int getPoint() { 36 return point; 37 } 38 @Override 39 public String getRange() { 40 // TODO Auto-generated method stub 41 return range; 42 } 43 @Override 44 public void print(int location, int namei) { 45 // TODO Auto-generated method stub 46 int tmp=0; 47 for(int i=0;i<Entrance.players.size();i++){ 48 tmp+=Entrance.players.get(i).getCash(); 49 } 50 tmp=tmp/(Entrance.players.size()); 51 for(int i=0;i<Entrance.players.size();i++){ 52 Entrance.players.get(i).setCash(tmp); 53 } 54 System.out.println("卡牌使用成功"); 55 } 56 }
-
代码分析:
这个代码程序是实现一个均富卡的功能,让所有玩家的资产平均分配。
String name
是定义改卡片的名字,String function
是说明该卡片的功能,String type 是定义卡片的分类情况,String range
定义了卡片的适用范围。getName
、getFuction
、getType
、getRange
是依次对应这些定义的获取函数。`for(int i=0;i<Entrance.players.size();i++){ tmp+=Entrance.players.get(i).getCash();
这段代码是实现对每个玩家现金求和。tmp=tmp/(Entrance.players.size()
这段代码是讲总资产平局分配。for(int i=0;i<Entrance.players.size();i++){Entrance.players.get(i).setCash(tmp); }
这段代码完成了将每个人的现金数更改为修改后的数目的功能。 -
-
BlackCard
-
程序代码:
1 package card; 2 public class BlackCard extends CardSystem{ 3 //黑卡 4 String name="BlackCard"; 5 String function="使第二天这支股票下跌10%"; 6 String type="ToolCard"; 7 String range="特定的股票"; 8 BlackCard(){ 9 int point=20; 10 this.point=point; 11 } 12 @Override 13 public int getPoint() { 14 return point; 15 } 16 @Override 17 public String getName() { 18 19 return name; 20 } 21 22 @Override 23 public String getFunction() { 24 // TODO Auto-generated method stub 25 return function; 26 } 27 28 @Override 29 public String getType() { 30 // TODO Auto-generated method stub 31 return type; 32 } 33 34 @Override 35 public String getRange() { 36 // TODO Auto-generated method stub 37 return range; 38 } 39 @Override 40 public void print(int location, int who) { 41 // TODO Auto-generated method stub 42 System.out.print("该卡牌功能尚未开放,敬请期待"); 43 } 44 }
-
程序分析
该程序对应Black card,其功能是使某支股票价在第二天下跌10%。其中,@Override起到了方便代码检查和维护的功能。
public String getName() {return name;};
这段函数是为了获取这张卡片的名称。public String getFunction() {// TODO Auto-generated method stubreturn function;}
以及后面的getType、gerRange功能和它类似,依次对应功能、类别、使用范围。 目前这张功能卡只完成了其模板的创建,主函数部分还未完成,所以该卡片的功能还不能在Jvaa程序上实现,我们组会在后续项目完善时将其补充完整。
-
-
MonsterCard
-
程序代码:
1 package card; 2 3 import PJ.Entrance; 4 import PJ.Player; 5 import place.Landindex; 6 7 public class MonsterCard extends CardSystem { 8 //怪兽卡 9 String name="MonsterCard"; 10 String function="该街道所有土地重置为初始状态,即1级"; 11 String type="MagicCard"; 12 String range="停留地的整条街道"; 13 MonsterCard(){ 14 int point=20; 15 this.point=point; 16 } 17 @Override 18 public String getName() { 19 20 return name; 21 } 22 23 @Override 24 public String getFunction() { 25 // TODO Auto-generated method stub 26 return function; 27 } 28 @Override 29 public int getPoint() { 30 return point; 31 } 32 @Override 33 public String getType() { 34 // TODO Auto-generated method stub 35 return type; 36 } 37 38 @Override 39 public String getRange() { 40 // TODO Auto-generated method stub 41 return range; 42 } 43 @Override 44 public void print(int location, int who) { 45 // TODO Auto-generated method stub 46 Player playerow=new Player(); 47 for(int i=0;i<Entrance.players.size();i++){ 48 if(Entrance.players.get(i).getNamei()==Landindex.mark[location].owner){ 49 playerow=Entrance.players.get(i); 50 } 51 } 52 Landindex.mark[location].level=1; 53 playerow.setHouseValue(playerow.getHouseValue()-Landindex.mark[location].price+Landindex.mark[location].intialprice); 54 Landindex.mark[location].price=Landindex.mark[location].intialprice; 55 } 56 }
-
代码分析:
这张卡为怪兽卡,其功能是当玩家抽到该卡片时,玩家所处街道上的所有土地降为1级。与其他功能卡的程序类似,
String name="MonsterCard";
String function="该街道所有土地重置为初始状态,即1级";
String type="MagicCard";
String range="停留地的整条街道";
这些是定义该卡片的基本信息,包括名称、类别、功能、使用范围。if(Entrance.players.get(i).getNamei() ==Landindex.mark[location].owner){ playerow=Entrance.players.get(i); Landindex.mark[location].level=1;
先判断玩家的土地是否处在该街道段上。 如果是在该街道上,则将这块土地的等级降为1。for(int i=0;i<Entrance.players.size();i++)
加上该循环后,就完成了对每位玩家的检查和执行。 -
3.项目现实中的问题与解决
-
首先是主要函数中的
Entrance
函数,因为游戏需要规定出参与游戏的人数,原计划是单独使用一个class
文件用来定义玩家数量和初始金钱等,直接利用Entrance
函数将其连接起来,但是发现发现如果将参与游戏的人数与Entrance
函数连接起来会增大工作量,在维护起来也会存在一定的问题,于是就减少了游戏的参与人数,将玩家的初始数据归入Entrance
函数中。 -
在菜单的选项中,遇到的问题是如何让参与游戏的玩家能直接获得地图信息、使用道具或者看到玩家个人信息等问题。因为我们的程序没有实现界面化,如果在一个界面下就可以成功的显示出以上所提到的信息。我们的解决方案是,在
PJ
中加入一个MenuPrint
函数,里面显示为菜单打印功能,在每一步掷骰子结束后都会自动跳出来这个菜单,共玩家选择。这样就解决了之前遇到的玩家没法直接查询信息的问题。 -
在之前提到的彩票站(LotteryStation)对于金钱的计算,遇到的问题是在嵌套循环的时候有时候的金钱信息会发生错误,解决得问题是采用差额计算法,之前提到过解决办法,如果遇到金额小于购买彩票的金额是,在其之前加上一个循环语句,判断一下就可以解决。
-
在
Card
方面,我们遇到如何在游戏的地图里获得卡牌,是选择随机出现还是有卡牌出售的地方,经过讨论,我们在地图里加一个Cardshop
函数,当掷骰子到该处时候就可以选择购买卡牌,并在Player
函数中记录该玩家的特殊卡牌功能。只需在CardShop
中显示出卡牌的种类及功能,具体的在Card
包中实现,每一个卡牌需要定义功能,使用对象等,在CardShop
中用move()
方法实现调用,就解决了问题。
4.项目展望与改进(共下一届同学参考)
-
展望:
我们原计划是希望有一个界面化,但是后来发现这个GUI界面化和简单的五子棋和贪吃蛇的界面不一样的。这个相较于内些复杂很多,所以希望如果有可能的话学习一下GUI界面化,对于这个游戏进行界面化设计运行程序的时候不单单在Idea的界面中,就会有质的改变。
-
改进:
在卡牌功能方面还有待提高,只有简单的几个卡牌,实现的功能不是很广泛,有时间的话在这方面应该还可以在改进一下。同样的在游戏的地图的设计方面,地图地点中由于编译能力的问题就没有实现很多其他种类的地方,像类似于
Hospital
函数、Bank
函数、Park
函数、Land
函数、PolcieStation
函数代码几乎是一样的,只是不同地名而已,所以在这方面丰富度不是很高,在这方面也是需要提高。
5.团队成员贡献与成绩分配
我们队一共4个人,团队总分4*25=100
团队成员 | 成员贡献 | 成绩分配 |
---|---|---|
20144303石宇森 | 负责博客的记录、部分函数的编译、辅助项目的编译。 | 22分 |
20145301赵嘉鑫 | 负责博客的记录、项目主要代码的编译、资料查询等、对代码进行相应测试、对托管的代码进行检查与再编译等。 | 29分 |
20145307陈俊达 | 负责博客的记录、项目主要的代码编译、托管过的代码检查再编译z。 | 26分 |
20145335郝昊 | 负责主要博客记录、部分函数的编译、辅助项目的编译、其他程序的java语言翻译、代码的托管以及本次博客的主要撰写。 |
23分 |