1. 如何悔棋

在玩棋盘游戏中,玩家很容易下错棋。可在虚拟游戏中,电子玩家可不像现实生活中那样,商量几句就让你几步。因此一个人性化的棋盘类游戏应该具备悔棋功能。

说到悔棋,大部分程序员第一个反应就是把上一个下的棋子撤销不就行了?现在我们仔细想想这种方法的可行性。要想记住上一个棋子下的位置很容易,只需要定义两个参数,用来存放上一个下的棋子的行和列即可。但如果是要毁很多步呢,或者一般人机对战时,默认的悔一次棋就是悔两步,先悔电脑下的那一步,再悔玩家下的那一步。因此只用两个参数是远远不够的。所以我们可以考虑数组队列:

ArrayList<chess> list = new ArrayList<chess>();

数组队列用来存放每一步下的棋,当然用堆栈也行,即每下一步棋都会把这个棋子对象存入队列中:

list.add(main.chess[hang][lie]);

悔棋则是从队尾取出最后一次存进去的棋子将其对应位置的棋子抹去(如果按照笔者上一章写的代码,则是将该位置棋子的颜色参数设为2)。

if (list.size() > 0) {//如果棋盘上有棋子list.get(list.size() - 1).color = 2;//将最后一个棋子的颜色设为2list.remove(list.size() - 1);//将该棋子的下的记录删去mml.chesscol=1-mml.chesscol;//更变下一步的棋子颜色repaint();//刷新
}

在棋盘中我们还需要添加悔棋按钮。其实很简单,因为现在别看我们操作了那么多,添加了那么多功能,实际上我们都只是在改背景,而底层容器JFrame上任何组件都还没有添加呢,我们可以直接在上面添加相应组件,当然添加组件不能添加到棋盘上,组件要放在棋盘边上空余的位置。

// 添加组件
// 设置容器内组件存放方式,这里用的是流式,因此避开棋盘只需要插入一个和棋盘一样大的空的JLabel即可
this.setLayout(new FlowLayout());
JLabel blank = new JLabel();
blank.setPreferredSize(new Dimension(1000, 910));
this.add(blank);// 添加悔棋按钮
JButton hq = new JButton("悔棋");
this.add(hq);this.setVisible(true);

完整代码:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;public class main extends JFrame {MyMouseListener mml = new MyMouseListener(this);// 将棋盘对象传到监听中,方便刷新protected chess[][] chess = new chess[19][19];// 建立棋子对象,每个位置有一个对象protected ArrayList<chess> list = new ArrayList<chess>();// 存放每一步下的棋子public void initUI() {for (int i = 0; i < 19; i++)for (int j = 0; j < 19; j++)chess[i][j] = new chess(i, j);this.setTitle("五子棋v0.1");this.setSize(1000, 1000);this.setResizable(false);// 大小不可变this.setLocationRelativeTo(null);// 默认居中this.setDefaultCloseOperation(3);// 按下叉号默认关闭this.getContentPane().setBackground(new Color(240, 233, 217));// 修改背景颜色// 添加组件// 设置容器内组件存放方式,这里用的是流式,因此避开棋盘只需要插入一个和棋盘一样大的空的JLabel即可this.setLayout(new FlowLayout());JLabel blank = new JLabel();blank.setPreferredSize(new Dimension(1000, 910));this.add(blank);// 添加悔棋按钮JButton hq = new JButton("悔棋");hq.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubregret();}});this.add(hq);this.setVisible(true);this.addMouseListener(mml);// 添加监听}public void regret(){//悔棋方法if (list.size() > 0) {//如果棋盘上有棋子list.get(list.size() - 1).color = 2;//将最后一个棋子的颜色设为2list.remove(list.size() - 1);//将该棋子的下的记录删去mml.chesscol=1-mml.chesscol;//更变下一步的棋子颜色repaint();//刷新}}public void paint(Graphics g) {super.paint(g);drawChessTable(g);}public void drawChessTable(Graphics g) {// 棋盘格局为19×19,每格的边长为50for (int i = 0; i < 19; i++)g.drawLine(50, 50 + i * 50, 50 + (19 - 1) * 50, 50 + i * 50);for (int j = 0; j < 19; j++)g.drawLine(50 + j * 50, 50, 50 + j * 50, 50 + (19 - 1) * 50);// 把棋子画上去for (int i = 0; i < 19; i++)for (int j = 0; j < 19; j++) {switch (chess[i][j].color) {case 0:g.setColor(Color.BLACK);g.fillOval(chess[i][j].x - 20, chess[i][j].y - 20, 40, 40);break;case 1:g.setColor(Color.WHITE);g.fillOval(chess[i][j].x - 20, chess[i][j].y - 20, 40, 40);break;}}}public static void main(String args[]) {new main().initUI();}}class MyMouseListener implements MouseListener {int chesscol = 0;// 黑子先下private main main;MyMouseListener(main main) {// 初始化时将棋盘对象传进来,以便于下完棋子后刷新棋盘this.main = main;}public void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}public void mousePressed(MouseEvent e) {// TODO Auto-generated method stubint x = e.getX();int y = e.getY();int hang = y / 50;// 获取第几行,要不要减一看个人喜好int lie = x / 50;// 获取第几列,要不要减一看个人喜好if (x - 50 * lie < 25) {if (y - 50 * hang < 25) {// 如果上面减一这里就不用减,相对应下面就要减hang--;lie--;} else {lie--;}} else {if (y - 50 * hang < 25) {hang--;}}if (main.chess[hang][lie].color == 2) {// 当这个位置没有棋子时main.chess[hang][lie].color = chesscol;// 改完行和列之后在这里统一修改颜色main.list.add(main.chess[hang][lie]);// 将这一步棋计入队列中,方便悔棋} else {// 当这个位置有棋子了,将棋子颜色变换// 因为松开鼠标会再变一次,所以这一步相当于让下一步的棋子颜色不变chesscol = 1 - chesscol;}main.repaint();// 刷新棋盘}public void mouseReleased(MouseEvent e) {// TODO Auto-generated method stubchesscol = 1 - chesscol;// 松开鼠标后下一次下子的颜色更变}public void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}public void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}}class chess {int x, y;int color;// 0为黑,1为白chess(int hang, int lie) {// 初始化定义每个点的坐标x = 50 * lie + 50;y = 50 * hang + 50;color = 2;// 棋子没下}
}

Java程序设计:五子棋(三)——悔棋相关推荐

  1. Java程序设计 实验三

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计   班级:1353       姓名:李海空  学号:20135329 成绩:             指 ...

  2. java程序设计 第三版_清华大学出版社-图书详情-《Java语言程序设计(第3版)》...

    第3版前言 Java语言是目前应用最广泛的编程语言之一,学习和使用Java的人越来越多.为了帮助初学者尽快掌握Java编程,感受到Java语言的魅力,领会到Java编程的快乐,笔者根据长期Java授课 ...

  3. java程序设计第三版课后答案张思民

    前言 面试技巧另外开篇再说,先上面试干货吧.面试的题目并不一定有严格的顺序关系,有的是从前一个问题延伸而来,(探究的是一个知识的深度),有的是考察面试者的知识广度.有的纯粹是我想到哪里写到哪里的啦.. ...

  4. java版本五子棋之悔棋篇

    目录 构思 实际操作--悔棋 构思 书接上回 让我们来构思一下如何设计悔棋,这里就要用到java中面向对象的思想了,一种比较方便的做法是直接创建一个类,取名为Chess,针对悔棋这个环节来做. 实际操 ...

  5. Java程序设计第三次作业

    编写"学生"类及其测试类. 5.1 "学生"类: 类名:Student 属性:姓名.性别.年龄.学号.5门课程的成绩 方法1:在控制台输出各个属性的值. 方法2 ...

  6. java实验四用户程序设计_20145329《Java程序设计》实验四总结

    实验四 Android环境搭建 实验内容 1.搭建Android环境 2.运行Android 3.修改代码,能输出学号 实验步骤 1.搭建Android环境 2.安装Android,核心是配置JDK. ...

  7. java人际对战五子棋_系统框图如下 java实现五子棋程序 可以实现人人对战 人机对战 简单功能 悔棋 认输...

    展开全部 一.实验题目 五子棋游戏e69da5e6ba9062616964757a686964616f31333365633835. 二.问题分析 五子棋是双人博弈棋类益智游戏,由围棋演变而来,属纯策 ...

  8. 2019-2020-3 《Java 程序设计》第三周知识总结

    2019-2020-3 <Java 程序设计>第三周知识总结 1.类的定义 语法格式如下(加[]表示可选项): [修饰符] class 类名 { 属性定义(声明) 方法定义(声明)} 2. ...

  9. 20165206 2017-2018-2 《Java程序设计》第三周学习总结

    20165206 2017-2018-2 <Java程序设计>第三周学习总结 教材学习内容总结 类:class是关键字,用来定义类. 类声明:例如class People. 对象的声明:类 ...

  10. 20155117 王震宇 2006-2007-2 《Java程序设计》第三周学习总结

    20155117 王震宇 2006-2007-2 <Java程序设计>第三周学习总结 教材学习内容总结 在JAVA程序编写中,常常要用到对象(Object),要产生对象首先要定义类(Cla ...

最新文章

  1. excel粘贴时出现故障_了解这些信息,你会知道在ESXi5.0 的虚拟化系统下文件出现故障时,我们能做些什么?...
  2. SSLGET ×××综合实验题
  3. Springboot项目因为kackson版本问题启动报错解决方案
  4. 【错误记录】Flutter 混合开发报错 ( java.nio.file.FileSystemException: xxx/R.jar: 另一个程序正在使用此文件,进程无法访问。 )
  5. spring boot之eureka-client的pom
  6. TensorFlow: Could not load requested Qt binding.
  7. java 持续集成工具_Jenkins-Jenkins(持续集成工具)下载 v2.249.2官方版--pc6下载站
  8. php timesheet,vue版本的timesheet图表
  9. DataGridView控件的使用 1207
  10. 第二章----基本语法
  11. 自考的那些事儿(二):第二次自考完了???
  12. Flash: 涅磐与重生
  13. django配置邮件服务器,python – 使用Bluehost电子邮件服务器的Django电子邮件配置...
  14. 云原生:云计算时代命题之终极解决方案
  15. 关于Android Studio单元测试中“Method d in android.util.Log not mocked.”问题的解决。
  16. 生存分析统计方法选择,可以避免的一些坑
  17. 打地鼠java代码流程图_51单片机 普中51 打地鼠游戏 仿真 程序 流程图
  18. 有关Shiro中Principal的使用
  19. Linux中alias设置重命名出现 -bash: alias :XXX :not found 问题的解决
  20. 深度学习概念——Epoch, Batch, Iteration

热门文章

  1. 使用java实现爬取淘宝商品页面数据
  2. Ubuntu镜像系统配置
  3. 2014十大网络红人排行榜(附照片)
  4. CS285课程笔记(1)——模仿学习(Imitation Learning)
  5. 牛客网——华为题库(71~80)
  6. 在此计算机上运行应用程序不可选,win10提示此应用无法在你的电脑上运行若要找到适用怎么解决...
  7. 关键字抽取论文阅读笔记
  8. Linux系统查看环境变量(env命令)
  9. Some thoughts on Recommendation System
  10. android字体有些显示不正常显示,为什么iconfont字体图标在安卓机上显示不出来