java火柴游戏_Java课程设计—拿火柴小游戏

1 import java.awt.event.*;2 import javax.swing.*;3 importjava.util.Timer;4 importjava.util.Random;5 /**

6 * 动作监视器类7 *@authorzhangyubo8 */

9 public class Dispose implementsActionListener {10 private JLabel operator1_message; //电脑或玩家1提示框

11 private JLabel operator2_message; //玩家或玩家2提示框

12 private JLabel leftMatch; //剩余火柴数

13 private JLabel hard_message; //末日难度提示框

14 private JLabel comob_message; //电脑发动连击提示框

15 private JButton start; //开始按钮

16 private JButton choose1; //玩家1端拿1根火柴按钮

17 private JButton choose2; //玩家1端拿2根火柴按钮

18 private JButton choose3; //玩家1端拿3根火柴按钮

19 private JButton choose4; //玩家2端拿1根火柴按钮

20 private JButton choose5; //玩家2端拿2根火柴按钮

21 private JButton choose6; //玩家2端拿3根火柴按钮

22 int flag; //游戏模式标志

23 static int game_level; //类变量游戏难度

24 Random random; //随机值变量

25 Timer timer; //计时器变量

26 static int number; //随机值

27 static int randomNumber; //随机火柴数

28

29 /**

30 * 获取WindowActionEvent类的提示框标签31 *@paramt 标签32 */

33 public voidsetMessage(JLabel...t){34 operator2_message=t[0];35 operator1_message=t[1];36 leftMatch=t[2];37 hard_message=t[3];38 comob_message=t[4];39 }40

41 /**

42 * 获取WindowActionEvent类的开始按钮43 *@params 按钮44 */

45 public voidsetButton(JButton s){46 start=s;47 }48

49 /**

50 * 获取WindowActionEvent类的6个拿火柴按钮51 *@paramt 按钮52 */

53 public voidsetChoose(JButton...t){54 choose1=t[0];55 choose2=t[1];56 choose3=t[2];57 choose4=t[3];58 choose5=t[4];59 choose6=t[5];60 }61

62 public void actionPerformed(ActionEvent e){ //重写监视器事件

63 if(e.getActionCommand()=="开始"){ //当点击开始按钮时

64 start.setText("重新开始"); //start按钮输出重新开始

65 init(); //调用init()重置方法

66 }67 if(flag==0&&e.getSource()==choose4) //在人机模式下点击choose4按钮

68 playerTake(1); //调用人机模式下玩家拿火柴方法

69 if(flag==0&&e.getSource()==choose5) //在人机模式下点击choose5按钮

70 playerTake(2); //调用人机模式玩家拿火柴方法

71 if(flag==0&&e.getSource()==choose6) //在人机模式下点击choose6按钮

72 playerTake(3); //调用人机模式下玩家拿火柴方法

73 if(flag==1&&e.getSource()==choose1) //在玩家模式下点击choose1按钮

74 player1Take(1); //调用玩家模式下玩家1拿火柴方法

75 if(flag==1&&e.getSource()==choose2) //在玩家模式下点击choose2按钮

76 player1Take(2); //调用玩家模式下玩家1拿火柴方法

77 if(flag==1&&e.getSource()==choose3) //在玩家模式下点击choose3按钮

78 player1Take(3); //调用玩家模式下玩家1拿火柴方法

79 if(flag==1&&e.getSource()==choose4) //在玩家模式下点击choose4按钮

80 player2Take(1); //调用玩家模式下玩家2拿火柴方法

81 if(flag==1&&e.getSource()==choose5) //在玩家模式下点击choose5按钮

82 player2Take(2); //调用玩家模式下玩家2拿火柴方法

83 if(flag==1&&e.getSource()==choose6) //在玩家模式下点击choose6按钮

84 player2Take(3); //调用玩家模式下玩家2拿火柴方法

85 if(e.getActionCommand()=="重新开始"){ //点击重新开始按钮时

86 init(); //调用init()重置方法

87 }88 }89

90 /**

91 * 重置游戏方法92 */

93 public voidinit(){94 timer=new Timer(); //实例化一个计时器的对象

95 random=new Random(); //创建随机值变量

96 comob_message.setText("");97 if(flag==0) operator2_message.setText("请选择你要取走的火柴数");98 //如果为人机对战模式,输出请选择你要取走的火柴数

99 else operator2_message.setText("请玩家2选择要取走的火柴数");100 //如果为玩家对战模式,输出请玩家2选择要取走的火柴数

101 if(flag==0) operator1_message.setText("");102 //如果为人机对战模式,清空operator1_message标签

103 else operator1_message.setText("请玩家1选择要取走的火柴数");104 //如果为玩家对战模式,输出请玩家1选择要取走的火柴数

105 if(flag==1){ //如果为玩家对战模式

106 choose1.setVisible(true); //设置choose1按钮可见

107 choose2.setVisible(true); //设置choose2按钮可见

108 choose3.setVisible(true); //设置choose3按钮可见

109 choose1.setEnabled(true); //设置choose1按钮可用

110 choose2.setEnabled(true); //设置choose2按钮可用

111 choose3.setEnabled(true); //设置choose3按钮可用

112 }113 choose4.setEnabled(true); //设置choose4按钮可用

114 choose5.setEnabled(true); //设置choose5按钮可用

115 choose6.setEnabled(true); //设置choose6按钮可用

116 choose4.setVisible(true); //设置choose4按钮可见

117 choose5.setVisible(true); //设置choose5按钮可见

118 choose6.setVisible(true); //设置choose6按钮可见

119 randomNumber=(int)(20+Math.random()*(50-20+1)); //随机生成20-50根火柴数

120 leftMatch.setText("当前还剩下"+randomNumber+"根火柴"); //输出剩余火柴数

121 if(flag==0){ //如果为人机对战模式

122 double d=Math.random(); //随机产生0-1的数

123 if(d>=0.5) computerTake(); //如果d>=0.5,则电脑先拿火柴

124 }125 if(flag==1){ //如果为玩家对战模式

126 double d=Math.random(); //随机产生0-1的数

127 if(d>=0.5){ //如果d>=0.5,玩家1先拿火柴

128 choose4.setEnabled(false); //设置choose4不可用

129 choose5.setEnabled(false); //设置choose5不可用

130 choose6.setEnabled(false); //设置choose6不可用

131 }132 else{ //如果d<0.5,玩家2先拿火柴

133 choose1.setEnabled(false); //设置choose1不可用

134 choose2.setEnabled(false); //设置choose2不可用

135 choose3.setEnabled(false); //设置choose3不可用

136 }137 }138 }139

140 /**

141 * 电脑拿火柴方法142 */

143 private voidcomputerTake(){144 choose4.setEnabled(false); //设置choose4不可用

145 choose5.setEnabled(false); //设置choose5不可用

146 choose6.setEnabled(false); //设置choose6不可用

147 operator1_message.setText("电脑正在取火柴:"); //输出电脑正在取火柴:

148 ComputerTake computertake=new ComputerTake(choose4,choose5,choose6); //创建一个ComputerTake的对象

149 computertake.setMessage(operator1_message,leftMatch,hard_message,comob_message); //传递标签

150 timer.schedule(computertake, 1000); //设定一秒后执行线程

151 }152

153 /**

154 * 人机对战模式下玩家拿火柴方法155 *@paramnumber 拿火柴数156 */

157 private void playerTake(int number){ //定义人机模式下的玩家拿火柴方法

158 hard_message.setText(""); //清空标签

159 comob_message.setText(""); //清空标签

160 operator2_message.setText("请选择你要取走的火柴数"); //输出请选择你要取走的火柴数

161 randomNumber=randomNumber-number; //计算出剩余火柴数

162 if(randomNumber<=0) { //如果当前剩余火柴数已为0

163 leftMatch.setText("当前还剩下0根火柴"); //输出当前还剩下0根火柴

164 JOptionPane.showMessageDialog(null, "You are the winner"); //弹出消息框

165 choose4.setEnabled(false); //设置choose4不可用

166 choose5.setEnabled(false); //设置choose5不可用

167 choose6.setEnabled(false); //设置choose6不可用

168 }169 else{ //如果当前剩余火柴数不为0

170 leftMatch.setText("当前还剩下"+randomNumber+"根火柴"); //输出剩余火柴数

171 computerTake(); //调用电脑拿火柴方法

172 }173 }174

175 /**

176 * 玩家对战模式下玩家1拿火柴方法177 *@paramnumber 拿火柴数178 */

179 private void player1Take(int number){ //定义玩家对战下的玩家1拿火柴方法

180 randomNumber=randomNumber-number; //计算剩余火柴数

181 if(randomNumber<=0) { //如果当前火柴数已为0

182 leftMatch.setText("当前还剩下0根火柴"); //输出当前还剩下0根火柴

183 JOptionPane.showMessageDialog(null, "Player1 is the winner"); //弹出消息框

184 choose1.setEnabled(false); //设置choose1按钮不可用

185 choose2.setEnabled(false); //设置choose2按钮不可用

186 choose3.setEnabled(false); //设置choose3按钮不可用

187 }188 else{ //如果当前火柴数不为0

189 leftMatch.setText("当前还剩下"+randomNumber+"根火柴"); //输出剩余火柴数

190 choose1.setEnabled(false); //设置choose1按钮不可用

191 choose2.setEnabled(false); //设置choose2按钮不可用

192 choose3.setEnabled(false); //设置choose3按钮不可用

193 try{Thread.sleep(500);} //设定程序睡眠500毫秒

194 catch(InterruptedException e){}195 choose4.setEnabled(true); //设置choose4按钮可用

196 choose5.setEnabled(true); //设置choose5按钮可用

197 choose6.setEnabled(true); //设置choose6按钮可用

198 }199 }200

201 /**

202 * 玩家对战模式下玩家2拿火柴方法203 *@paramnumber 拿火柴数204 */

205 private void player2Take(int number){ //定义玩家对战下的玩家2拿火柴方法

206 randomNumber=randomNumber-number; //计算出剩余火柴数

207 if(randomNumber<=0) { //如果当前剩余火柴数已为0

208 leftMatch.setText("当前还剩下0根火柴"); //输出当前还剩下0根火柴

209 JOptionPane.showMessageDialog(null, "Player2 is the winner"); //弹出消息框

210 choose4.setEnabled(false); //设置choose4按钮不可用

211 choose5.setEnabled(false); //设置choose5按钮不可用

212 choose6.setEnabled(false); //设置choose6按钮不可用

213 }214 else{ //如果当前剩余火柴数不为0

215 leftMatch.setText("当前还剩下"+randomNumber+"根火柴"); //输出剩余火柴数

216 choose4.setEnabled(false); //设置choose4按钮不可用

217 choose5.setEnabled(false); //设置choose5按钮不可用

218 choose6.setEnabled(false); //设置choose6按钮不可用

219 try{Thread.sleep(500);} //设定程序睡眠500毫秒

220 catch(InterruptedException e){}221 choose1.setEnabled(true); //设置choose1按钮可用

222 choose2.setEnabled(true); //设置choose2按钮可用

223 choose3.setEnabled(true); //设置choose3按钮可用

224 }225 }226 }

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个Java Swing实现的拿火柴小游戏代码示例,您可以参考下面的代码: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MatchstickGame extends JFrame implements ActionListener { private JLabel title, status; private JTextField input; private JButton submit; private int matches, currentPlayer; public MatchstickGame() { super("拿火柴小游戏"); matches = (int) (Math.random() * 31) + 20; // 随机生成20~50根火柴 currentPlayer = 1; // 初始化为玩家1先手 setLayout(new GridLayout(3, 1)); title = new JLabel("剩余火柴数:" + matches, JLabel.CENTER); add(title); status = new JLabel("玩家" + currentPlayer + "请拿火柴", JLabel.CENTER); add(status); JPanel panel = new JPanel(new FlowLayout()); input = new JTextField(5); panel.add(input); submit = new JButton("确定"); submit.addActionListener(this); panel.add(submit); add(panel); setSize(300, 150); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent event) { String inputText = input.getText(); int count = 0; try { count = Integer.parseInt(inputText); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(this, "请输入数字"); return; } if (count < 1 || count > 3 || count > matches) { JOptionPane.showMessageDialog(this, "请输入1~3之间的数字,且不能大于剩余火柴数"); return; } matches -= count; title.setText("剩余火柴数:" + matches); if (matches == 0) { String winner = currentPlayer == 1 ? "计算机" : "玩家"; JOptionPane.showMessageDialog(this, winner + "获胜!"); int choice = JOptionPane.showConfirmDialog(this, "是否重新开始游戏?"); if (choice == JOptionPane.YES_OPTION) { matches = (int) (Math.random() * 31) + 20; currentPlayer = 1; title.setText("剩余火柴数:" + matches); status.setText("玩家" + currentPlayer + "请拿火柴"); input.setText(""); } else { System.exit(0); } } else { if (currentPlayer == 1) { currentPlayer = 2; status.setText("计算机正在思考..."); submit.setEnabled(false); new Thread() { public void run() { try { sleep(2000); int count = (int) (Math.random() * 3) + 1; while (count > matches) { count = (int) (Math.random() * 3) + 1; } matches -= count; title.setText("剩余火柴数:" + matches); currentPlayer = 1; status.setText("玩家" + currentPlayer + "请拿火柴"); submit.setEnabled(true); input.setText(""); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } else { currentPlayer = 1; status.setText("玩家" + currentPlayer + "请拿火柴"); input.setText(""); } } } public static void main(String[] args) { new MatchstickGame(); } } ``` 这段代码实现了一个简单的拿火柴小游戏,可以随机生成20~50根火柴,由人与计算机轮流拿,每次拿的数量为1~3根,以不拿到最后一根为胜。 在界面中,有一个显示剩余火柴数的标签,一个显示当前玩家和操作提示的标签,以及一个用于输入拿火柴数量并提交的文本框和按钮。当玩家点击按钮后,程序会根据输入的数量更新剩余火柴数,并判断是否结束游戏或轮到计算机操作。若轮到计算机操作,则程序会在2秒后随机生成拿火柴数量并更新界面。 您可以参考这份代码进行学习和修改,以满足您的实际需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值