Java课程设计-运用JavaFX的卡牌游戏


团队情况

  • 组长兼成员:廖浩轩
  • 主要任务:游戏运行代码和JavaFX的界面设计
  • 博客地址:本博客

前期调查

网上看到一个用扑克牌就能玩的桌游,基于此桌游规则实现游戏设计。

功能架构图

面向对象设计

包图

项目运行截图

登录

注册

游戏主界面

项目关键代码

util类

DbUtil:数据库连接

public class DbUtil {
	
	static String url="jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false";//数据库安装地址
	
	static String username="root";//数据库用户名
	
	static String password="123456";//数据库密码
	
	static String driver="com.mysql.cj.jdbc.Driver";//连接的驱动
	
	
	
	static {    //注册驱动
		try {
			Class.forName(driver);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static Connection getConn() {  //连接数据库
		try {
			return DriverManager.getConnection(url,username,password);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
}

Subtraction:卡牌计算

public class Subtraction {
	static String two="2";
	static BigDecimal num4=new BigDecimal(two);
		
	public static String bloodSubtraction(String blood1,String cardNum,String cardDecor) {   //血量计算
		BigDecimal num1=new BigDecimal(blood1);
		BigDecimal num2=new BigDecimal(cardNum);
		if(cardDecor.equals("4")) {
			BigDecimal num=num2.multiply(num4);    //打出黑桃牌造成点数双倍的伤害
			BigDecimal result =num1.subtract(num);
			String s=result.toString();
			return s;
		}else {
			BigDecimal result =num1.subtract(num2);
			String s=result.toString();
			return s;
		}
		
	}
	
	public  static String surplusSubtraction(String surplus,String num) {   //剩余卡牌计算
		BigDecimal num1=new BigDecimal(surplus);
		BigDecimal num2=new BigDecimal(num);
		BigDecimal result =num1.subtract(num2);
		String s=result.toString();
		return s;
	}
}

model类

Card:卡牌信息

public class Card {
	private int number;
	private int decor;
	public static final String[] DECOR= {"1","2","3","4"};
	public static final String[] NUMBER= {"1","2","3","4","5","6","7","8","9","10"};
	
	
	public String toString() {
		return DECOR[decor]+NUMBER[number];	
	}
	
	public Card(int decor,int number) {
		this.number=number;
		this.decor=decor;
	}
	
	public int getNumber() {
		return number;
	}
	
	public void setNumber(int number) {
		this.number = number;
	}
	
	public int getDecor() {
		return decor;
	}
	
	public void setDecor(int decor) {
		this.decor = decor;
	}

}

Momentum:变量

public class Momentum {
	private StringProperty aggressivity;
	private StringProperty blood;
	private StringProperty cardSurplus;
	
	public Momentum(StringProperty aggressivity,StringProperty blood,StringProperty cardSurplus) {
		this.aggressivity=aggressivity;
		this.blood=blood;
		this.cardSurplus=cardSurplus;
	}
	
	public Momentum(String aggressivity,String blood,String cardSurplus) {
		this.aggressivity=new SimpleStringProperty(aggressivity);
		this.blood=new SimpleStringProperty(blood);
		this.cardSurplus=new SimpleStringProperty(cardSurplus);
	}

	public StringProperty getAggressivity() {
		return aggressivity;
	}
	
	public void setAggressivity(StringProperty aggressivity) {
		this.aggressivity = aggressivity;
	}
	
	public StringProperty getBlood() {
		return blood;
	}
	
	public void setBlood(StringProperty blood) {
		this.blood = blood;
	}

	public StringProperty getCardSurplus() {
		return cardSurplus;
	}

	public void setCardSurplus(StringProperty cardSurplus) {
		this.cardSurplus = cardSurplus;
	}
	
}

dao类

UserDao:用户信息与数据库交互

public class UserDao {
	
	public User findUser(String username,String password) {   //查找用户
		Connection connection=DbUtil.getConn();
		String sql="select * from user_account where username=?";
		User user =null;
		PreparedStatement ps=null;
		ResultSet rs =null;
		try {
			ps = connection.prepareStatement(sql);
			ps.setString(1, username);
			rs =ps.executeQuery();
			while(rs.next()) {
				user=new User();
				user.setUsername(rs.getString("username"));
				user.setPassword(rs.getString("password"));
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				ps.close();
				rs.close();
				connection.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return user;
	}
		
	
	public boolean addUser(User user) {   //添加用户
		Connection conn =DbUtil.getConn();
		String sql="insert into user_account(username,password) values(?,?)";
		PreparedStatement ps=null;
		int result=0;
		try {
			ps= conn.prepareStatement(sql);
			ps.setString(1, user.getUsername());
			ps.setString(2, user.getPassword());
			result =ps.executeUpdate();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return result != -1;
	}
}

controller类

GameController:游戏界面控制(展示部分关键代码)

    public void changeUseMomentum(Momentum momentum) {   //修改用牌时变量
    	atk.textProperty().bind(momentum.getAggressivity());
    	blood.textProperty().bind(momentum.getBlood());
    	surplus.textProperty().bind(momentum.getCardSurplus());
    }
    
    public void changeDisappearMomentum(Momentum momentum) {   //修改弃牌时变量
    	surplus.textProperty().bind(momentum.getCardSurplus());
    }

    public void setMomentum() {   //初始化变量 
    	Momentum monentum= new Momentum(newatk,newblood,newsurplus);
    	changeUseMomentum(monentum);
    }

    public void getCards() {   //初始化牌组
		for(int i=0;i<4;i++) {
			for(int j=0;j<10;j++) {
				Card card=new Card(i,j);
				cards.add(card);
			}
		}
		Collections.shuffle(cards);
		showCards(cards);
    }
    
	public void showCards(List cards) {   //初始化手牌
		cardImages.add(cardImage1);
		cardImages.add(cardImage2);
		cardImages.add(cardImage3);
		cardImages.add(cardImage4);
		cardImages.add(cardImage5);
		cardImages.add(cardImage6);
		cardImages.add(cardImage7);
		cardImages.add(cardImage8);
		for (int i = 0; i < 8; i++) {
			cardImages.get(i).setImage(new Image("file:images/"+cards.get(0)+".png"));
			cards.remove(0);
		}
	}
public void calculationUseCard(ImageView cardImage) {   //修改用牌时点数计算
		@SuppressWarnings("deprecation")
		String s=cardImage.getImage().impl_getUrl();
		sendNum=Extract.extractNumbers(s);
		cardDecor=sendNum.substring(0, 1);
		cardNum=sendNum.substring(1);
		if(cardDecor.equals("1")) {
			clubSupplementCard(cardNum);
		}
		String result =Subtraction.bloodSubtraction(blood1,cardNum,cardDecor);
		String now=Subtraction.surplusSubtraction(surplus1, "1");
		Momentum monentum= new Momentum(atk1,result,now);
    	changeUseMomentum(monentum);
		blood1=result;
		surplus1=now;
    }
	
	public void calculationDisappearCard(ImageView cardImage) {   //修改弃牌时点数计算
		@SuppressWarnings("deprecation")
		String s=cardImage.getImage().impl_getUrl();
		sendNum=Extract.extractNumbers(s);
		cardDecor=sendNum.substring(0, 1);
		cardNum=sendNum.substring(1);
		String result =blood1;
		String now=Subtraction.surplusSubtraction(surplus1, "1");
		Momentum monentum= new Momentum(atk1,result,now);
    	changeDisappearMomentum(monentum);
		blood1=result;
		surplus1=now;
	}

改进及感想

感想:虽然项目看起来不难,但一个人做的话各个知识点都需要学习,有些时间不足,尝试不同于swing的JavaFX界面设计时花费蛮多时间,但是上手后能实现不错的效果,游戏功能只是基本实现,和原本的规则比起来还差很多,后续游戏逻辑不难但唯独就是时间不够了,日后有待完善空间。经过这次课设让我对面向对象编程有了更深刻的理解,同时也学到了很多新知识,虽然只是浅尝辄止,但相信对我日后的学习会有帮助,同时有感叹计算机技术的高深,一项一项技术组合起来就能实现非常棒的项目,期待之后的学习中能加深理解,以后利用更多的知识实现更多的的功能,创造更好的项目。
改进

  • 卡牌的model或许可以写入数据库中,既方便读取也方便增改,以达到出牌补牌的操作
  • JavaFX的动画功能和音乐功能还没有深刻学习,同时在这次项目中也没有运用,后续添加可以得到更好的体验
  • 界面设计可以更加的合理和美观,功能可以更加的丰富和详细
  • 游戏功能有待完全实现

相关