JavaSE实现五子棋小游戏 JavaSE实现五子棋小游戏

JavaSE实现五子棋小游戏

五子棋小游戏一共有四个类:background.java(画五子棋的背景)、constant.java(存储一些常量)、ruler.java(判赢规则)、Main.java(启动类)。

一步一步来,我们先定义好游戏内的常量(这里是我一点一点调出来的):


  
  
  1. public class constant {
  2. final static int h = 14; // 行数
  3. final static int l = 14; // 列数
  4. final static int space = 50; // 行与行之间,列与列之间距离
  5. final static int height = 750; // 窗口高度
  6. final static int width = 750; // 窗口宽度
  7. }

然后画好五子棋的棋盘background.java,这里也很简单就是两个for循环,一个画横线,一个画竖线:


  
  
  1. public class background {
  2. public static void draw(Graphics g) {
  3. g.setColor(Color.black);
  4. for ( int i = 1; i < constant.h + 1; i++)
  5. g.drawLine(i * constant.space, 50, i * constant.space, constant.height - 50);
  6. for ( int i = 1; i < constant.l + 1; i++)
  7. g.drawLine( 50, i * constant.space, constant.width - 50, i * constant.space);
  8. }
  9. }

然后是我们的判赢规则ruler.java,其实也相当简单(因为白棋画不出来,所以用的蓝棋替代):

这里说一下方法参数ArrayList中存储的数据是什么?

其实存储就是每个棋子在棋盘上的位置,在这里我规定的是最左上角的那个落棋点坐标为1,然后向右依次为2、3 、4.。。。,然后第二行最左边的坐标为第一行最右边的坐标加1,以此类推,棋盘上每一个点都有唯一的坐标。

这样我们就可以根据,棋子的坐标,来判定是否已经连成5个。


  
  
  1. public class ruler {
  2. public static boolean blackWin(ArrayList<Integer> list) {
  3. for ( int i = 1; i <= constant.h * constant.l; i++) {
  4. // 如果同时出现横着的五个黑棋
  5. if (i % constant.h <= 10 && list.contains(i) && list.contains(i + 1) && list.contains(i + 2)
  6. && list.contains(i + 3) && list.contains(i + 4))
  7. return true;
  8. // 如果同时出现竖着的五个黑棋
  9. if (i < (constant.h - 4) * constant.l && list.contains(i) && list.contains(i + constant.l)
  10. && list.contains(i + constant.l * 2) && list.contains(i + constant.l * 3)
  11. && list.contains(i + constant.l * 4))
  12. return true;
  13. // 如果同时出现左倾斜的五个黑棋
  14. if (i % constant.h <= 10 && i < (constant.h - 4) * constant.l && list.contains(i)
  15. && list.contains(i + constant.l + 1) && list.contains(i + (constant.l + 1) * 2)
  16. && list.contains(i + (constant.l + 1) * 3) && list.contains(i + (constant.l + 1) * 4))
  17. return true;
  18. // 如果同时出现右倾斜的五个黑棋
  19. if (i % constant.l >= 5 && i < (constant.h - 4) * constant.l && list.contains(i)
  20. && list.contains(i + (constant.l - 1) * 1) && list.contains(i + (constant.l - 1) * 2)
  21. && list.contains(i + (constant.l - 1) * 3) && list.contains(i + (constant.l - 1) * 4))
  22. return true;
  23. }
  24. return false;
  25. }
  26. public static boolean blueWin(ArrayList<Integer> list) {
  27. for ( int i = 1; i <= constant.h * constant.l; i++) {
  28. // 如果同时出现横着的五个蓝棋
  29. if (i % constant.h <= 10 && list.contains(i) && list.contains(i + 1) && list.contains(i + 2)
  30. && list.contains(i + 3) && list.contains(i + 4))
  31. return true;
  32. // 如果同时出现竖着的五个蓝棋
  33. if (i < (constant.h - 4) * constant.l && list.contains(i) && list.contains(i + constant.l)
  34. && list.contains(i + constant.l * 2) && list.contains(i + constant.l * 3)
  35. && list.contains(i + constant.l * 4))
  36. return true;
  37. // 如果同时出现左倾斜的五个蓝棋
  38. if (i % constant.h <= 10 && i < (constant.h - 4) * constant.l && list.contains(i)
  39. && list.contains(i + constant.l + 1) && list.contains(i + (constant.l + 1) * 2)
  40. && list.contains(i + (constant.l + 1) * 3) && list.contains(i + (constant.l + 1) * 4))
  41. return true;
  42. // 如果同时出现右倾斜的五个蓝棋
  43. if (i % constant.l >= 5 && i < (constant.h - 4) * constant.l && list.contains(i)
  44. && list.contains(i + (constant.l - 1) * 1) && list.contains(i + (constant.l - 1) * 2)
  45. && list.contains(i + (constant.l - 1) * 3) && list.contains(i + (constant.l - 1) * 4))
  46. return true;
  47. }
  48. return false;
  49. }
  50. }

最后就是主类Main.java:


  
  
  1. public class Main extends JFrame {
  2. private JPanel p;
  3. private int Pointx, Pointy; // 获得棋子的落点位置
  4. private int count = 0; // 获得点击次数,用来实现棋子转换
  5. private ArrayList<Integer> listblack = new ArrayList<>(); //存放黑棋落点位置
  6. private ArrayList<Integer> listblue = new ArrayList<>(); //存放蓝棋落点位置
  7. public Main() {
  8. super( "五子棋");
  9. p = new JPanel();
  10. p.addMouseListener( new Monitor());
  11. this.add(p);
  12. setSize( 750, 750);
  13. setVisible( true);
  14. }
  15. class Monitor extends MouseAdapter {
  16. @Override
  17. public void mouseReleased(MouseEvent e) {
  18. Pointx = Location(e.getX() + 8); // 鼠标实际点击位置与获得坐标有偏差,这里大家根据自己的情况修改
  19. Pointy = Location(e.getY() + 31);
  20. repaint();
  21. }
  22. }
  23. public void paint(Graphics g) {
  24. background.draw(g); // 画出棋盘
  25. // 如果该点之前没被画过,即blacklist和bluelist都不含此点
  26. if (!listblue.contains(point(Pointx, Pointy)) && !listblack.contains(point(Pointx, Pointy))) {
  27. if (count % 2 == 0) {
  28. g.setColor(Color.black);
  29. g.fillOval(Pointx - 20, Pointy - 20, 40, 40);
  30. listblack.add(point(Pointx, Pointy));
  31. } else {
  32. g.setColor(Color.blue);
  33. g.fillOval(Pointx - 20, Pointy - 20, 40, 40);
  34. listblue.add(point(Pointx, Pointy));
  35. }
  36. count++;
  37. }
  38. gameOver();
  39. }
  40. // 定位与所点击 点最近的落子位置
  41. public int Location(int x) {
  42. int lx;
  43. lx = (x * 2 + 50) / 100;
  44. return lx * 50;
  45. }
  46. // 给棋盘上每个点一个标号,方便判断胜利
  47. public int point(int x, int y) {
  48. return x / 50 + (y / 50 - 1) * constant.h;
  49. }
  50. public void gameOver() {
  51. if (ruler.blackWin(listblack)) {
  52. JOptionPane.showMessageDialog( this, "黑棋胜!", "游戏结束", JOptionPane.INFORMATION_MESSAGE);
  53. System.exit( 0);
  54. }
  55. if (ruler.blueWin(listblue)) {
  56. JOptionPane.showMessageDialog( this, "蓝棋胜!", "游戏结束", JOptionPane.INFORMATION_MESSAGE);
  57. System.exit( 0);
  58. }
  59. }
  60. public static void main(String[] args) {
  61. Main m = new Main();
  62. m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  63. }
  64. }

最后运行里面的main方法,就可以启动游戏了。

猜你喜欢

转载自blog.csdn.net/weixin_41722928/article/details/107543626