Java团队项目总结

1.项目实现情况

  • 项目概述:

    我们团队项目准备实现一个有关于大富翁有的游戏程序。

    大富翁游戏,以经营权为主要的游戏方式,通过购买经营权与架构经营的星级服务来获得最大的利益,当其他玩家破产后,最后一个玩家取得胜利来结束游戏。在百度词条上示意为,默认多幅地图,以掷骰点数前进,并有多种道具、卡片使用,另外触发一些“特别事件”。主要通过购买房产,收取对方的路费、租金来导致对手的破产。

  • 项目预期:

    鉴于对java学习的程度和掌握内容,基本实现大富翁的游戏内容我们的项目打算实现以下目标。

    • 按照计划,首先需要列出我们要实现的特殊卡牌功能card,其中有BarricadeCardBlackCardDemolitionCardEqualizedWealthCardFortuneGodCardLandCardLotteryCard 、MonsterCardPlunderCardPurchaseCardRedCard、 RemoteDiceCardRetentionCardTaxInspectionCardTortoiseCardTurnCardWealthGodCard同时需要一个CardSystem用来管理所有设计的Card类。

    • 其次设计大富翁游戏里的杂项功能,比如角色的数量,时间等,就需要一下class文件DateEntranceMenuPrintPlayerStock等,比如Date就用来实现大富翁游戏中日期的计数,Entrance实现整个大富翁游戏的入口MenuPrint就用来实现游戏中每一步之后显示的菜单选项,Player就用来实现游戏的参与游戏的数量,Stock用来返回各项菜单。

    • 最后需要设计大富翁游戏的重要的场景,例如医院、彩票站等。BankBlankCardGetCardShopHospitaHousLandLandindexLottteryStationNewsParkPiontPoliceStation

  • 项目结果(总项目列表):

    • Card类:

    • PJ类:

    • Place类:

2.项目测试

  • 项目分析:

    因为所要完成总任务的大项都是由小项合并起来完成的。以下举出几个例子。

  • LotteryStation(彩票站):

    • 程序代码:

      1. package place;
      2.  
      3. import java.util.Scanner;
      4.  
      5. import PJ.Entrance;
      6. import PJ.Player;
      7.  
      8. public class LotteryStation extends Land {
      9. LotteryStation(int x, int y,String name) {
      10. this.i = x;
      11. this.j = y;
      12. this.name=name;
      13. }
      14. @Override
      15. public char getchart() {
      16. return '彩';
      17. // TODO Auto-generated method stub
      18. }
      19. public void printInformation(int step) {
      20. System.out.println("这里是彩票站~~");
      21. // TODO Auto-generated method stub
      22. }
      23. @Override
      24. public void printaction(int step,int namei){
      25. Player player=new Player();
      26. for(int i=0;i<Entrance.players.size();i++){
      27. if(Entrance.players.get(i).getNamei()==namei){
      28. player=Entrance.players.get(i);
      29. }
      30. }
      31. System.out.println("这里是彩票站,选购彩票将花费您1000元,"+"\n"+"是请输入y,不是请输入n");
      32. Scanner input=new Scanner(System.in);
      33. String answer=input.next();
      34. while(true){
      35. if(answer.equals("y")){
      36. if(player.getCash()>=1000){
      37. int i=(int)(Math.random()*5+1);
      38. if(i==3){
      39. System.out.println("恭喜您中奖了!获得奖励5000元");
      40. player.setCash(player.getCash()+4000);
      41. }else{
      42. System.out.println("很遗憾,您差点中奖,继续购买请输入y,离开请输入n");
      43. player.setCash(player.getCash()-1000);
      44. answer=input.next();
      45. }
      46. }else{
      47. System.out.println("您的现金不足,彩票不支持刷卡");
      48. break;
      49. }
      50. }else if(answer.equals("n")){
      51. System.out.println("真是遗憾,下次再来碰碰运气吧");
      52. break;
      53. }else{
      54. System.out.println("不好意思,是不是输入错误了啊!");
      55. answer=input.next();
      56. }
      57. }
      58. }
      59. public char getinitialchart() {
      60. return '彩';
      61. // TODO Auto-generated method stub
      62. }

      LotteryStation



    • 代码分析:

      首先关于彩票站是属于Place里的一项,为了实现游戏中玩家使相互对方破产的功能。

      其次代码在编写的时不仅需要import java.util.Scanner;用来输入数据,还需要和杂项文件PJ中的EntrancePlayer的数据联系起来。使用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. }

      Player

    • 代码分析:

      之前提到的Player函数,并没有用来作为玩家的初始数据设置。根据游戏性质,玩家在每到一个地方的时候就会发生金钱或者其他数据的变化,不论发生在哪一个场景,发生变化的数据总是这么几个数据,所以就将其列入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

    • 代码分析:

      因为在大富翁游戏中存在一些没有没有任何功能的地方,只是简单的等待或者显示什么都不会发生等。比如HospitalPoliceStationLand等,这一类的只需要在继承父类时候加上@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. }

      Entrance

      1. 程序分析:

    是整个程序的主函数,整个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. }

      Date

  • 程序分析:

    主要是定义了日期,用最简单的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. }

      MenuPrint

    • 程序分析:

    这是程序的菜单类,比如每个回合用户走到了哪里,地图上能够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

      1. 程序分析:

    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. }

      EqualizedWealthCard

    • 代码分析:

    这个代码程序是实现一个均富卡的功能,让所有玩家的资产平均分配。String name 是定义改卡片的名字,String function 是说明该卡片的功能,String type 是定义卡片的分类情况,String range定义了卡片的适用范围。getNamegetFuctiongetTypegetRange是依次对应这些定义的获取函数。`

    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. }

      BlackCard

    • 程序分析

      该程序对应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. }

      MonsterCard

    • 代码分析:

    这张卡为怪兽卡,其功能是当玩家抽到该卡片时,玩家所处街道上的所有土地降为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分

Java团队项目总结的更多相关文章

  1. 2017-2018-2 165X 『Java程序设计』课程 团队项目备选题目

    2017-2018-2 165X 『Java程序设计』课程 团队项目备选题目 结合本课程时间安排,以及同学们的专业和课程内容,制定了以下六个题目供各小组选择.如有其他项目方案设想,可自行与老师沟通.老 ...

  2. HeyWeGo小组《Java程序设计》 2015—2016年学期团队项目总结

    HeyWeGo小组<Java程序设计> 2015—2016年学期团队项目总结 题目简介 一个简单的扫雷小游戏,在12*12的方格盘上,首先可以设定雷的个数,然后点击开始程序就会随机布雷,开 ...

  3. [团队项目]----Math Calculator

    团队项目 ----Math Calculator 任务: 1.每个团队从Github上fork这个项目的源代码 https://github.com/RABITBABY/We-have-bing 2. ...

  4. BestRW团队项目创意以及NABCD

    一.写在前面 这次的团队项目我们队选到的是自由选题,与其说是选,不如说是分配.毕竟我们组游戏排名倒数第二···其实当我第一次听说我们队排倒数第二的时候我是有点不爽的,毕竟在这后面能够抽到的题目都是剩下 ...

  5. 团队项目之NABC

    Time:2013-10-22 Author:wang 一个成功的人,总是知道如何管理自己的时间,如何让自己的时间得到最充分最有效的利用.对学生一族而言,课业负担重,各种课程.各种活动.各种社团,如果 ...

  6. Java web项目综合练习(Estore)

    Java web项目综合练习(Estore) 复习day18: ajax代码的书写步骤 2)json格式文本,转js对象的方法是那个 项目开发流程介绍 这里学习的JavaWEB项目实战,主要是把前面学 ...

  7. 《Hello world 团队》第二次作业:团队项目选题报告

    项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验六 团队作业2:团队项目选题 团队名称 <hello--world团队> ...

  8. 《Dare To Dream》第六次作业:团队项目系统设计改进与详细设计

    团队项目系统设计改进与详细设计 一.团队项目系统设计改进 任务1: a.分析项目系统设计说明书初稿的不足,特别是软件系统结构模型建模不完善内容.  初稿的不足:缺乏每个模块的具体业务流程详细设计和流程 ...

  9. A_Pancers团队作业4—基于原型的团队项目需求调研与分析

    任务1:实施团队项目软件用户调研活动. (1)用户调研对象:我们的项目软件是基于安卓系统的音乐播放器,以设计出操作简单的音乐播放器为目的,所以本次用户调研的对象主要以身边的老人为主,对他们听音乐,听戏 ...

随机推荐

  1. 码农谷 球从M米高度自由下落第N次落地时反弹的高度

    题目描述 一球从M米高度自由下落,每次落地后返回原高度的一半,再落下.它在第N次落地时反弹多高?共经过多少米? 保留两位小数. 输入描述 M N 输出描述 它在第N次落地时反弹多高?共经过多少米? 保 ...

  2. 前端开发之-------------合理利用CSS的权重----------------

    什么是CSS的权重?对于前端工程师来说,这是一个很基础的问题,如果前端工程师没有深刻理解这个概念,则很难写出高质量的CSS代码. 那么到底什么是CSS的权重呢?我们又怎么来进行判定CSS的权重呢? 讨 ...

  3. Win7系统下VS2008安装SP1补丁解决JQuery无智能提示的问题

    jQuery在vs2008中的智能提示 1  安装VS2008SP1补丁 要确保您的vs2008已经打了sp1补丁,在vs2008的帮助里的关于,要是安装了sp1,会出现“版本 3.5 sp1”,没安 ...

  4. MongoDB(4):多种方式关闭服务命令

    http://blog.csdn.net/czw698/article/details/8791153 MongoDB 提供几种关闭服务的命令,具体为以下: 一 使用 Crtl+C 关闭  [mong ...

  5. Windows7防火墙服务无法启用怎么办

    点击windows 7控制面板中防火墙的“推荐配置”没有反应,打开“服务”,无法启动windows firewall,并报错.  问题:  1.点击windows 7控制面板中防火墙的“推荐配置”没有 ...

  6. 八数码难题 (codevs 1225)题解

    [问题描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局( ...

  7. 编写测试类,了解ArrayList的方法

    这篇文章主要介绍了C#中动态数组用法,实例分析了C#中ArrayList实现动态数组的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了C#中动态数组用法.分享给大家供大家参考.具体分析如下 ...

  8. 每天进步一点--c#基础巩固,事件、委托

    要想技术有所提高,就是把有些问题真正的弄懂弄明白,我从事C#开发两年了,一直对事件委托等概念一知半解,有时候博客园上看看别的大牛的文章,看看懂了就过去了,时间长了又忘了,真正理解还是要自己动手弄些例子 ...

  9. 条件放在left join后面和where后面

    有这样一个查询的差异: 两张表如下: 语句在这里: create table #AA ( ID int, Name nvarchar() ) insert into #AA ,'项目1' union ...

  10. 安装wampserver出现“The Program can't start because MSVCR110.dll is missing from your computer. Try reinstalling the program to fix this problem”

    问题描述: 今天安装wampserver的时候出现"The Program can't start because MSVCR110.dll is missing from your com ...