TIC TAC TOE 消去版
来源:互联网 发布:唢呐软件下载 编辑:程序博客网 时间:2024/05/16 12:22
最近在翻学长留下的资料,发现了一个很奇怪的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 version if (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 version if (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 version if (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 version if (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 version if (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 version if (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 version if (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 version if (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 version if (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时顺手多了。
0 0
- TIC TAC TOE 消去版
- Tic-Tac-Toe
- [cf]Tic-tac-toe
- C - Tic-tac-toe
- Minimax-Tic Tac Toe
- Design Tic-Tac-Toe
- Design Tic-Tac-Toe
- Design Tic-Tac-Toe
- FZU Tic-Tac-Toe
- Tic-Tac-Toe FZU
- FZU2283-Tic-Tac-Toe
- tic-tac-toe游戏
- Analysis On Tic-Tac-Toe
- poj 3075 Tic-Tac-Toe
- checkio (tic-tac-toe)
- AOJ 0066 Tic Tac Toe
- UVa 10363 - Tic Tac Toe
- poj 2361 Tic Tac Toe
- Java排序三:直接插入排序
- Android&java的成长之路之八(Android短信验证 亲测)
- ScheduleExecutorService,周期性线程池
- 博客迁移
- 卡方独立性检验chisq.test()
- TIC TAC TOE 消去版
- [C语言][LeetCode][206]Reverse Linked List
- ACE日志
- Android应用程序插件化研究之DexClassLoader
- 思科高清终端C40 用CRT配置
- JavaSE学习笔记_3:Java面向对象
- 如何在CentOS 7上修改主机名
- hdu1548(BFS广搜入门)
- Java排序四:二分插入排序