题目

题目比较长,我直接放截图吧

简述

  一个比较经典的类与对象的题目,三个类实现了一个比较简单的系统,具体的每个类的要求可以从上面的题目描述中看出(只要你有耐心读完。。),不再赘述,代码如下

代码实现

整体设计

  类和属性、方法

NimGame类

 /**
* @author jyroy
* NimGame类
*/
public class NimGame {
public int stonecount;
public int upperremoval;
public String player1;
public String player2; }

NimPlayer类

 import java.text.DecimalFormat;

 /**
* @author jyroy
* player类
*/
public class NimPlayer {
private String username;
private String familyname;
private String givenname;
private int gamesplayed;
private int gameswon;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getFamilyname() {
return familyname;
}
public void setFamilyname(String familyname) {
this.familyname = familyname;
}
public String getGivenname() {
return givenname;
}
public void setGivenname(String givenname) {
this.givenname = givenname;
}
public int getGamesplayed() {
return gamesplayed;
}
public void setGamesplayed(int gamesplayed) {
this.gamesplayed = gamesplayed;
}
public int getGameswon() {
return gameswon;
}
public void setGameswon(int gameswon) {
this.gameswon = gameswon;
}
@Override
public String toString() {
return username + "," + familyname + "," + givenname
+ "," + gamesplayed + " games, " + gameswon + " wins";
} public String rate() {
return String.valueOf(gameswon/gamesplayed*100);
} public void rank() {
String s = gameswon/gamesplayed*100+"%";
DecimalFormat df=new DecimalFormat("00");
String str2=df.format(gamesplayed);
System.out.printf("%-5s",s);
System.out.printf("| ");
System.out.printf(str2 + " games | "+givenname + " " + familyname+"\n");
} }

NimSystem类

 import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.TreeMap; /**
* @author jyroy
* NimSystem类
*/
public class NimSys { static ArrayList<NimPlayer> playerList = new ArrayList<NimPlayer>(); /**
* add a new user
* @param username
* @param family_name
* @param given_name
*/
public static void addplayer(String username,String family_name, String given_name) {
NimPlayer nimplayer = new NimPlayer();
nimplayer.setUsername(username);
nimplayer.setFamilyname(family_name);
nimplayer.setGivenname(given_name);
nimplayer.setGamesplayed(0);
nimplayer.setGameswon(0);
for(int i=0;i<playerList.size();i++) {
if(playerList.get(i).getUsername().equals(username)) {
System.out.println("The player already exists.");
return;
}
}
playerList.add(nimplayer);
return;
} /**
* remove a user or all users
* @param username
*/
public static void removeplayer(String username) {
if(username!=null) {
for(int i=0;i<playerList.size();i++) {
if(playerList.get(i).getUsername().equals(username)) {
playerList.remove(i);
return;
}
}
System.out.println("The player does not exist.");
return;
}else if(username==null) {
System.out.println("Are you sure you want to remove all players? (y/n)");
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
if(s.equals("y")) {
playerList.clear();
}
return;
}
} /**
* edit a user
* @param username
* @param family_name
* @param given_name
*/
public static void editplayer(String username,String family_name, String given_name) {
for(int i=0;i<playerList.size();i++) {
if(playerList.get(i).getUsername().equals(username)) {
playerList.get(i).setUsername(username);
playerList.get(i).setFamilyname(family_name);
playerList.get(i).setGivenname(given_name);
return;
}
}
System.out.println("The player does not exist.");
return;
} /**
* reset a user
* @param username
*/
public void resetstats(String username) {
if(username!=null) {
for(int i=0;i<playerList.size();i++) {
if(playerList.get(i).getUsername().equals(username)) {
playerList.get(i).setGamesplayed(0);
playerList.get(i).setGameswon(0);
return;
}
}
System.out.println("The player does not exist.");
}else if(username==null) {
System.out.println("Are you sure you want to reset all player statistics? (y/n)");
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
if(sc.equals("y")) {
for(int i=0;i<playerList.size();i++) {
playerList.get(i).setGamesplayed(0);
playerList.get(i).setGameswon(0);
}
}
}
} /**
* display a user or all users
* @param username
*/
public static void displayplayer(String username) {
if(username!=null) {
for(int i=0;i<playerList.size();i++) {
if(playerList.get(i).getUsername().equals(username)) {
System.out.println(playerList.get(i).toString());
return;
}
}
System.out.println("The player does not exist.");
}else if(username==null) {
for(int i=0;i<playerList.size();i++) {
System.out.println(playerList.get(i).toString());
}
}
return;
} /**
* rank all users in desc or asc
* @param order
*/
public static void rankings(String order) {
Map<String, String> map = new TreeMap<String, String>();
for(int i=0;i<playerList.size();i++) {
map.put(playerList.get(i).getUsername(), playerList.get(i).rate());
}
if(order==null||order.equals("desc")){
List<Entry<String, String>> list = new ArrayList<Entry<String, String>>(map.entrySet()); Collections.sort(list,new Comparator<Map.Entry<String,String>>() { public int compare(Entry<String, String> o1, Entry<String, String> o2) {
return o2.getValue().compareTo(o1.getValue());
}
}); int c=0;
Iterator<Entry<String, String>> it2 = list.iterator();
while(it2.hasNext()) {
Entry<String, String> entry = it2.next();
for(int j=0;j<playerList.size();j++) {
if(entry.getKey().equals(playerList.get(j).getUsername())) {
playerList.get(j).rank();
}
}
if(c==9) {
return;
}
c+=1;
}
}else if(order.equals("asc")) {
Iterator<Entry<String, String>> it2 = map.entrySet().iterator();
int c=0;
while(it2.hasNext()) {
Entry<String, String> entry = it2.next();
for(int j=0;j<playerList.size();j++) {
if(entry.getKey().equals(playerList.get(j).getUsername())) {
playerList.get(j).rank();
}
}
if(c==9) {
return;
}
c+=1;
}
}
} /**
* start a game
* @param initialstones
* @param upperbound
* @param username1
* @param username2
*/
public static void startgame(int initialstones, int upperbound, String username1, String username2) {
int f=0;
NimPlayer player1 = null;
NimPlayer player2 = null;
for(int i=0;i<playerList.size();i++) {
if(playerList.get(i).getUsername().equals(username1)) {
f+=1;
player1 = playerList.get(i);
}else if(playerList.get(i).getUsername().equals(username2)) {
f+=1;
player2 = playerList.get(i);
}
}
if(f==2) {
System.out.println("\n"+"Initial stone count:" + initialstones);
System.out.println("Maximum stone removal: " + upperbound);
System.out.println("Player 1: " + player1.getGivenname() + " " + player1.getFamilyname());
System.out.println("Player 2: " + player2.getGivenname() + " " + player2.getFamilyname()+"\n");
int currentstone = initialstones;
int round = 1;
while(round>0) {
System.out.printf("\n"+currentstone + "stones left: ");
for(int i1=0;i1<currentstone;i1++) {
System.out.printf("* ");
}
if(round%2==1) {
System.out.println("\n"+username1 + "’s turn - remove how many?");
}else {
System.out.println("\n"+username2 + "’s turn - remove how many?");
}
Scanner sc=new Scanner(System.in);
int s=sc.nextInt();
if(s>upperbound) {
System.out.println("Invalid move. You must remove between 1 and " + upperbound + "stones.");
continue;
}else if(s==0) {
System.out.printf("Invalid move. You must remove between 1 and ");
if(upperbound>currentstone) {
System.out.print(currentstone);
}else {
System.out.print(upperbound);
}
System.out.printf("stones.");
continue;
}else {
currentstone -= s;
}
if(currentstone==0) {
System.out.println("Game Over");
if(round%2==1) {
System.out.println(username2 + " wins!");
player2.setGameswon(player2.getGameswon()+1);
player2.setGamesplayed(player2.getGamesplayed()+1);
player1.setGamesplayed(player1.getGamesplayed()+1);
return;
}else {
System.out.println(username1 + " wins!");
player1.setGameswon(player1.getGameswon()+1);
player1.setGamesplayed(player1.getGamesplayed()+1);
player2.setGamesplayed(player2.getGamesplayed()+1);
return;
}
}
round+=1;
}
}else {
System.out.println("One of the players does not exist.");
return;
}
}
/**
* Exits the Nimsys program
*/
public static void exit() {
System.out.println("");
System.exit(0);
} public static void main(String[] args) {
System.out.println("Welcome to Nim");
while(true) {
System.out.printf("$");
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
String[] arr = s.split(" ");
if(arr[0].equals("addplayer")) {
addplayer(arr[1].split(",")[0], arr[1].split(",")[1], arr[1].split(",")[2]);
}else if(arr[0].equals("removeplayer")){
if(arr.length!=1) removeplayer(arr[1]);
else removeplayer(null);
}else if(arr[0].equals("editplayer")) {
editplayer(arr[1].split(",")[0], arr[1].split(",")[1], arr[1].split(",")[2]);
}else if(arr[0].equals("displayplayer")) {
if(arr.length!=1) displayplayer(arr[1]);
else displayplayer(null);
}else if(arr[0].equals("rankings")) {
if(arr.length!=1) rankings(arr[1]);
else rankings(null);
}else if(arr[0].equals("startgame")) {
startgame(Integer.parseInt(arr[1].split(",")[0]), Integer.parseInt(arr[1].split(",")[1]), arr[1].split(",")[2], arr[1].split(",")[3]);
}else if(arr[0].equals("exit")) {
exit();
}
}
} }

NimSystem实现的更多相关文章

随机推荐

  1. 在wcharczuk/go-chart图表上打印文字

    先看效果: 源码 package main import (    "bytes"    "fmt"    "io/ioutil"    & ...

  2. tomcat9上传文件失败错误

    项目上线正常运行一段时间后,有一天突然所有的附件上传都出现了错误,查找项目本身的日志系统也一致没有跟踪到错误.经过几番折腾,在tomcat9-stdout.log日志中发现如下异常: ERROR or ...

  3. go-gui-控件和信号

    go-gui-控件和信号 控件 控件简介 控件是对数据和方法的封装.控件有自己的属性和方法.属性是指控件的特征.方法是指控件的一些简单而可见的功能.如按钮就是一个控件,这个按钮是方形的,里面有张图片, ...

  4. python登陆代码简单逻辑

    孩子:妈妈,我想要一个登陆的接口 妈妈:写,现在写,写1个够吗? 孩子:够了,妈妈真好,谢谢妈妈. 需求写一个简单的登陆逻辑: 1.定义一个账号和密码 2.输入账号和密码,密码要求密文 3.输入正确提 ...

  5. Winform中在使用Dock属性设计页面布局控件的顺序导致页面效果不同的问题

    场景 在Winform中进行页面设计时,常使用控件的Dock属性来进行布局调整.但是由于设置属性的顺序问题,导致达不到想要的效果. 比如以下两个控件 下面的控件设置的Dock属性是Bottom,即在页 ...

  6. HTTP中的2XX状态码

    HTTP状态码分类 1XX --信息,服务器收到请求,需要请求者继续执行操作 2XX--成功,操作被成功接收并处理 3XX--重定向,需要进一步的操作以完成请求 4XX--客户端错误,请求包含语法错误 ...

  7. Java 线程与多线程

    Java是一门支持多线程的编程语言! 什么是进程? 计算机中内存.处理器.IO等资源操作都要为进程进行服务. 一个进程上可以创建多个线程,线程比进程更快的处理单元,而且所占用的资源也小,多线程的应用也 ...

  8. HTTP协议中的chunked编码解析

    \r\n\r\n"了. chunked编码很简单,是不是? 不过,在协议还原的实现过程中,如何高效高性能地对chunked进行解码,是一件值得挑战的事哦.毕竟,HTTP的流量占比不小的. 长 ...

  9. 环信即时通讯在工程中的安装——Nusen_Liu

    即时通讯-环信 准备 1.下载SDK http://www.easemob.com/download 2.证书下载上传 后期发送消息 需要推送发送的内容 http://docs.easemob.com ...

  10. Linux中fdisk分区

    一.硬盘接口    从整体的角度上,硬盘接口分为IDE.SATA.SCSI和SAS四种,IDE接口硬盘多用于家用产品中,也部分应用于服务器,SCSI接口的硬盘则主要应用于服务器市场,而SAS只在高端服 ...