diff --git a/src/game21/Card.java b/src/game21/Card.java index fa1c1a6..6563b6b 100644 --- a/src/game21/Card.java +++ b/src/game21/Card.java @@ -1,24 +1,66 @@ package game21; +import java.util.Random; + +//abstract public class Card { - private Integer id; - private String suit; - private String number; - - public void setCard(Integer id, String number, String suit) { - this.number = number; - this.id = id; - this.suit = suit; + private int cardId; + private String cardSuit; + private String cardNum; + + // 随机生成cardId放到获取方法中,节省新建对象数目 + public int getCardId() { + this.cardId = new Random().nextInt(52); + return cardId; } - public Integer getId() { - return id; + + // 按照一定的方法将ID转换成卡牌信息 + public String getCard(int cardId) { + String card = getCardSuit(cardId) + getCardNum(cardId); + return card; } - public String getSuit() { - return suit; + + public String getCardSuit(int cardId) { + // cardSuit = Integer.toString((cardId / 13 + 1)) + switch ((cardId / 13 + 1)) { + case 1: + cardSuit = "黑桃"; + break; + case 2: + cardSuit = "红桃"; + break; + case 3: + cardSuit = "梅花"; + break; + case 4: + cardSuit = "方块"; + break; + default: + break; + } + return cardSuit; } - public String getNumber() { - return number; + + public String getCardNum(int cardId) { + // cardNum = Integer.toString((cardId % 13 + 1)) + switch (cardId % 13 + 1) { + case 1: + cardNum = "A"; + break; + case 11: + cardNum = "J"; + break; + case 12: + cardNum = "Q"; + break; + case 13: + cardNum = "K"; + break; + default: + cardNum = Integer.toString((cardId % 13 + 1)); + break; + } + return cardNum; } - - + } diff --git a/src/game21/CardInHand.java b/src/game21/CardInHand.java new file mode 100644 index 0000000..66b87c9 --- /dev/null +++ b/src/game21/CardInHand.java @@ -0,0 +1,17 @@ +package game21; + +import java.util.ArrayList; +import java.util.List; + +public class CardInHand { + private List cardInHand = new ArrayList(); + + public List getCardInHand() { + return cardInHand; + } + + public void addCardInHand(int card) { + this.cardInHand.add(card); + } + +} diff --git a/src/game21/Checkinput.java b/src/game21/Checkinput.java new file mode 100644 index 0000000..0216439 --- /dev/null +++ b/src/game21/Checkinput.java @@ -0,0 +1,11 @@ +package game21; + +public class Checkinput { + public boolean chkPassword(String userPassword, String userRptPassword) { + if (userPassword.equals(userRptPassword)) + return true; + return false; + } + + //WIP:各种非法输入判断。 +} diff --git a/src/game21/InputStream.java b/src/game21/InputStream.java new file mode 100644 index 0000000..99b9803 --- /dev/null +++ b/src/game21/InputStream.java @@ -0,0 +1,126 @@ +package game21; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.util.Scanner; + +public class InputStream { + private Scanner in = new Scanner(System.in); + + public String inputString() { + // WIP:输入含有空格后自动忽略。 + String inputstring = in.next(); + return inputstring; + } + + /** + * overloading inputString(),增加限定输入范围 特性: 当最小值大于最大值时候互换数值保证程序健壮 限定接受的数值范围,保证程序健壮 + * + * @param minLength + * 可接受的取值范围:1-255 + * @param maxLength + * 可接受的取值范围:1-255 + * @return + * @throws IllegalArgumentException + * 非法范围的参数值 + */ + public String inputString(int minLength, int maxLength) throws IllegalArgumentException { + // 检查输入参数的合法性 + boolean chklegal = minLength <= 0 || maxLength <= 0 || minLength > 255 || maxLength > 255; + if (chklegal) { + throw new IllegalArgumentException("非法参数范围!取值范围为1-255。"); + } + // ADD:检查长度限定,如果最小值大于最大值,交换值 + if (minLength > maxLength) { + minLength += maxLength; + maxLength = minLength - maxLength; + minLength = minLength - maxLength; + } + String tmp; + do { + tmp = inputString(); + if (tmp.length() < minLength) { + System.out.println("输入长度过短,请输入大于" + minLength + "长度的字符!"); + } else if (tmp.length() > maxLength) { + System.out.println("输入长度过长,请输入小于" + maxLength + "长度的字符!"); + } + } while (tmp.length() < minLength || tmp.length() > maxLength); + return tmp; + } + + /** + * overloading inputint() 增加输入范围的设置 + * + * @param min + * @param max + * @return + * @throws IllegalArgumentException + * 非法范围的参数值 + */ + public int inputint(int min, int max) throws IllegalArgumentException { + // 输入合法性检验 + boolean illegal = min <= 0 || max <= 0 || min > 255 || max > 255; + if (illegal) { + throw new IllegalArgumentException("非法参数范围!取值范围为1-255。"); + } + if (min > max) { + min = min + max; + max = min - max; + min = min - max; + } + int inputint = 0; + do { + try { + inputint = in.nextInt(); + } catch (Exception e) { + System.out.println("请输入整数!"); + } + if (inputint < min) { + System.out.println("输入数据超限!请输入大于" + min + "的数值"); + } else if (inputint > max) { + System.out.println("输入数据超限!请输入小于" + max + "的数值"); + } + } while (inputint < min || inputint > max); + return inputint; + } + + /* + * 登陆数据载入以及验证登陆 + */ + private static final String DATABASE_PATH = "./UserDatabase/"; + + static { + File temp = new File(DATABASE_PATH); + temp.mkdirs(); + } + + public boolean extUser(String name) { + File temp = new File(DATABASE_PATH + name + ".txt"); + return temp.exists(); + } + + public boolean chkPassword(String name, String password) + throws FileNotFoundException, IOException, ClassNotFoundException { + if (!extUser(name)) { + System.out.println("用户名不存在或者密码错误!"); + return false; + } + User user = readUserInfo(name); + if (!user.getUserPassword().equals(password)) { + System.out.println("用户名不存在或者密码错误!"); + return false; + } + return true; + } + + public User readUserInfo(String name) throws FileNotFoundException, IOException, ClassNotFoundException { + File temp = new File(DATABASE_PATH + name + ".txt"); + ObjectInputStream ois = new ObjectInputStream(new FileInputStream(temp)); + User user = (User) ois.readObject(); + ois.close(); + return user; + } +} diff --git a/src/game21/MainManu.java b/src/game21/MainManu.java deleted file mode 100644 index 99041c4..0000000 --- a/src/game21/MainManu.java +++ /dev/null @@ -1,213 +0,0 @@ -package game21; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.Scanner; - -public class MainManu { - static Player player = new Player(); - static Scanner in = new Scanner(System.in); - - public static void addPlayer() { - System.out.print("请输入玩家数量(2-4人):"); - int playernum = 0; - do { - try { - in = new Scanner(System.in); - playernum = in.nextInt(); - } catch (Exception e) { - System.out.println("请输入正整数!"); - } - if (playernum < 2 || playernum > 4) { - System.out.println("请输入正确的人数"); - } - } while (playernum < 2 || playernum > 4); - List playerId = player.getPlayerId(); - String tempPlayerId; - for (int i = 0; i < playernum; i++) { - do { - System.out.println("请输入第" + (i + 1) + "个玩家的ID:"); - in = new Scanner(System.in); - tempPlayerId = in.nextLine(); - if (playerId.contains(tempPlayerId)) { - System.out.println("该名玩家已存在,请换一个ID!"); - } else if (tempPlayerId.isEmpty()) { - System.out.println("玩家名不得为空!请输入玩家名!"); - } - } while (playerId.contains(tempPlayerId) || tempPlayerId.isEmpty()); - player.setNewPlayerId(tempPlayerId); - tempPlayerId = null; - } - } - - public static Card prepareCard() { - Random r = new Random(); - Integer id = r.nextInt(52); - - Card c = new Card(); - String cardNum = Integer.toString(id % 13 + 1); - String cardSuit = Integer.toString(id / 13 + 1); - switch (cardNum) { - case "1": - cardNum = "A"; - break; - case "11": - cardNum = "J"; - break; - case "12": - cardNum = "Q"; - break; - case "13": - cardNum = "K"; - break; - default: - break; - } - switch (cardSuit) { - case "1": - cardSuit = "黑桃"; - break; - case "2": - cardSuit = "红桃"; - break; - case "3": - cardSuit = "梅花"; - break; - case "4": - cardSuit = "方片"; - break; - default: - break; - } - c.setCard(id, cardNum, cardSuit); - return c; - } - - public static Card cardInHand() { - Card temp = MainManu.prepareCard(); - List cardinhand = player.getCardInHand(); - List cardId = new ArrayList(); - for (Card card : cardinhand) { - cardId.add(card.getId()); - } - if (cardId.contains(temp.getId())) { - MainManu.cardInHand(); - } else { - player.CardInHand.add(temp); - } - return temp; - } - - public static void showCardInHand(List cardinhand) { - // List cardinhand = player.getCardInHand(); - int cardSize = cardinhand.size(); - String[] Cards = new String[cardSize]; - for (int i = 0; i < cardSize; i++) { - Cards[i] = cardinhand.get(i).getSuit() + cardinhand.get(i).getNumber(); - } - for (String cards : Cards) { - System.out.println(cards); - } - } - - public static int numberInHand(List cardinhand) { - int num = 0; - int cardnum = 0; - for (Card card : cardinhand) { - cardnum = card.getId() % 13; - switch (cardnum) { - case 10: - case 11: - case 12: - cardnum = 9; - break; - default: - break; - } - num += (cardnum + 1); - } - - return num; - } - - public static void drawCard(String Player, List cards, List> eachCardInHand, int i) { - System.out.print("玩家" + Player + "的手牌是:"); - for (Card card : eachCardInHand.get(i)) { - System.out.print(card.getSuit() + card.getNumber() + ","); - } - System.out.println("玩家现在手牌分数为:" + numberInHand(cards) + ";"); - // MainManu.showCardInHand(eachCardInHand.get(i)); - while (numberInHand(cards) < 21) { - String drawCard; - do { - System.out.println("是否要再抓一张?[Y/N]"); - in = new Scanner(System.in); - drawCard = in.nextLine(); - if (!(drawCard.equalsIgnoreCase("Y") || drawCard.equalsIgnoreCase("N")) || drawCard.isEmpty()) { - System.out.println("输入有误,请重新输入!"); - } - } while (!(drawCard.equalsIgnoreCase("Y") || drawCard.equalsIgnoreCase("N")) || drawCard.isEmpty()); - System.out.println(drawCard); - if (numberInHand(cards) < 21 && drawCard.equalsIgnoreCase("Y")) { - cards.add(cardInHand()); - eachCardInHand.add(i, cards); - drawCard(Player, cards, eachCardInHand, i); - break; - } else { - break; - } - } - } - - public static String compareWinner(List winner) { - int bigger = 0; - int winnerplayer = 0; - String win; - for (int i = 0; i < winner.size(); i++) { - if (winner.get(i) <= 21 && winner.get(i) >= bigger) { - if (winner.get(i) == bigger || bigger == 0) { - win = "平局!"; - } - bigger = winner.get(i); - winnerplayer = (i+1); - } - } - if (winnerplayer != 0) { - win = Integer.toString(winnerplayer); - } else { - win = "平局!"; - } - - return win; - } - - public static void playgame() { - List players = player.getPlayerId(); - List> eachCardInHand = new ArrayList>(); - List winner = new ArrayList(); - for (int i = 0; i < players.size(); i++) { - List cards = new ArrayList(); - String Player = players.get(i); - System.out.println("第" + (i + 1) + "位玩家开始游戏!"); - cards.add(MainManu.cardInHand()); - eachCardInHand.add(i, cards); - cards.add(MainManu.cardInHand()); - eachCardInHand.add(i, cards); - drawCard(Player, cards, eachCardInHand, i); - System.out.println("玩家" + Player + "手牌最终分数为:" + numberInHand(cards)); - winner.add(numberInHand(cards)); - } - System.out.println(compareWinner(winner)); - } - - public static void main(String[] args) { - System.out.println("==================="); - System.out.println(); - System.out.println(" 欢迎玩21点游戏"); - System.out.println(); - System.out.println("==================="); - MainManu.addPlayer(); - MainManu.playgame(); - } -} diff --git a/src/game21/MainUI.java b/src/game21/MainUI.java new file mode 100644 index 0000000..4ef1f4f --- /dev/null +++ b/src/game21/MainUI.java @@ -0,0 +1,14 @@ +package game21; + +import java.util.Scanner; + +public class MainUI { + public static void main(String[] args) { + //声明Scanner为了游戏结束后关闭IO输入。 + Scanner in = new Scanner(System.in); + + + //关闭IO输入 + in.close(); + } +} diff --git a/src/game21/OutputStream.java b/src/game21/OutputStream.java new file mode 100644 index 0000000..1ebeb59 --- /dev/null +++ b/src/game21/OutputStream.java @@ -0,0 +1,67 @@ +package game21; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; + +public class OutputStream { + // 读取文件 + private static final String DATABASE_PATH = "./UserDatabase/"; + + // 保证用户路径存在 + static { + File temp = new File(DATABASE_PATH); + temp.mkdirs(); + } + + public boolean extUser(String name) { + File temp = new File(DATABASE_PATH + name + ".txt"); + return temp.exists(); + } + + /** + * + * @param name + * @param password + * @return + * @throws FileNotFoundException + * @throws IOException + */ + public boolean newUser(String name, String password) throws FileNotFoundException, IOException { + File temp = new File(DATABASE_PATH + name + ".txt"); + if (extUser(name)) { + System.out.println("用户已存在!请换一个ID"); + return true; + } + //序列化输出到文件中 + temp.createNewFile(); + ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(temp)); + User user = new User(name, password, 0, 0); + oos.writeObject(user); + oos.close(); + System.out.println("新用户已创建!欢迎新用户:" + name); + return false; + } + + /** + * + * @param name + * @param password + * @param winTimes + * @param totalGameTimes + * @throws FileNotFoundException + * @throws IOException + */ + public void logout(String name,String password,int winTimes,int totalGameTimes) throws FileNotFoundException, IOException { + File temp = new File(DATABASE_PATH + name + ".txt"); + temp.createNewFile(); + ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(temp)); + User user = new User(name, password, winTimes, totalGameTimes); + oos.writeObject(user); + oos.close(); + System.out.println("用户:" + name+"已登出。"); + } + +} diff --git a/src/game21/Player.java b/src/game21/Player.java index 876c47e..c14d324 100644 --- a/src/game21/Player.java +++ b/src/game21/Player.java @@ -3,21 +3,27 @@ import java.util.ArrayList; import java.util.List; +/** + * 单例化Player,使用单例模式保证此对象在一次执行过程中内唯一 + * + * @author subtank + * + */ public class Player { - private List PlayerId = new ArrayList(); - public List CardInHand = new ArrayList(); - - public List getCardInHand() { - return CardInHand; + //实例化一个私有的Player对象 + private static Player instance = new Player(); + //将构造函数私有化,保证不会实例化 + private Player() {}; + //提供唯一的可用对象 + public static Player getInstance() { + return instance; } - public List getPlayerId() { - return PlayerId; + private List players = new ArrayList(); + public List getPlayersId() { + return players; } - - public void setNewPlayerId(String playerId) { - this.PlayerId.add(playerId); - //WIP: Add to Database and check + public void addPlayersId(User players) { + this.players.add(players); } - } diff --git a/src/game21/PlayerCardInHand.java b/src/game21/PlayerCardInHand.java new file mode 100644 index 0000000..cce7aff --- /dev/null +++ b/src/game21/PlayerCardInHand.java @@ -0,0 +1,30 @@ +package game21; + +import java.util.ArrayList; +import java.util.List; +/** + * 所有玩家手牌集合,使用单例模式保证此对象在一次执行过程中内唯一 + * + * @param playerCardInHand,一个存放每一个玩家的所有手牌的List + * @author subtank + * + */ +public class PlayerCardInHand { + //实例化一个私有的Player对象 + private static PlayerCardInHand instance = new PlayerCardInHand(); + //将构造函数私有化,保证不会实例化 + private PlayerCardInHand() {}; + //提供唯一的可用对象 + public static PlayerCardInHand getInstance() { + return instance; + } + + private List playerCardInHand = new ArrayList(); + public List getPlayerCardInHand() { + return playerCardInHand; + } + public void addPlayerCardInHand(CardInHand cardInHand) { + //将一个玩家的手牌集合视为一个元素添加到所有玩家手牌集合 + playerCardInHand.add(cardInHand); + } +} diff --git a/src/game21/Testmain.java b/src/game21/Testmain.java new file mode 100644 index 0000000..422cd20 --- /dev/null +++ b/src/game21/Testmain.java @@ -0,0 +1,57 @@ +package game21; + +public class Testmain { + public static void main(String[] args) { + // Player playerList = Player.getInstance(); + // Card temp = new Card(); + // System.out.println(temp.getCardSuit() + temp.getCardNum()); + /* + * PlayerCardInHand cardsList = PlayerCardInHand.getInstance(); + * + * Card temp = new Card(); Card temp3 = new Card(); CardInHand temp2 = new + * CardInHand(); temp2.addCardInHand(temp); temp2.addCardInHand(temp3); + * cardsList.addPlayerCardInHand(temp2); + * System.out.println(cardsList.getPlayerCardInHand()); + * System.out.println(temp2.getCardInHand()); + * System.out.println(temp.getCardNum(temp.getCardId())); + * System.out.println(temp3.getCardNum(temp3.getCardId())); + * System.out.println(temp.getCardId()); System.out.println(temp3.getCardId()); + */ + /* + * User temp = new User(); System.out.println(temp.chkPassword("13", "111")); + */ + /* + * 测试生成单个玩家手牌以及获取各种信息 Card temp = new Card(); int tmp1 = temp.getCardId(); int + * tmp2 = temp.getCardId(); System.out.println(tmp1 + "-" + + * temp.getCardSuit(tmp1) + temp.getCardNum(tmp1)); System.out.println(tmp2 + + * "-" + temp.getCardSuit(tmp2) + temp.getCardNum(tmp2)); CardInHand test = new + * CardInHand(); test.addCardInHand(tmp1); test.addCardInHand(tmp2); + * List test2 = new ArrayList(); test2 = test.getCardInHand(); + * System.out.println(temp.getCard(test2.get(0))); + */ + + //测试非法输入 +// InputStream temp = new InputStream(); +// temp.inputString(0, 0); +// System.out.println("success!"); + + //测试序列化 +// OutputStream temp = new OutputStream(); +// try { +// temp.newUser("test", "password"); +// } catch (IOException e) { +// e.printStackTrace(); +// } + +// InputStream test = new InputStream(); +// User user = null; +// try { +// user = (User) test.readUserInfo("test"); +// } catch (ClassNotFoundException | IOException e) { +// e.printStackTrace(); +// } +// System.out.println(user.getUserName()); +// System.out.println(user.getUserPassword()); +// System.out.println(user.getUserRptPassword()); + } +} diff --git a/src/game21/User.java b/src/game21/User.java new file mode 100644 index 0000000..443e043 --- /dev/null +++ b/src/game21/User.java @@ -0,0 +1,88 @@ +package game21; + +public class User implements java.io.Serializable { + private static final long serialVersionUID = 6877825214033390995L; + private String userName, userPassword; + private transient String userRptPassword; + + // ADD:增加功能,记录获胜次数以及游玩次数。 + private Integer winTimes, totalGameTimes; + + public User(String userName,String userPassword,Integer winTimes,Integer totalGameTimes) { + this.userName = userName; + this.userPassword = userPassword; + this.winTimes = winTimes; + this.totalGameTimes = totalGameTimes; + } + public Integer getWinTimes() { + return winTimes; + } + + public void setWinTimes(Integer winTimes) { + this.winTimes = winTimes; + } + + public Integer getTotalGameTimes() { + return totalGameTimes; + } + + public void setTotalGameTimes(Integer totalGameTimes) { + this.totalGameTimes = totalGameTimes; + } + + transient InputStream in = new InputStream(); + + public void setUserName(String userName) { + this.userName = userName; + } + + // overloading + public void setUserName() { + final int MIN_LANGTH = 4; + final int MAX_LANGTH = 10; + String userName = in.inputString(MIN_LANGTH, MAX_LANGTH); + this.userName = userName; + } + + public void setUserPassword(String userPassword) { + this.userPassword = userPassword; + } + + // overloading + public void setUserPassword() { + final int MIN_LANGTH = 6; + final int MAX_LANGTH = 16; + String userPassword = in.inputString(MIN_LANGTH, MAX_LANGTH); + /* + * MD5加密方法 + */ + this.userPassword = userPassword; + } + + public void setUserRptPassword(String userRptPassword) { + this.userRptPassword = userRptPassword; + } + + // overloading + public void setUserRptPassword() { + final int MIN_LANGTH = 6; + final int MAX_LANGTH = 16; + String userRptPassword = in.inputString(MIN_LANGTH, MAX_LANGTH); + /* + * MD5加密方法 + */ + this.userRptPassword = userRptPassword; + } + + public String getUserName() { + return userName; + } + + public String getUserPassword() { + return userPassword; + } + + public String getUserRptPassword() { + return userRptPassword; + } +} diff --git a/src/game21/UserSerializable.java b/src/game21/UserSerializable.java new file mode 100644 index 0000000..b88ca39 --- /dev/null +++ b/src/game21/UserSerializable.java @@ -0,0 +1,51 @@ +package game21; + +public class UserSerializable /*extends User*/ implements java.io.Serializable{ + private static final long serialVersionUID = 4357209040985916893L; + private String userName, userPassword; + private Integer winTimes, totalGameTimes; + + public UserSerializable(String userName,String userPassword,Integer winTimes,Integer totalGameTimes) { + this.userName = userName; + this.userPassword = userPassword; + this.winTimes = winTimes; + this.totalGameTimes = totalGameTimes; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getUserPassword() { + return userPassword; + } + + public void setUserPassword(String userPassword) { + this.userPassword = userPassword; + } + + public Integer getWinTimes() { + return winTimes; + } + + public void setWinTimes(Integer winTimes) { + this.winTimes = winTimes; + } + + public Integer getTotalGameTimes() { + return totalGameTimes; + } + + public void setTotalGameTimes(Integer totalGameTimes) { + this.totalGameTimes = totalGameTimes; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + +}