标签:
项目概述:
我们团队项目准备实现一个有关于大富翁有的游戏程序。
大富翁游戏,以经营权为主要的游戏方式,通过购买经营权与架构经营的星级服务来获得最大的利益,当其他玩家破产后,最后一个玩家取得胜利来结束游戏。在百度词条上示意为,默认多幅地图,以掷骰点数前进,并有多种道具、卡片使用,另外触发一些“特别事件”。主要通过购买房产,收取对方的路费、租金来导致对手的破产。
项目预期:
鉴于对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类:
项目分析:
因为所要完成总任务的大项都是由小项合并起来完成的。一下举出几个例子。本次博客也是郝昊主要写作其余队员合作完成的。
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:
程序代码:
package PJ;
import java.util.ArrayList;
import java.util.Scanner;
import place.Landindex;
import card.CardSystem;
public class Player {
private double deposit ;
private double cash;
private int Point;
private int housequantity;
private int step;
private double houseValue;
private int direction =1;
private int location=(int)(Math.random()*67+1);
private String name ;
private int namei;
private String direct ;
private int special=0;//=0时正常,=1-6时使用了遥控骰子,=7时处于滞留卡状态,=8时处于乌龟卡状态,=9-16时处于福神保佑状态,=17-24时处于财神保佑状态
private int[] cards=new int[17];
private int[] stocks=new int[10];
Player(double deposit,double cash,int point,int housequantity,int housevalue,int direction,String name,int namei,int special){
this.deposit=deposit;
this.cash=cash;
this.Point=point;
this.housequantity=housequantity;
this.houseValue=housevalue;
this.direction=direction;
this.name=name;
this.special=special;
this.namei=namei;
for(int i=0;i<=16;i++){
cards[i]=1;
}
}
public Player() {
// TODO Auto-generated constructor stub
}
public void move(){
if (deposit + cash > 0){
if(direction==1){
direct="顺时针";
}else{
direct="逆时针";
}
System.out.println("现在是玩家"+name+"的回合,您的前进方向是"+direct+"。");
if(Date.day==1){
System.out.println("又到了月初,您的存款已在月末获得了10%的利息");
this.deposit=deposit*1.1;
}
System.out.println("您现在可以进行如下操作:");
MenuPrint.print1();
Scanner input = new Scanner(System.in);
int digitalInput = input.nextInt();
while (true) {
if (digitalInput >= 0 && digitalInput <= 8)
break;
else {
System.out.print("invalid input, please enter again :");
digitalInput = input.nextInt();
}
}
while (digitalInput != 6 && digitalInput != 7) {
switch (digitalInput) {
case 0:
MenuPrint.printmap();
System.out.println("还有什么要看的");
MenuPrint.print1();
digitalInput = input.nextInt();
break;
case 1:
MenuPrint.printinitialmap();
System.out.println("还有什么要看的");
MenuPrint.print1();
digitalInput = input.nextInt();
break;
case 2:
System.out.println("名称"+"\t\t\t\t"+"功能"+"\t\t"+"类型"+"\t\t"+"价格"+"\t\t"+"适用范围"+"\t\t"+"剩余数量");
for(int i=0;i<=16;i++){
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]);
}
System.out.println("请选择");
Scanner in=new Scanner(System.in);
int inner=in.nextInt();
if(cards[inner]==0){
System.out.println("此卡数量不足");
}else{
CardSystem.cardsystem[inner].print(location, namei);
cards[inner]--;
}
System.out.println("还有什么要看的");
MenuPrint.print1();
digitalInput = input.nextInt();
break;
case 3:
boolean luzhang=false;
for (int i = 1; i <= 10; i++) {
if (Landindex.mark[location+i].state == false) {
System.out.println("前方第" + i + "步处有路障,小心哦,还有什么要看的");
luzhang=true;
}
}
if(!luzhang){
System.out.println("没有情况;还有什么要看的");
}
MenuPrint.print1();
digitalInput = input.nextInt();
break;
case 4:
System.out.print("请输入您想查询的地方与您相差的步数<后方用负数,按q退出>:");
String Input = input.next();
if (Input.equals("q")) {
System.out.println("还有其它想看的么,请输入 :");
MenuPrint.print1();
digitalInput = input.nextInt();
break;
} else {
int i = Integer.parseInt(Input);
Landindex.mark[(location+i)%68].printInformation((location+i)%68);
System.out.println("还有其它想的么,请输入 :");
MenuPrint.print1();
digitalInput = input.nextInt();
break;
}
case 5:
System.out.println("玩家"+"\t"+"现金 "+"\t"+"存款 "+"\t"+"房产数"+"\t"+"房产价值"+"\t"+"点券数");
for(int i=0;i<Entrance.players.size();i++){
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());
}
System.out.println("还有其它想的么,请输入 :");
MenuPrint.print1();
digitalInput = input.nextInt();
break;
case 8:
System.out.println("欢迎进入大富翁股市~~");
MenuPrint.printstock(namei);
String[] stockinput;
String choose;
int num;
int amount;
System.out.println("买股票请输入b*序号*数量,卖股票请输入s*序号*数量,退出请输入q");
String stockin=input.next();
if(stockin.equals("q")){
System.out.println("还有其它想的么,请输入 :");
MenuPrint.print1();
digitalInput = input.nextInt();
break;
}else{
stockinput=stockin.split("[*]");
choose=stockinput[0];
num=Integer.parseInt(stockinput[1]);
amount=Integer.parseInt(stockinput[2]);
while(true){
if(choose.equals("b")){
double allprice=Stock.stocksystem[num-1].getPrice()*amount;
double all=deposit+cash;
if(all>=allprice){
if(deposit>=allprice){
deposit-=allprice;
}else{
cash-=(allprice-deposit);
deposit=0;
}
stocks[num-1]+=amount;
Stock.stocksystem[num-1].setHold(Stock.stocksystem[num-1].getHold()+amount);
System.out.println("购买成功!");
break;
}else{
System.out.println("购买失败,您的金钱不足");
break;
}
}else if(choose.equals("s")){
//System.out.println("您当前持有量为"+stocks[num-1]+"您要卖出"+amount);
if(stocks[num-1]>=amount){
double allprice=Stock.stocksystem[num-1].getPrice()*amount;
stocks[num-1]-=amount;
deposit+=allprice;
Stock.stocksystem[num-1].setHold(Stock.stocksystem[num-1].getHold()-amount);
System.out.println("抛售成功!");
break;
}else{
System.out.println("抛售失败,您的持有量不足");
break;
}
}else{
System.out.print("invalid input, please enter again :");
stockin=input.next();
}
}
System.out.println("还有其它想的么,请输入 :");
MenuPrint.print1();
digitalInput = input.nextInt();
break;
}
}
}
if (digitalInput == 6) {
int actualStep = (int)(Math.random()*6+1);
//System.out.println("前面"+actualStep);
//当使用滞留卡时
if(special==7){
actualStep=0;
special=0;
//使用遥控骰子时
}else if(special>0&&special<=6){
actualStep=special;
special=0;
}
//遇到路障时
for(int i= 1; i < actualStep; i++){
if (Landindex.mark[(location+i* direction)%68].state == false) {
System.out.println("前面第" + i + "步遇到了路障,过不去了");
actualStep = i;
Landindex.mark[(location+i* direction)%68].state=true;
location=(location+i* direction)%68;
break;
}
}
//当经过银行时
for (int j = 1; j < actualStep; j++) {
if (Landindex.mark[(location+j* direction)%68] instanceof place.Bank) {
Landindex.mark[(location+j* direction)%68].printaction((location+j* direction)%68, namei);
break;
}
}
location=(location+actualStep*direction)%68;
// System.out.println("后面"+actualStep);
Landindex.mark[location].printaction(location, namei);
}
if (digitalInput == 7) {
System.out.println("祝您下次游戏愉快~~");
for(int i=0;i<Entrance.players.size();i++){
if(Entrance.players.get(i).getNamei()==namei){
Entrance.players.remove(i);
}
}
for(int m=0;m<=67;m++){
if(Landindex.mark[m].owner==namei){
Landindex.mark[m].owner=0;
}
}
if(Entrance.players.size()==1){
System.out.println("胜利的玩家是:"+Entrance.players.get(0).getName());
System.exit(0);
}
}
}else{
System.out.println("真抱歉,您破产了!下次加油吧!");
for(int i=0;i<Entrance.players.size();i++){
if(Entrance.players.get(i).getNamei()==namei){
Entrance.players.remove(i);
}
}
}
}
public double getDeposit() {
return deposit;
}
public void setDeposit(double deposit) {
this.deposit = deposit;
}
public double getCash() {
return cash;
}
public void setCash(double cash) {
this.cash = cash;
}
public int getPoint() {
return Point;
}
public void setPoint(int point) {
Point = point;
}
public int getHousequantity() {
return housequantity;
}
public void setHousequantity(int housequantity) {
this.housequantity = housequantity;
}
public int getStep() {
return step;
}
public void setStep(int step) {
this.step = step;
}
public double getHouseValue() {
return houseValue;
}
public void setHouseValue(double d) {
this.houseValue = d;
}
public int getDirection() {
return direction;
}
public void setDirection(int direction) {
this.direction = direction;
}
public int getLocation() {
return location;
}
public void setLocation(int location) {
this.location = location;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNamei() {
return namei;
}
public void setNamei(int namei) {
this.namei = namei;
}
public int getSpecial() {
return special;
}
public void setSpecial(int special) {
this.special = special;
}
public int[] getCards() {
return cards;
}
public void setCards(int[] cards) {
cards = cards;
}
public int[] getStocks() {
return stocks;
}
public void setStocks(int[] stocks) {
this.stocks = stocks;
}
}
代码分析:
之前提到的Playe
r函数,并没有用来作为玩家的初始数据设置。根据游戏性质,玩家在每到一个地方的时候就会发生金钱或者其他数据的变化,不论发生在哪一个场景,发生变化的数据总是这么几个数据,所以就将其列入Player
函数中。在每遇到不同的信息的时候就直接调用,比如在Player
函数中定义的金钱变化的函数private double cash;
this.cash=cash;
等,当遇到金钱的变化时候直接调用函数就可以记录。
Hospital:
程序代码:
package place;
public class Hospital extends Land{
Hospital(int x, int y,String name) {
this.i = x;
this.j = y;
this.name=name;
}
@Override
public char getchart() {
// TODO Auto-generated method stub
return ‘医‘;
}
public char getinitialchart() {
return ‘医‘;
// TODO Auto-generated method stub
}
public void printInformation(int step){
System.out.println("这里是医院~~");
}
@Override
public void printaction(int step,int namei){
System.out.println("这里是医院~~");
}
}
代码分析:
因为在大富翁游戏中存在一些没有没有任何功能的地方,只是简单的等待或者显示什么都不会发生等。比如Hospital
、PoliceStation
、Land
等,这一类的只需要在继承父类时候加上@Overrid
检查与父类中相同段代码是否相同,方便日后的代码的维护与编译。
Entrance:
程序代码:
package PJ;
import java.util.ArrayList;
import java.util.Scanner;
public class Entrance {
public static int playernumber=0;
public static ArrayList<Player> players=new ArrayList<Player>();
public static void main(String[] args) throws InterruptedException {
System.out.println("==================== 游戏开 始 ======================");
while(true){
System.out.println("请输入参加的玩家数:");
Scanner input = new Scanner(System.in);
playernumber = input.nextInt();
if(playernumber<2){
System.out.println("参与玩家数在2-4人之间,请重新输入");
}
if(playernumber>4){
System.out.println("参与玩家数在2-4人之间,请重新输入");
}
if(playernumber>=2&&playernumber<=4){
System.out.println("设置成功,本次游戏共有"+playernumber+"名玩家,祝您游戏愉快");
break;
}
}
if(playernumber==2){
Player player1=new Player(15000, 15000, 100, 0, 0, 1, "玩家1", 1, 0);
Player player2=new Player(15000, 15000, 100, 0, 0, 1, "玩家2", 2, 0);
players.add(player1);
players.add(player2);
}
if(playernumber==3){
Player player1=new Player(15000, 15000, 100, 0, 0, 1, "玩家1", 1, 0);
Player player2=new Player(15000, 15000, 100, 0, 0, 1, "玩家2", 2, 0);
Player player3=new Player(15000, 15000, 100, 0, 0, 1, "玩家3", 3, 0);
players.add(player1);
players.add(player2);
players.add(player3);
}
if(playernumber==4){
Player player1=new Player(15000, 15000, 100, 0, 0, 1, "玩家1", 1, 0);
Player player2=new Player(15000, 15000, 100, 0, 0, 1, "玩家2", 2, 0);
Player player3=new Player(15000, 15000, 100, 0, 0, 1, "玩家3", 3, 0);
Player player4=new Player(15000, 15000, 100, 0, 0, 1, "玩家4", 4, 0);
players.add(player1);
players.add(player2);
players.add(player3);
players.add(player4);
}
while(true){
Date.print();
if(Date.totalday%7!=6&&Date.totalday%7!=0){
for(int i=0;i<=9;i++){
Stock.stocksystem[i].run();
}
System.out.println("今天是工作日,股市正常开市");
}else{
System.out.println("今天是双休日,股市休市");
}
for(int i=0;i<players.size();i++){
players.get(i).move();
}
}
}
}
程序分析:
是整个程序的主函数,整个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:
程序代码:
package PJ;
public class Date {
public static int year=2016,month=5,day=30,totalday=1;
public static void print(){
System.out.println("今天是"+year+"年"+month+"月"+day+"日"+"周"+(totalday%7));
totalday++;
day++;
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){
if(day==32){
day=1;
month++;
}
if(month==13){
month=1;
year++;
}
}
if(month==2){
if(day==29){
day=1;
month++;
}
}
if(month==4||month==6||month==9||month==11){
if(day==32){
day=1;
month++;
}
}
}
}
程序分析:
主要是定义了日期,用最简单的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:
程序代码:
package PJ;
import card.CardSystem;
import place.Landindex;
public class MenuPrint {
public static void print1() {
System.out.println("0 - 查看地图\n1 - 查看原始地图\n2 - 使用道具\n3 - 前方十步内示警\n4 - 查看前后指定步数的具体信息\n5 - 查看玩家的资产信息\n6 - 想看的都看了,心满意足扔骰子"
+ "\n7 - 不玩了,认输\n8 - 股票");
System.out.print("请选择 :");
}
public static void printstock(int namei) {
Player player=new Player();
int[] stocks ;
for(int i=0;i<Entrance.players.size();i++){
if(Entrance.players.get(i).getNamei()==namei){
player=Entrance.players.get(i);
}
}
stocks=player.getStocks();
System.out.println("序号"+"\t\t"+"股票名"+"\t\t\t"+"单价"+"\t\t"+"涨跌幅"+"\t\t"+"持有量");
for(int i=0;i<=9;i++){
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]);
}
}
public static void printinitialmap(){
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;//初始化
}
}
for(int i=0;i<Landindex.mark.length;i++){
for(int x=0;x<=9;x++){
for(int y=0;y<=19;y++){
if(Landindex.mark[i].i==y&&Landindex.mark[i].j==x)
blank[x][y]=Landindex.mark[i].getchart();
}
}
}
for(int j=0;j<=9;j++){
for(int i=0;i<=19;i++ ){
System.out.print(blank[j][i]);
}
System.out.println();
}
}
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;
}
}
for(int i=0;i<Landindex.mark.length;i++){
for(int x=0;x<=9;x++){
for(int y=0;y<=19;y++){
if(Landindex.mark[i].i==y&&Landindex.mark[i].j==x)
blank[x][y]=Landindex.mark[i].getchart();
for(int k=0;k<Entrance.players.size();k++){
if(Entrance.players.get(k).getLocation()==i){
if(Entrance.players.get(k).getNamei()==1)
blank[Landindex.mark[i].j][Landindex.mark[i].i]=‘□‘;//玩家1所在位置
if(Entrance.players.get(k).getNamei()==2)
blank[Landindex.mark[i].j][Landindex.mark[i].i]=‘■‘;//玩家2所在位置
if(Entrance.players.get(k).getNamei()==3)
blank[Landindex.mark[i].j][Landindex.mark[i].i]=‘◇‘;//玩家3所在位置
if(Entrance.players.get(k).getNamei()==4)
blank[Landindex.mark[i].j][Landindex.mark[i].i]=‘◆‘;//玩家4所在位置
}
}
}
}
}
for(int j=0;j<=9;j++){
for(int i=0;i<=19;i++ ){
System.out.print(blank[j][i]);
}
System.out.println();
}
}
}
程序分析:
这是程序的菜单类,比如每个回合用户走到了哪里,地图上能够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:
程序代码:
package PJ;
public class Stock {
String name;
int number;//序号
double price;
int hold=0;//持有量
double increase;
public boolean state=false;
Stock(String name,int number,double price){
this.name=name;
this.number=number;
this.price=price;
}
public String getName(){
return name;
};
public int getNumber() {
return number;
}
public int getHold() {
return hold;
}
public void setHold(int i) {
this.hold=i;
}
public double getPrice() {
return price;
}
public double getIncrease() {
return increase;
}
public void run() {
increase=(Math.random()-0.5)*0.2;
increase=Double.parseDouble(String.format("%.2f",increase));
this.price=price*(1+increase);
this.price=Double.parseDouble(String.format("%.2f",price));
}
public static Stock[] stocksystem = new Stock [10];
static{
stocksystem[0]=new Stock("zhonghaifazhan",1,2.0);
stocksystem[1]=new Stock("dongfengqiche",2,1.5);
stocksystem[2]=new Stock("jinangangtie",3,1.8);
stocksystem[3]=new Stock("zhongguoguomao",4,2.5);
stocksystem[4]=new Stock("baoganggufen",5,2.7);
stocksystem[5]=new Stock("huanengguoji",6,2.9);
stocksystem[6]=new Stock("baoganggufen",7,3.3);
stocksystem[7]=new Stock("shanghaidianli",8,3.5);
stocksystem[8]=new Stock("zhongyuangaosu",9,3.2);
stocksystem[9]=new Stock("shanghaidianli",10,1.7);
}
}
程序分析:
stock类是用来定义股票的一个类,有利息运算increase函数increase=(Math.random()-0.5)*0.2;
,其中引用了random函数来确定股票的增长收入,以及每种股票最后写的那样stocksystem[0]=new Stock("zhonghaifazhan",1,2.0);
,每种的价格最开始处于一个固定的值,以后可以在完善的过程中加入新函数,不仅仅是random自带的math函数,更多的是更多杂凑函数的组合,让股票类能更多的无序。
EqualizedWealthCard
程序代码:
package card;
import place.Landindex;
import PJ.Entrance;
import PJ.Player;
public class EqualizedWealthCard extends CardSystem {
//均富卡
String name="EqualizedWealthCard";
String function="将所有人的现金平均分配";
String type="MagicCard";
String range="其他玩家(无视距离)";
EqualizedWealthCard(){
int point=40;
this.point=point;
}
@Override
public String getName() {
return name;
}
@Override
public String getFunction() {
// TODO Auto-generated method stub
return function;
}
@Override
public String getType() {
// TODO Auto-generated method stub
return type;
}
@Override
public int getPoint() {
return point;
}
@Override
public String getRange() {
// TODO Auto-generated method stub
return range;
}
@Override
public void print(int location, int namei) {
// TODO Auto-generated method stub
int tmp=0;
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);
}
System.out.println("卡牌使用成功");
}
}
代码分析:
这个代码程序是实现一个均富卡的功能,让所有玩家的资产平均分配。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
程序代码:
package card;
public class BlackCard extends CardSystem{
//黑卡
String name="BlackCard";
String function="使第二天这支股票下跌10%";
String type="ToolCard";
String range="特定的股票";
BlackCard(){
int point=20;
this.point=point;
}
@Override
public int getPoint() {
return point;
}
@Override
public String getName() {
return name;
}
@Override
public String getFunction() {
// TODO Auto-generated method stub
return function;
}
@Override
public String getType() {
// TODO Auto-generated method stub
return type;
}
@Override
public String getRange() {
// TODO Auto-generated method stub
return range;
}
@Override
public void print(int location, int who) {
// TODO Auto-generated method stub
System.out.print("该卡牌功能尚未开放,敬请期待");
}
}
程序分析
该程序对应Black card,其功能是使某支股票价在第二天下跌10%。其中,@Override起到了方便代码检查和维护的功能。public String getName() {return name;};
这段函数是为了获取这张卡片的名称。
public String getFunction() {// TODO Auto-generated method stubreturn function;}
以及后面的getType、gerRange功能和它类似,依次对应功能、类别、使用范围。 目前这张功能卡只完成了其模板的创建,主函数部分还未完成,所以该卡片的功能还不能在Jvaa程序上实现,我们组会在后续项目完善时将其补充完整。
MonsterCard
程序代码:
package card;
import PJ.Entrance;
import PJ.Player;
import place.Landindex;
public class MonsterCard extends CardSystem {
//怪兽卡
String name="MonsterCard";
String function="该街道所有土地重置为初始状态,即1级";
String type="MagicCard";
String range="停留地的整条街道";
MonsterCard(){
int point=20;
this.point=point;
}
@Override
public String getName() {
return name;
}
@Override
public String getFunction() {
// TODO Auto-generated method stub
return function;
}
@Override
public int getPoint() {
return point;
}
@Override
public String getType() {
// TODO Auto-generated method stub
return type;
}
@Override
public String getRange() {
// TODO Auto-generated method stub
return range;
}
@Override
public void print(int location, int who) {
// TODO Auto-generated method stub
Player playerow=new Player();
for(int i=0;i<Entrance.players.size();i++){
if(Entrance.players.get(i).getNamei()==Landindex.mark[location].owner){
playerow=Entrance.players.get(i);
}
}
Landindex.mark[location].level=1;
playerow.setHouseValue(playerow.getHouseValue()-Landindex.mark[location].price+Landindex.mark[location].intialprice);
Landindex.mark[location].price=Landindex.mark[location].intialprice;
}
}
代码分析:
这张卡为怪兽卡,其功能是当玩家抽到该卡片时,玩家所处街道上的所有土地降为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++)
加上该循环后,就完成了对每位玩家的检查和执行。
首先是主要函数中的Entrance
函数,因为游戏需要规定出参与游戏的人数,原计划是单独使用一个class
文件用来定义玩家数量和初始金钱等,直接利用Entrance
函数将其连接起来,但是发现发现如果将参与游戏的人数与Entrance
函数连接起来会增大工作量,在维护起来也会存在一定的问题,于是就减少了游戏的参与人数,将玩家的初始数据归入Entrance
函数中。
在菜单的选项中,遇到的问题是如何让参与游戏的玩家能直接获得地图信息、使用道具或者看到玩家个人信息等问题。因为我们的程序没有实现界面化,如果在一个界面下就可以成功的显示出以上所提到的信息。我们的解决方案是,在PJ
中加入一个MenuPrint
函数,里面显示为菜单打印功能,在每一步掷骰子结束后都会自动跳出来这个菜单,共玩家选择。这样就解决了之前遇到的玩家没法直接查询信息的问题。
在之前提到的彩票站(LotteryStation)对于金钱的计算,遇到的问题是在嵌套循环的时候有时候的金钱信息会发生错误,解决得问题是采用差额计算法,之前提到过解决办法,如果遇到金额小于购买彩票的金额是,在其之前加上一个循环语句,判断一下就可以解决。
在Card
方面,我们遇到如何在游戏的地图里获得卡牌,是选择随机出现还是有卡牌出售的地方,经过讨论,我们在地图里加一个Cardshop
函数,当掷骰子到该处时候就可以选择购买卡牌,并在Player
函数中记录该玩家的特殊卡牌功能。只需在CardShop
中显示出卡牌的种类及功能,具体的在Card
包中实现,每一个卡牌需要定义功能,使用对象等,在CardShop
中用move()
方法实现调用,就解决了问题。
展望:
我们原计划是希望有一个界面化,但是后来发现这个GUI界面化和简单的五子棋和贪吃蛇的界面不一样的。这个相较于内些复杂很多,所以希望如果有可能的话学习一下GUI界面化,对于这个游戏进行界面化设计运行程序的时候不单单在Idea的界面中,就会有质的改变。
改进:
在卡牌功能方面还有待提高,只有简单的几个卡牌,实现的功能不是很广泛,有时间的话在这方面应该还可以在改进一下。同样的在游戏的地图的设计方面,地图地点中由于编译能力的问题就没有实现很多其他种类的地方,像类似于Hospital
函数、Bank
函数、Park
函数、Land
函数、PolcieStation
函数代码几乎是一样的,只是不同地名而已,所以在这方面丰富度不是很高,在这方面也是需要提高。
我们队一共4个人,团队总分4*25=100
|团队成员|成员贡献|成绩分配| |20144303石宇森|负责博客的记录、部分函数的编译、辅助项目的编译。|22分| |20145301赵嘉鑫|负责博客的记录、项目主要代码的编译、资料查询等、对托管的代码进行检查与再编译等。|29分| |20145307陈俊达|负责博客的记录、项目主要的代码编译、托管过的代码检查再编译z。|26分| |20145335郝昊|负责主要博客记录、部分函数的编译、辅助项目的编译、其他程序的java语言翻译、代码的托管。 |23分|
标签:
原文地址:http://www.cnblogs.com/Big-Hit/p/5599304.html