二十一点游戏代码有BUG,求指导。。。。

amwrrkype3 2012-12-17 08:25:20
玩家牌数大于等于2的时候,在显示游戏结果的时会消失一张牌,求指是什么回事,
求。。。。。。
因为字数限制,分两段发,代码如下:
//AboutFrame.java
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;

public class AboutFrame extends JFrame{
JLabel jLabel1=new JLabel();
JTextArea ta1=new JTextArea();
JLabel jLabel2=new JLabel();
JTextArea ta2=new JTextArea();

public AboutFrame(){
getContentPane().setLayout(null);
jLabel1.setText("游戏规则");
jLabel1.setBounds(new Rectangle(27,0,97,36));
jLabel2.setText("声明");
jLabel2.setBounds(new Rectangle(26,176,80,27));
ta2.setEditable(false);
ta2.setLineWrap(true);
ta2.setBounds(new Rectangle(27,207,398,63));
ta1.setLineWrap(true);
this.setTitle("关于");
this.getContentPane().add(jLabel1);
this.getContentPane().add(ta1);
this.getContentPane().add(ta2);
this.getContentPane().add(jLabel2);
ta1.setEditable(false);
ta1.setText("电脑先抓牌,玩家后抓牌。计算自己的面值总数,比较面值数,如果面值总数都大于或等于21,则电脑获胜;如果玩家和电脑的面值总数有一个大于21点," +
"另一个不大于21点,则不大于21点的,为赢家;如果玩家和电脑的面值总数都不大于21,则面值总数大的为赢家。");
ta1.setBounds(new Rectangle(25,36,392,130));
ta2.setText("该游戏中,纸牌的图片来自于Windows XP的纸牌游戏,图片权属于原作者所有!");
this.setSize(450,300);
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
//获得当前窗体的宽和高
Dimension frameSize=this.getSize();
//设置窗体居中
if(frameSize.height>screenSize.height)
{
frameSize.height=screenSize.height;
}
if(frameSize.width>screenSize.width){
frameSize.width=screenSize.width;
}
this.setLocation((screenSize.width-frameSize.width)/2,(screenSize.height-frameSize.height)/2);
this.setVisible(true);
}
}





//Card.java

public class Card {
//代表纸牌面值
private int value=0;
//代表纸牌花色
private int type=0;
//构造方法,给面值和花色赋值
public Card(int type,int value)
{
this.value=value;
this.type=type;
}
public int getType(){
return type;
}
public int getValue(){
return value;
}
public void setType(int type){
this.type=type;
}
public void setValue(){
this.value=value;
}
}





//CardManager.java

import java.awt.Container;
import java.awt.Rectangle;

import javax.swing.ImageIcon;
import javax.swing.JLabel;


public class CardManager {
public Card[]cards=new Card[52];
//初始化牌
public void initCards(){
for(int i=1;i<=4;i++){
for(int j=1;j<=13;j++){
cards[(i-1)*13+j-1]=new Card(i,j);
}
}
}
//随机生成牌号
public void randomCards(){
Card temp=null;
//随机生成牌号
for(int i=0;i<52;i++){
int a=(int)(Math.random()*52);
int b=(int)(Math.random()*52);
temp=cards[a];
cards[a]=cards[b];
cards[b]=temp;
}
}
//发牌
public void gameStart(JLabel game[],Container c){
//在容器中删除标签组件
if(game[0]!=null){
for(int i=0;i<52;i++){
c.remove(game[i]);
}
c.repaint();
}
//在容器中防止52个标签组件用于盛放图片
for(int i=0;i<52;i++){
game[i]=new JLabel();
game[i].setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));
game[i].setBounds(new Rectangle(100+i*10,59,71,96));
c.add(game[i]);
}
//设置标签组件的图片为rear.gif,即牌的背面
for(int i=0;i<52;i++){
game[i].setIcon(new ImageIcon("images/cover.jpg"));
}
}
}

...全文
179 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
amwrrkype3 2012-12-17
  • 打赏
  • 举报
回复
//GameFrame.java import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; public class GameFrame extends JFrame implements ActionListener{ //洗牌按钮 JButton clear_btn=new JButton(); //游戏开始按钮 JButton compute_btn=new JButton(); //玩家按钮 JButton game_btn=new JButton(); //游戏结束按钮 JButton gameover_btn=new JButton(); //积分统计按钮 JButton sum_btn=new JButton(); //积分清零按钮 JButton sumclear_btn=new JButton(); //用于放置52张纸牌图片的标签框 JLabel game[]=new JLabel[52]; //定义纸牌管理对象 CardManager cm=new CardManager(); //记录抓牌数 int i=0,i2=0; //定义电脑点数 int computer_dot=0; //定义玩家点数 int game_dot=0; //存储电脑抓的纸牌 Vector v=new Vector(); JLabel jLabel1=new JLabel(); JLabel jLabel2=new JLabel(); //定义积分记录 int sum=0; int a=0; public GameFrame(){ getContentPane().setLayout(null); this.setTitle("二十一点游戏"); this.setSize(800,500); //获得屏幕的宽和高 Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize(); //获得当前窗体的宽和高 Dimension frameSize=this.getSize(); //设置窗体居中 if(frameSize.height>screenSize.height) { frameSize.height=screenSize.height; } if(frameSize.width>screenSize.width) { frameSize.width=screenSize.width; } this.setLocation((screenSize.width-frameSize.width)/2, (screenSize.height-frameSize.height)/2); clear_btn.setBounds(new Rectangle(35,388,86,31)); clear_btn.setText("洗牌"); clear_btn.addActionListener(this); compute_btn.setBounds(new Rectangle(155,388,86,31)); compute_btn.setEnabled(false); compute_btn.setText("开始游戏"); compute_btn.addActionListener(this); game_btn.setBounds(new Rectangle(275,388,91,32)); game_btn.setEnabled(false); game_btn.setText("玩家抓牌"); game_btn.addActionListener(this); gameover_btn.setBounds(new Rectangle(395,388,91,32)); gameover_btn.setEnabled(false); gameover_btn.setText("结束本轮"); gameover_btn.addActionListener(this); sum_btn.setBounds(new Rectangle(515,388,86,31)); sum_btn.setText("积分统计"); sum_btn.addActionListener(this); sumclear_btn.setBounds(new Rectangle(635,388,86,31)); sumclear_btn.setText("积分清零"); sumclear_btn.addActionListener(this); //定义菜单条 JMenuBar mb=new JMenuBar(); //定义菜单 JMenu mnuFile=new JMenu("文件"); JMenu mnuHelp=new JMenu("帮助"); //定义菜单项 JMenuItem mnuFileExit=new JMenuItem("退出"); JMenuItem mnuHelpAbout=new JMenuItem("关于"); //把菜单条添加到Frame窗体上 this.setJMenuBar(mb); jLabel1.setText("电脑显示牌区"); jLabel1.setBounds(new Rectangle(100,350,100,40)); jLabel2.setText("用户显示牌区"); jLabel2.setBounds(new Rectangle(500,350,100,40)); //把菜单项添加到菜单条中 mb.add(mnuFile); mb.add(mnuHelp); //把菜单项添加到菜单中 mnuFile.add(mnuFileExit); mnuHelp.add(mnuHelpAbout); //把菜单项产生的事件进行注册 mnuFileExit.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.exit(0); } }); mnuHelpAbout.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ new AboutFrame(); } }); this.getContentPane().add(jLabel2); this.getContentPane().add(jLabel1); this.getContentPane().add(game_btn); this.getContentPane().add(clear_btn); this.getContentPane().add(gameover_btn); this.getContentPane().add(compute_btn); this.getContentPane().add(sum_btn); this.getContentPane().add(sumclear_btn); this.setVisible(true); } public static void main(String[]args){ GameFrame gameframe=new GameFrame(); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==clear_btn){ compute_btn.setText("开始游戏"); //关闭和开启相应按钮 compute_btn.setEnabled(true); clear_btn.setEnabled(false); //对记牌器、电脑点数和玩家点数进行初始化 //对点数进行初始化 v.clear(); i=0; computer_dot=0; game_dot=0; //把标签框控件数组放入窗体的窗格中 cm.gameStart(game,this.getContentPane()); //初始化一副纸牌 cm.initCards(); cm.randomCards(); a=0; } //开始游戏按钮 if(e.getSource()==compute_btn){ //关闭和开启相应按钮 compute_btn.setText("电脑抓牌"); compute_btn.setEnabled(true); game_btn.setEnabled(true); sum_btn.setEnabled(false); sumclear_btn.setEnabled(false); //电脑抓牌 // for(;;){ game[i].setIcon(new ImageIcon("images/cover.jpg")); game[i].setBounds(new Rectangle(50+i*10,200,71,96)); getContentPane().setComponentZOrder(game[i],1); if(i==0){ game[i].setIcon(new ImageIcon("images/" + cm.cards[i].getType() + "-" + cm.cards[i].getValue() + ".gif")); game[i].setBounds(new Rectangle(50+i*20,200,71,96)); this.getContentPane().setComponentZOrder(game[i],1); } if(cm.cards[i].getValue()>10) { computer_dot=computer_dot+10; } else { computer_dot=computer_dot+cm.cards[i].getValue(); } v.add(cm.cards[i]); getContentPane().repaint(); i=i+1; // 如果面值总数大于15则停止抓牌 if(computer_dot >= 15){ // return; compute_btn.setEnabled(false); } } // } //玩家抓牌按钮 if(e.getSource()==game_btn){ if(computer_dot<15){ compute_btn.setEnabled(true); } //提示玩家 if(game_dot>=10){ int a=JOptionPane.showConfirmDialog(null, "现在的点数为:"+game_dot+"" + "是否在抓牌", "提示", JOptionPane.YES_NO_OPTION); if(a==JOptionPane.NO_OPTION){ game_btn.setEnabled(false); gameover_btn.setEnabled(true); return; } } //设置标签框显示抓到的纸牌 game[i].setIcon(new ImageIcon("images/" + cm.cards[i].getType() + "-" + cm.cards[i].getValue() + ".gif")); game[i].setBounds(new Rectangle(450+i*20,200,71,96)); this.getContentPane().setComponentZOrder(game[i],1); //计算纸牌的面值 if(cm.cards[i].getValue()>10){ game_dot=game_dot+10; }else{ game_dot=game_dot+cm.cards[i].getValue(); } //记录抓到的牌数 i=i+1; //面值大于21停止抓牌,关闭和开启相应按钮 if(game_dot>21){ game_btn.setEnabled(false); return; } gameover_btn.setEnabled(true); } //本轮游戏结束按钮 if(e.getSource()==gameover_btn){ //把电脑的纸牌翻过来 for(int i = 0; i < v.size(); i++) { Card card = (Card)v.get(i); game[i].setIcon(new ImageIcon("images/" + card.getType() + "-" + card.getValue() + ".gif")); game[i].setBounds(new Rectangle(50 + i * 20,200,71,96)); this.getContentPane().setComponentZOrder(game[i], 1); } //计算胜负 String game_over=""; if(game_dot>21&&computer_dot>=21){ game_over="电脑获胜"; }else if(game_dot>21&&computer_dot<21){ game_over="电脑获胜"; }else if(game_dot<=21&&computer_dot>21){ game_over="玩家获胜"; }else if((game_dot==computer_dot)&&(game_dot<=21&&computer_dot<=21)){ game_over="平局"; }else if((game_dot>computer_dot)&&(game_dot<=21&&computer_dot<=21)){ game_over="玩家获胜"; }else if((game_dot<computer_dot)&&(game_dot<=21&&computer_dot<=21)){ game_over="电脑获胜"; } //计算积分 if(a==0){ if(game_over=="平局"){ sum=sum+1; }else if(game_over=="玩家获胜"){ sum=sum+3; } a=1; } //以对话框的方式显示胜负 String message="游戏结果\n"; message=message+"电脑点数:"+String.valueOf(computer_dot)+"\n"; message=message+"玩家点数:"+String.valueOf(game_dot)+"\n"; message=message+"游戏结果:"+game_over; JOptionPane.showMessageDialog(null,message,"本轮游戏结果",JOptionPane.INFORMATION_MESSAGE); //设置命令按钮可操作 clear_btn.setEnabled(true); compute_btn.setEnabled(false); game_btn.setEnabled(false); gameover_btn.setEnabled(false); sum_btn.setEnabled(true); sumclear_btn.setEnabled(true); } if(e.getSource()==sum_btn){ String message="积分统计\n"; message=message+"玩家积分:"+sum; JOptionPane.showMessageDialog(null,message,"累计游戏积分",JOptionPane.INFORMATION_MESSAGE); } if(e.getSource()==sumclear_btn){ String message="积分已清零\n"; sum=0; JOptionPane.showMessageDialog(null,message,"积分清零",JOptionPane.INFORMATION_MESSAGE); } } }

50,542

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧