做完扑克牌程序感觉自己又通透了好多哈哈~
我的程序架构为:
View.class 主界面控制运行流程(似乎还是面向过程的思想有点改不掉呢) Pocker.class 单张扑克类
PockerCollection.class 扑克集合类
Player.class 玩家类
页面基本流程View.class(主函数所在地)
import java.util.Collections;
import java.util.Iterator;
import java.util.Scanner;
public class View {
public static void main(String[] args) {
PockerCollection pockers=new PockerCollection();
System.out.println("----------创建扑克牌----------------");
pockers.addPocker();
System.out.println("----------扑克牌创建成功----------------");
System.out.print("为:");
pockers.getForeach();
System.out.println("----------开始洗牌----------------");
/*****很喜欢这个洗牌方法,collections里面自带的洗牌程序************/
Collections.shuffle(pockers.pockers);
System.out.println("----------洗牌结束----------------");
pockers.getForeach();
System.out.println("----------创建玩家----------------");
int id=0;
String name;
Scanner input=new Scanner(System.in);
Player[] player=new Player[2];
for(int i=0;i<2;i++){
System.out.println("请输入第"+(i+1)+"位玩家的id和姓名");
System.out.println("请输入ID:");
/*这边只能避免一次输入类型错误,如果第二次仍输错就没办法了,欢迎大家帮我解决一下这个漏洞*/
try{
id=input.nextInt();
}
catch(Exception e){
System.out.println("请输入整数类型的ID");
id=input.nextInt();
}
System.out.println("请输入姓名:");
name=input.next();
player[i]=new Player(id,name);
}
for(int i=0;i<2;i++){
System.out.println("---欢迎玩家:"+player[i].name+"-------");
}
System.out.println("----------开始发牌----------------");
for(int i=0;i<2;i++)
{
for(int j=0;j<player.length;j++){
player[j].getPockers.add(pockers.pockers.get(i*player.length+j));
System.out.println("---玩家:"+player[j].name+"拿牌");
}
}
System.out.println("----------发牌结束----------------");
player[0].getPocker();
player[1].getPocker();
System.out.println("----------开始游戏----------------");
for(int i=0;i<2;i++){
Pocker bigPocker=player[i].compare();
System.out.println("玩家:"+player[i].name+"最大的手牌"+bigPocker.color+bigPocker.value);
}
int flag=player[0].compare().compareTo(player[1].compare());
if(flag>0){
System.out.println("-------------玩家:"+player[0].name+"获胜---------");
}
else if(flag<0){
System.out.println("-------------玩家:"+player[1].name+"获胜---------");
}
else{
System.out.println("-------------平局---------");
}
System.out.println("-------------玩家各自的手牌为:---------");
for(int i=0;i<2;i++){
System.out.println(player[i].name+"["+player[i].getPocker()+"]");
}
}
}
Pocker.class 单张扑克类
/*********
*实现了Comparable接口的compareTo方法
*仍然没亮点
*************/
public class Pocker implements Comparable<Pocker> {
public String color;
public String value;
Pocker(String color,String value){
this.color=color;
this.value=value;
}
@Override
public int compareTo(Pocker o) {
// TODO Auto-generated method stub
if(this.value.compareTo(o.value)==0){
return this.color.compareTo(o.color);
}
else{
return this.value.compareTo(o.value);
}
}
}
PockerCollection.class 全套扑克牌
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class PockerCollection {
List<Pocker> pockers;
PockerCollection(){
pockers=new ArrayList<Pocker>();
}
public void addPocker(){
Pocker[] pocker=new Pocker[52];
String value="";
int m=0;
int j=0;
//System.out.println(",");
/************这里给扑克牌赋值的方法避免了写很多很多字,找了一些规律,自己给自己的小惊喜***************/
for(int i=0;i<52;i++)
{
j=i/13;
m=i%13+1;
if(m<11){
value=m+"";
}
else if(m==11){
value="J";
}
else if(m==12){
value="Q";
}
else if(m==13){
value="K";
}
//System.out.println(j+","+i);
switch(j){
case 0:
pocker[i]=new Pocker("黑桃",value);
break;
case 1:
pocker[i]=new Pocker("红桃",value);
break;
case 2:
pocker[i]=new Pocker("梅花",value);
break;
case 3:
pocker[i]=new Pocker("方块",value);
break;
}
}
this.pockers.addAll(Arrays.asList(pocker));
}
public void getForeach(){
for(Pocker pocker:pockers){
System.out.print(pocker.color+pocker.value+",");
}
}
}
Player.class 玩家类
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Player {
int id;
String name;
Set<Pocker> getPockers;
Player(int id,String name){
this.id=id;
this.name=name;
getPockers=new HashSet<Pocker>();
}
public String getPocker(){
String back="";
Iterator<Pocker> it=getPockers.iterator();
Pocker pocker;
while(it.hasNext()){
pocker=it.next();
back=back+pocker.color+pocker.value;
}
return back;
}
public Pocker compare(){
Iterator<Pocker> it=getPockers.iterator();
Pocker bigPocker=it.next();
Pocker big;
/*一定要用一个对象把it.next()值取出来再运算,因为,每次执行这个函数都会跑一个Pocker对象,so要保证每次循环这个函数只能执行一次哦~*/
while(it.hasNext()){
big=it.next();
if(bigPocker.compareTo(big)<0){
bigPocker=big;
}
}
return bigPocker;
}
}
小心得在这里!!!
1、空字符串和空字符:pocker[i]=new Pocker(“”,’\0′);
2、虽然使用的Unicode集合,但是数字依然是48开始
3、对象数组初始化Pocker[] pocker=new Pocker[52];
但是只有引用,每一个对象的实例还没有出现,所以使用前
pocker[i]=new Pocker(“黑桃”,m);
4、洗牌方法一:collections工具类中有方法:洗牌:
Collections.shuffle(list);
洗牌方法二:(好精炼的语言啊啊!!)
public static ArrayList randomList(ArrayList sourceList){
if (isEmpty(sourceList)) { return sourceList; }
ArrayList randomList = new ArrayList( sourceList.size( ) );
do{ int randomIndex = Math.abs( new Random( ).nextInt( sourceList.size() ) );
randomList.add( sourceList.remove( randomIndex ) );
}while( sourceList.size( ) > 0 );
return randomList; }
[附上洗牌方法原作者链接][1]
(第一次编写手记,格式效果不能预料……大概点上面这里会跳转吧……)
不确定能不能成功跳转,直接附上地址: http://blog.sina.com.cn/s/blog_6
5、iterator的it.next()方法,每用一次就会取下一个数