TIC TAC TOE 消去版

编程入门 行业动态 更新时间:2024-10-24 08:23:54

TIC TAC TOE <a href=https://www.elefans.com/category/jswz/34/1768864.html style=消去版"/>

TIC TAC TOE 消去版

最近在翻学长留下的资料,发现了一个很奇怪的TIC TAC TOE的实现:

  • 两个玩家,一个打叉(X),一个打圈(O), 轮流在3乘3的格上打自己的符号,最先以横、直、斜连成一线则为胜。下图是一个X方取胜的例子。
  • 因为旧玩法如果下法无误,将得和局,所以出现变化,新玩法是在下完第七子时(先方第四子),最初的第一子要消失,第八子下完第二子消失,以此类推,保持盘上只有六子,下子后必须先处理消失之子,方可判断是否连成一条线。

不知道是不是自己比较笨,第二种是现实想了好久好久(⊙﹏⊙)b,但总算还是想出来了:主要是用ArrayList + Comparable的借口实现排序(感觉说起来很简单的样子,不知道为什么搞了两天多)。。。

现在的问题就是:

  • 代码繁杂:不少地方用了类似的代码段,但其中有些细微的差别,貌似不能用函数来笼统解决这个问题,让我很无奈;
  • 记录步数有限:由于用了一个全局变量来记录总步数并将步数分配到每个按键上,导致最终的游戏总步数有限(虽然我想2^31-1步没人能玩下来),姑且算一个不足。

    希望各位大大给出建议~

代码如下:

import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.awt.event.*;
import java.util.*;class ButtonX extends Button implements Comparable<ButtonX>{int btID = 0;public int compareTo(ButtonX other){if(this.btID < other.btID) return -1;if(this.btID == other.btID) return 0;return 1;}
}public class TicMain extends Frame {public static final int GAME_SIZE = 450;public static final int DISAPPEAR_START = 6;int totalStep = 0;ButtonX bt1, bt2, bt3, bt4, bt5, bt6, bt7, bt8, bt9;boolean player = true;List<ButtonX> btList = new ArrayList<ButtonX>();public void launchFrame() {this.setLayout(new GridLayout(3, 3, 0, 0));this.setTitle("TicTacToe! By CasterKKK");this.setLocation(400, 400);this.setSize(GAME_SIZE, GAME_SIZE);this.setBackground(Color.WHITE);this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});this.setVisible(true);this.setResizable(false);bt1 = new ButtonX();bt1.btID = Integer.MAX_VALUE;btList.add(bt1);add(bt1);bt2 = new ButtonX();bt2.btID = Integer.MAX_VALUE;btList.add(bt2);add(bt2);bt3 = new ButtonX();bt3.btID = Integer.MAX_VALUE;btList.add(bt3);add(bt3);bt4 = new ButtonX();bt4.btID = Integer.MAX_VALUE;btList.add(bt4);add(bt4);bt5 = new ButtonX();bt5.btID = Integer.MAX_VALUE;btList.add(bt5);add(bt5);bt6 = new ButtonX();bt6.btID = Integer.MAX_VALUE;btList.add(bt6);add(bt6);bt7 = new ButtonX();bt7.btID = Integer.MAX_VALUE;btList.add(bt7);add(bt7);bt8 = new ButtonX();bt8.btID = Integer.MAX_VALUE;btList.add(bt8);add(bt8);bt9 = new ButtonX();bt9.btID = Integer.MAX_VALUE;btList.add(bt9);add(bt9);bt1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {/*** Actually it is the first version of the TicTacToe. In this* version, you can put mostly nine chess pieces at all, and the* next version is focused on a new chessing process: the* chessboard can put six chess at all, while put on the seventh* chess piece, the first one will gone.*/// The first version// if (player && bt1.getLabel() == "") {// bt1.setLabel("X");// player = !player;// } else if (!player && bt1.getLabel() == "") {// bt1.setLabel("O");// player = !player;// }// The second versionif (totalStep < DISAPPEAR_START && bt1.getLabel() == "") {if (player) {bt1.setLabel("X");player = !player;totalStep++;bt1.btID = totalStep;} else if (!player) {bt1.setLabel("O");player = !player;totalStep++;bt1.btID = totalStep;}} else {Collections.sort(btList);btList.get(0).setLabel("");btList.get(0).btID = Integer.MAX_VALUE;if (player) {bt1.setLabel("X");player = !player;totalStep++;bt1.btID = totalStep;} else if (!player) {bt1.setLabel("O");player = !player;totalStep++;bt1.btID = totalStep;}}if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 1) {JOptionPane.showMessageDialog(null, "X wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == -1) {JOptionPane.showMessageDialog(null, "O wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 0) {JOptionPane.showMessageDialog(null, "Equal! One more game?");initGame();}}});bt2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {
//              The first version
//              if (player && bt2.getLabel() == "") {
//                  bt2.setLabel("X");
//                  player = !player;
//              } else if (!player && bt2.getLabel() == "") {
//                  bt2.setLabel("O");
//                  player = !player;
//              }// The second versionif (totalStep < DISAPPEAR_START && bt2.getLabel() == "") {if (player) {bt2.setLabel("X");player = !player;totalStep++;bt2.btID = totalStep;} else if (!player) {bt2.setLabel("O");player = !player;totalStep++;bt2.btID = totalStep;}} else {Collections.sort(btList);btList.get(0).setLabel("");btList.get(0).btID = Integer.MAX_VALUE;if (player) {bt2.setLabel("X");player = !player;totalStep++;bt2.btID = totalStep;} else if (!player) {bt2.setLabel("O");player = !player;totalStep++;bt2.btID = totalStep;}}if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 1) {JOptionPane.showMessageDialog(null, "X wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == -1) {JOptionPane.showMessageDialog(null, "O wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 0) {JOptionPane.showMessageDialog(null, "Equal! One more game?");initGame();}}});bt3.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {
//              First version
//              if (player && bt3.getLabel() == "") {
//                  bt3.setLabel("X");
//                  player = !player;
//              } else if (!player && bt3.getLabel() == "") {
//                  bt3.setLabel("O");
//                  player = !player;
//              }//          Second versionif (totalStep < DISAPPEAR_START && bt3.getLabel() == "") {if (player) {bt3.setLabel("X");player = !player;totalStep++;bt3.btID = totalStep;} else if (!player) {bt3.setLabel("O");player = !player;totalStep++;bt3.btID = totalStep;}} else {Collections.sort(btList);btList.get(0).setLabel("");btList.get(0).btID = Integer.MAX_VALUE;if (player) {bt3.setLabel("X");player = !player;totalStep++;bt3.btID = totalStep;} else if (!player) {bt3.setLabel("O");player = !player;totalStep++;bt3.btID = totalStep;}}if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 1) {JOptionPane.showMessageDialog(null, "X wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == -1) {JOptionPane.showMessageDialog(null, "O wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 0) {JOptionPane.showMessageDialog(null, "Equal! One more game?");initGame();}}});bt4.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {
//              First version
//              if (player && bt4.getLabel() == "") {
//                  bt4.setLabel("X");
//                  player = !player;
//              } else if (!player && bt4.getLabel() == "") {
//                  bt4.setLabel("O");
//                  player = !player;
//              }//              Second versionif (totalStep < DISAPPEAR_START && bt4.getLabel() == "") {if (player) {bt4.setLabel("X");player = !player;totalStep++;bt4.btID = totalStep;} else if (!player) {bt4.setLabel("O");player = !player;totalStep++;bt4.btID = totalStep;}} else {Collections.sort(btList);btList.get(0).setLabel("");btList.get(0).btID = Integer.MAX_VALUE;if (player) {bt4.setLabel("X");player = !player;totalStep++;bt4.btID = totalStep;} else if (!player) {bt4.setLabel("O");player = !player;totalStep++;bt4.btID = totalStep;}}if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 1) {JOptionPane.showMessageDialog(null, "X wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == -1) {JOptionPane.showMessageDialog(null, "O wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 0) {JOptionPane.showMessageDialog(null, "Equal! One more game?");initGame();}}});bt5.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {
//              First Version
//              if (player && bt5.getLabel() == "") {
//                  bt5.setLabel("X");
//                  player = !player;
//              } else if (!player && bt5.getLabel() == "") {
//                  bt5.setLabel("O");
//                  player = !player;
//              }//              Second versionif (totalStep < DISAPPEAR_START && bt5.getLabel() == "") {if (player) {bt5.setLabel("X");player = !player;totalStep++;bt5.btID = totalStep;} else if (!player) {bt5.setLabel("O");player = !player;totalStep++;bt5.btID = totalStep;}} else {Collections.sort(btList);btList.get(0).setLabel("");btList.get(0).btID = Integer.MAX_VALUE;if (player) {bt5.setLabel("X");player = !player;totalStep++;bt5.btID = totalStep;} else if (!player) {bt5.setLabel("O");player = !player;totalStep++;bt5.btID = totalStep;}}if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 1) {JOptionPane.showMessageDialog(null, "X wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == -1) {JOptionPane.showMessageDialog(null, "O wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 0) {JOptionPane.showMessageDialog(null, "Equal! One more game?");initGame();}}});bt6.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {
//              First version
//              if (player && bt6.getLabel() == "") {
//                  bt6.setLabel("X");
//                  player = !player;
//              } else if (!player && bt6.getLabel() == "") {
//                  bt6.setLabel("O");
//                  player = !player;
//              }//              Second versionif (totalStep < DISAPPEAR_START && bt6.getLabel() == "") {if (player) {bt6.setLabel("X");player = !player;totalStep++;bt6.btID = totalStep;} else if (!player) {bt6.setLabel("O");player = !player;totalStep++;bt6.btID = totalStep;}} else {Collections.sort(btList);btList.get(0).setLabel("");btList.get(0).btID = Integer.MAX_VALUE;if (player) {bt6.setLabel("X");player = !player;totalStep++;bt6.btID = totalStep;} else if (!player) {bt6.setLabel("O");player = !player;totalStep++;bt6.btID = totalStep;}}if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 1) {JOptionPane.showMessageDialog(null, "X wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == -1) {JOptionPane.showMessageDialog(null, "O wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 0) {JOptionPane.showMessageDialog(null, "Equal! One more game?");initGame();}}});bt7.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {
//              First Version
//              if (player && bt7.getLabel() == "") {
//                  bt7.setLabel("X");
//                  player = !player;
//              } else if (!player && bt7.getLabel() == "") {
//                  bt7.setLabel("O");
//                  player = !player;
//              }//              Second versionif (totalStep < DISAPPEAR_START && bt7.getLabel() == "") {if (player) {bt7.setLabel("X");player = !player;totalStep++;bt7.btID = totalStep;} else if (!player) {bt7.setLabel("O");player = !player;totalStep++;bt7.btID = totalStep;}} else {Collections.sort(btList);btList.get(0).setLabel("");btList.get(0).btID = Integer.MAX_VALUE;if (player) {bt7.setLabel("X");player = !player;totalStep++;bt7.btID = totalStep;} else if (!player) {bt7.setLabel("O");player = !player;totalStep++;bt7.btID = totalStep;}}if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 1) {JOptionPane.showMessageDialog(null, "X wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == -1) {JOptionPane.showMessageDialog(null, "O wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 0) {JOptionPane.showMessageDialog(null, "Equal! One more game?");initGame();}}});bt8.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {
//              Frist version
//              if (player && bt8.getLabel() == "") {
//                  bt8.setLabel("X");
//                  player = !player;
//              } else if (!player && bt8.getLabel() == "") {
//                  bt8.setLabel("O");
//                  player = !player;
//              }//              Second versionif (totalStep < DISAPPEAR_START && bt8.getLabel() == "") {if (player) {bt8.setLabel("X");player = !player;totalStep++;bt8.btID = totalStep;} else if (!player) {bt8.setLabel("O");player = !player;totalStep++;bt8.btID = totalStep;}} else {Collections.sort(btList);btList.get(0).setLabel("");btList.get(0).btID = Integer.MAX_VALUE;if (player) {bt8.setLabel("X");player = !player;totalStep++;bt8.btID = totalStep;} else if (!player) {bt8.setLabel("O");player = !player;totalStep++;bt8.btID = totalStep;}}if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 1) {JOptionPane.showMessageDialog(null, "X wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == -1) {JOptionPane.showMessageDialog(null, "O wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 0) {JOptionPane.showMessageDialog(null, "Equal! One more game?");initGame();}}});bt9.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {
//              First version
//              if (player && bt9.getLabel() == "") {
//                  bt9.setLabel("X");
//                  player = !player;
//              } else if (!player && bt9.getLabel() == "") {
//                  bt9.setLabel("O");
//                  player = !player;
//              }//              Second versionif (totalStep < DISAPPEAR_START && bt9.getLabel() == "") {if (player) {bt9.setLabel("X");player = !player;totalStep++;bt9.btID = totalStep;} else if (!player) {bt9.setLabel("O");player = !player;totalStep++;bt9.btID = totalStep;}} else {Collections.sort(btList);btList.get(0).setLabel("");btList.get(0).btID = Integer.MAX_VALUE;if (player) {bt9.setLabel("X");player = !player;totalStep++;bt9.btID = totalStep;} else if (!player) {bt9.setLabel("O");player = !player;totalStep++;bt9.btID = totalStep;}}if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 1) {JOptionPane.showMessageDialog(null, "X wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == -1) {JOptionPane.showMessageDialog(null, "O wins! One more game?");initGame();} else if (checkWin(bt1.getLabel(), bt2.getLabel(), bt3.getLabel(), bt4.getLabel(), bt5.getLabel(),bt6.getLabel(), bt7.getLabel(), bt8.getLabel(), bt9.getLabel()) == 0) {JOptionPane.showMessageDialog(null, "Equal! One more game?");initGame();}}});}public int checkWin(String bt1, String bt2, String bt3, String bt4, String bt5, String bt6, String bt7, String bt8,String bt9) {if (((bt1 == bt2 && bt1 == bt3 && bt1 == "X") || (bt4 == bt5 && bt4 == bt6 && bt4 == "X")|| (bt7 == bt8 && bt7 == bt9 && bt7 == "X") || (bt1 == bt4 && bt1 == bt7 && bt1 == "X")|| (bt2 == bt5 && bt5 == bt8 && bt2 == "X") || (bt3 == bt6 && bt6 == bt9 && bt3 == "X")|| (bt1 == bt5 && bt5 == bt9 && bt1 == "X") || (bt3 == bt5 && bt5 == bt7 && bt3 == "X"))) {return 1;} else if (((bt1 == bt2 && bt1 == bt3 && bt1 == "O") || (bt4 == bt5 && bt4 == bt6 && bt4 == "O")|| (bt7 == bt8 && bt7 == bt9 && bt7 == "O") || (bt1 == bt4 && bt1 == bt7 && bt1 == "O")|| (bt2 == bt5 && bt5 == bt8 && bt2 == "O") || (bt3 == bt6 && bt6 == bt9 && bt3 == "O")|| (bt1 == bt5 && bt5 == bt9 && bt1 == "O") || (bt3 == bt5 && bt5 == bt7 && bt3 == "O"))) {return -1;} else if (bt1 != "" && bt2 != "" && bt3 != "" && bt4 != "" && bt5 != "" && bt6 != "" && bt7 != "" && bt8 != ""&& bt9 != "") {return 0;}return 2;}public void initGame() {bt1.setLabel("");bt2.setLabel("");bt3.setLabel("");bt4.setLabel("");bt5.setLabel("");bt6.setLabel("");bt7.setLabel("");bt8.setLabel("");bt9.setLabel("");}public static void main(String[] args) {TicMain tm = new TicMain();tm.launchFrame();}

PS:那个注释部分是第一种实现,没有把它融入整个游戏中;
PPS:没有注释真是不好意思;
PPPS:INTELLJ真是意外好用,貌似eclipse不能在ActionListener里头设断点,但IntellJ可以,而且Debug时顺手多了。

更多推荐

TIC TAC TOE 消去版

本文发布于:2024-02-25 02:16:54,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1697446.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:消去   TIC   TAC   TOE

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!