java纸牌游戏程序找不出来哪里错了
编译时,总是不稳定,一会52张,一会36张,44张的。。。。题目描述:纸牌游戏War
玩家:2人
目标:易做图另一位玩家用完纸牌。
设置:发一整副纸牌,给每位玩家发26张纸牌。将每位玩家的纸牌面朝下堆叠在一起。
玩法:在每一局,每位玩家都要翻开他那一堆纸牌中顶部的纸牌。如果某位玩家的等级更高,则他会获得这两张纸牌并把它们添加到他那一堆纸牌的底部。如果出行平局,则通过“战争”来解决:每位玩家从他的那一堆纸牌中出3张面朝下的纸牌和另外一张面朝上的纸牌。如果最后两张纸牌中有一张纸牌的等级较高,则拥有该纸牌的玩家将赢得全部10张纸牌。对后续的平局进行类似的处理,一局下来,最终的获胜者会得到一堆甚至更多的纸牌。
游戏结束:如果某位玩家无法出牌(甚至在战争中),他就输了。
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class zhipai {
static LinkedList<Integer> s = new LinkedList<Integer>(); //链接列表一
static LinkedList<Integer> s1 = new LinkedList<Integer>();//链接列表二
@SuppressWarnings("unused")
public static void main(String[] args) {
//1代表A,11代表J,12代表Q,13代表K
Integer[] zhipai =
{1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,
1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 };
List<Integer> list = Arrays.asList(zhipai);
//洗牌,发牌
Collections.shuffle(list);
zhipai = (Integer[]) list.toArray();
for(int i = 0;i<26;i++){
s.offer((Integer) zhipai[i]);
}
System.out.println("甲拥有的"+s.size()+"张扑克牌为:");
for(int i=0;i<26;i++){
System.out.print(s.poll()+"\t");
}
for(int i = 26;i<52;i++){
s1.offer((Integer) zhipai[i]);
}
System.out.println();
System.out.println("乙拥有的"+s1.size()+"张的扑克牌为:");
for(int i=0;i<26;i++){
System.out.print(s1.poll()+"\t");
}
for(int i = 0;i<26;i++){
s.offer((Integer) zhipai[i]);
}
for(int i = 26;i<52;i++){
s1.offer((Integer) zhipai[i]);
}
//开始游戏
do{
// 甲出的牌小于乙
if(s.peek()<s1.peek()){
s1.offer(s1.poll());
s1.offer(s.poll());
}
// 甲出的牌大于乙
else if(s.peek()>s1.peek()){
s.offer(s.poll());
s.offer(s1.poll());
}
//相等情况
else if(s.peek()==s1.peek())
{
//在甲只剩4张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
if ( s.size()==4 ){
s1.offer(s.poll());s1.offer(s.poll());s1.offer(s.poll());s1.offer(s.poll());
System.out.println();
System.out.println("甲没有牌了");
}
//在乙只剩4张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
else if ( s1.size()==4 ){
s.offer(s1.poll());s.offer(s1.poll());s.offer(s1.poll());s.offer(s1.poll());
System.out.println();
System.out.println("乙没有牌了");
}
// 在甲只剩3张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
else if ( s.size()==3 ){
s1.offer(s.poll());s1.offer(s.poll());s1.offer(s.poll());
System.out.println();
System.out.println("甲没有牌了");
}
// 在乙只剩3张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
else if ( s1.size()==3 ){
s.offer(s1.poll());s.offer(s1.poll());s.offer(s1.poll());
System.out.println();
System.out.println("乙没有牌了");
}
// 在甲只剩2张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
else if ( s.size()==2 ){
s1.offer(s.poll());s1.offer(s.poll());
System.out.println();
System.out.println("甲没有牌了");
}
// 在乙只剩2张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
else if ( s1.size()==2 ){
s.offer(s1.poll());s.offer(s1.poll());
System.out.println();
System.out.println("乙没有牌了");
}
// 在甲只剩1张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
else if ( s.size()==1 ){
s1.offer(s.poll());
System.out.println();
System.out.println("甲没有牌了");
}
// 在乙只剩1张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
else if ( s1.size()==1 ){
s.offer(s1.poll());
System.out.println();
System.out.println("乙没有牌了");
}
else{
int[] a = {s.poll(),s.poll(),s.poll(),s.poll()};
int[] b = {s1.poll(),s1.poll(),s1.poll(),s1.poll()};
//第一张牌相等的情况下,甲出的第5张牌小于乙
if(s.peek()<s1.peek()){
for(int i = 0 ; i<4;i++){
s1.offer(b[i]);
}
for(int i = 0 ; i<4;i++){
s1.offer(a[i]);
}
s1.offer(s1.poll());
s1.offer(s.poll());
}
// 第一张牌相等的情况下,甲出的第5张牌大于乙
else if(s.peek()>s1.peek()){
for(int i = 0 ; i<4;i++){
s.offer(a[i]);
}
for(int i = 0 ; i<4;i++){
s.offer(b[i]);
}
s.offer(s.poll());
s.offer(s1.poll());
}
}
}
}while(!s.isEmpty() && !s1.isEmpty() );//在甲或乙的牌数都不为0的情况下开始游戏
//如果甲的牌数为0,则乙赢
if(s.isEmpty()){
System.out.println();
System.out.println("乙赢得胜利,所得"+s1.size()+"张牌为:");
for(int i=0;i<52;i++){
System.out.print(s1.poll()+"\t");
}
}
//如果乙的牌数为0,则甲赢
else if(s1.isEmpty()){
System.out.println();
System.out.println("甲赢得胜利,所得"+s.size()+"张牌为:");
for(int i=0;i<52;i++){
System.out.print(s.poll()+"\t");
}
}}
// TODO Auto-generated method stub
}
java --------------------编程问答-------------------- 这是错误的错误的
而再次编译时又是正确的结果 --------------------编程问答-------------------- 对楼主的代码进行了一下改造,发现是这里少考虑了一种因素。。
--------------------编程问答-------------------- 就是我五张相等的情况楼主没有考虑。。。
else {
int[] a = { s.poll(), s.poll(), s.poll(), s.poll() };
int[] b = { s1.poll(), s1.poll(), s1.poll(), s1.poll() };
// 第一张牌相等的情况下,甲出的第5张牌小于乙
if (s.peek() < s1.peek()) {
System.out.println("甲出的第5张牌小于乙");
for (int i = 0; i < 4; i++) {
s1.offer(b[i]);
}
for (int i = 0; i < 4; i++) {
s1.offer(a[i]);
}
s1.offer(s1.poll());
s1.offer(s.poll());
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 第一张牌相等的情况下,甲出的第5张牌大于乙
else if (s.peek() > s1.peek()) {
System.out.println("甲出的第5张牌大于乙");
for (int i = 0; i < 4; i++) {
s.offer(a[i]);
}
for (int i = 0; i < 4; i++) {
s.offer(b[i]);
}
s.offer(s.poll());
s.offer(s1.poll());
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
else{
System.out.println("第五张相等");
}
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
而每次总数为44张的时候,都会 打印出 第五章张相等。
部分结果:
甲出的第5张牌小于乙
甲出的第5张牌大于乙
甲出的第5张牌小于乙
甲出的第5张牌小于乙
甲出的第5张牌小于乙
甲出的第5张牌大于乙
甲出的第5张牌小于乙
甲出的第5张牌大于乙
第五张相等
有问题
我添加的输出语句,每个有问题的那一条语句那里我都添加了断点,这样就不用往下继续跑了。
package com;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class Test {
static LinkedList<Integer> s = new LinkedList<Integer>(); // 链接列表一
static LinkedList<Integer> s1 = new LinkedList<Integer>();// 链接列表二
@SuppressWarnings("unused")
public static void main(String[] args) {
// 1代表A,11代表J,12代表Q,13代表K
Integer[] zhipai = { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9,
9, 10, 10, 11, 11, 12, 12, 13, 13, 1, 1, 2, 2, 3, 3, 4, 4, 5,
5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 };
List<Integer> list = Arrays.asList(zhipai);
// 洗牌,发牌
Collections.shuffle(list);
zhipai = (Integer[]) list.toArray();
for (int i = 0; i < 26; i++) {
s.offer((Integer) zhipai[i]);
}
System.out.println("甲拥有的" + s.size() + "张扑克牌为:");
for (int i = 0; i < 26; i++) {
System.out.print(s.poll() + "\t");
}
for (int i = 26; i < 52; i++) {
s1.offer((Integer) zhipai[i]);
}
System.out.println();
System.out.println("乙拥有的" + s1.size() + "张的扑克牌为:");
for (int i = 0; i < 26; i++) {
System.out.print(s1.poll() + "\t");
}
for (int i = 0; i < 26; i++) {
s.offer((Integer) zhipai[i]);
}
for (int i = 26; i < 52; i++) {
s1.offer((Integer) zhipai[i]);
}
// 开始游戏
do {
// 甲出的牌小于乙
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
if (s.peek() < s1.peek()) {
s1.offer(s1.poll());
s1.offer(s.poll());
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 甲出的牌大于乙
else if (s.peek() > s1.peek()) {
s.offer(s.poll());
s.offer(s1.poll());
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 相等情况
else if (s.peek() == s1.peek()) {
// 在甲只剩4张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
if (s.size() == 4) {
s1.offer(s.poll());
s1.offer(s.poll());
s1.offer(s.poll());
s1.offer(s.poll());
System.out.println();
System.out.println("甲没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 在乙只剩4张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
else if (s1.size() == 4) {
s.offer(s1.poll());
s.offer(s1.poll());
s.offer(s1.poll());
s.offer(s1.poll());
System.out.println();
System.out.println("乙没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 在甲只剩3张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
else if (s.size() == 3) {
s1.offer(s.poll());
s1.offer(s.poll());
s1.offer(s.poll());
System.out.println();
System.out.println("甲没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 在乙只剩3张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
else if (s1.size() == 3) {
s.offer(s1.poll());
s.offer(s1.poll());
s.offer(s1.poll());
System.out.println();
System.out.println("乙没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 在甲只剩2张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
else if (s.size() == 2) {
s1.offer(s.poll());
s1.offer(s.poll());
System.out.println();
System.out.println("甲没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 在乙只剩2张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
else if (s1.size() == 2) {
s.offer(s1.poll());
s.offer(s1.poll());
System.out.println();
System.out.println("乙没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 在甲只剩1张牌,且甲和乙第一张牌相等的情况下,甲的牌数不够用于比较
else if (s.size() == 1) {
s1.offer(s.poll());
System.out.println();
System.out.println("甲没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 在乙只剩1张牌,且甲和乙第一张牌相等的情况下,乙的牌数不够用于比较
else if (s1.size() == 1) {
s.offer(s1.poll());
System.out.println();
System.out.println("乙没有牌了");
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
else {
int[] a = { s.poll(), s.poll(), s.poll(), s.poll() };
int[] b = { s1.poll(), s1.poll(), s1.poll(), s1.poll() };
// 第一张牌相等的情况下,甲出的第5张牌小于乙
if (s.peek() < s1.peek()) {
System.out.println("甲出的第5张牌小于乙");
for (int i = 0; i < 4; i++) {
s1.offer(b[i]);
}
for (int i = 0; i < 4; i++) {
s1.offer(a[i]);
}
s1.offer(s1.poll());
s1.offer(s.poll());
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
// 第一张牌相等的情况下,甲出的第5张牌大于乙
else if (s.peek() > s1.peek()) {
System.out.println("甲出的第5张牌大于乙");
for (int i = 0; i < 4; i++) {
s.offer(a[i]);
}
for (int i = 0; i < 4; i++) {
s.offer(b[i]);
}
s.offer(s.poll());
s.offer(s1.poll());
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
else{
System.out.println("第五张相等");
}
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
}
if(s.size()+s1.size()!=52){
System.out.println("有问题");
}
} while (!s.isEmpty() && !s1.isEmpty());// 在甲或乙的牌数都不为0的情况下开始游戏
// 如果甲的牌数为0,则乙赢
if (s.isEmpty()) {
System.out.println();
System.out.println("乙赢得胜利,所得" + s1.size() + "张牌为:");
for (int i = 0; i < 52; i++) {
System.out.print(s1.poll() + "\t");
}
}
// 如果乙的牌数为0,则甲赢
else if (s1.isEmpty()) {
System.out.println();
System.out.println("甲赢得胜利,所得" + s.size() + "张牌为:");
for (int i = 0; i < 52; i++) {
System.out.print(s.poll() + "\t");
}
}
}
}
补充:Java , Eclipse