`
JAVA求学者
  • 浏览: 9494 次
  • 性别: Icon_minigender_1
  • 来自: 江西
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

最近做的一个三子棋,菜的话 不要笑话哦

阅读更多

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.LineBorder;

public class TicTacToe extends JFrame{
 //声明char变量 whoseTurn,并赋初值X;
 private char whoseTurn='X';
 
 //创建并初始化一个3*3的Cell类对象二维数组
 private Cell[][] cells=new Cell[3][3];
 
 //创建一个并初始化一个标签 用来显示游戏状态
 private JLabel jlbMessage=new JLabel("现在轮到X方下棋了");
 
 //创建并初始化一个按钮,用来进行新游戏
 private JButton jbtNewGame=new JButton("新游戏");
 
 //创建UI
 public TicTacToe(){
  //创建一个面板来设置单元格
  JPanel p1=new JPanel();
  
  //创建一个面板来装 jbtNewGame
  JPanel p2=new JPanel();
  
  p1.setLayout(new GridLayout(3,3,0,0));
  for(int i=0;i<3;i++){
   for(int j=0;j<3;j++){
    p1.add(cells[i][j]=new Cell());
   }
  }
  
  //为单元格设置边框
  p1.setBorder(new LineBorder(Color.red,1));//创建具有指定颜色和厚度的边框
  jlbMessage.setBorder(new LineBorder(Color.yellow,1));
  
  //设置p2里的属性
  p2.setLayout(new FlowLayout());
  p2.add(jbtNewGame);
  
  //放置p和jlbMessage
  add(p1,BorderLayout.CENTER);
  add(jlbMessage,BorderLayout.SOUTH);
  add(p2,BorderLayout.NORTH);
 }
 
 //判断单元格是否填满
 public boolean isFull(){
  for(int i=0;i<3;i++){
   for(int j=0;j<3;j++){
    if(cells[i][j].getToken()==' '){
     return false;
    }
   }
  }
  return true;
 }
 
 //决定究竟谁持有的token赢
 public boolean isWon(char token){
  //判断列是否有三个相同token的情况
  for(int i=0;i<3;i++){
   if((cells[i][0].getToken())==token&&(cells[i][1].getToken()==token)&&(cells[i][2].getToken()==token)){
    return true;
   }
  }
  
  //判断行是否有三个相同token的情况
  for(int j=0;j<3;j++){
   if((cells[0][j].getToken()==token)&&(cells[1][j].getToken()==token)&&(cells[2][j].getToken()==token)){
    return true;
   }
  }
  
  //判断主对角线是否有三个相同token的情况
  if((cells[0][0].getToken()==token)&&(cells[1][1].getToken()==token)&&(cells[2][2].getToken()==token)){
   return true;
  }
  
  //判断副对角线是否有三个相同token的情况
  if((cells[0][2].getToken()==token)&&(cells[1][1].getToken()==token)&&(cells[2][0].getToken()==token)){
   return true;
  }
  
  //其余的情况 为平局 返回false
  return  false;
 }
 
 //cell类
 public class Cell extends JPanel{
  //单元格标记,默认为' '(空)
  private char token=' ';
  
  //构造方法
  public Cell(){
   //为单元格画边框(边框色为黑,且厚度为1)
   setBorder(new LineBorder(Color.black,1));
   //注册鼠标监听器
   addMouseListener(new MouseListener());
   //注册按钮监听器
   jbtNewGame.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
     if(e.getSource()==jbtNewGame){
      for(int i=0;i<3;i++){
       for(int j=0;j<3;j++){
        cells[i][j].setToken(' ');
        cells[i][j].repaint();
       }
      }
      jlbMessage.setText("开始新游戏,X先手");
      whoseTurn='X';
     }
    }
   });
  }
  
  //返回token
  public char getToken(){
   return token;
  }
  
  //设置一个新的token
  public void setToken(char c){
   token=c;
   repaint();//刷新
  }
  
  //覆盖paintComponent方法
  protected void paintComponent(Graphics g){
   super.paintComponent(g);
   
   //若token为X,则画相交直线
   if(token=='X'){
    g.drawLine(10,10,getWidth()-10,getHeight()-10);
    g.drawLine(getWidth()-10,10,10,getHeight()-10);
   }
   
   //若token为O,则画椭圆
   else if(token=='O'){
    g.drawOval(10,10,getWidth()-20,getHeight()-20);
   }
  }
   
  //用监听器接口适配器来实现注册鼠标监听器
  private class MouseListener extends MouseAdapter{
   //处理鼠标在单元格上的点击事件
   public void mouseClicked(MouseEvent e){
    //若单元格为空并且游戏未结束
    if(token==' '&&whoseTurn!=' '){
     setToken(whoseTurn);
     
     //检查游戏状态
     if(isWon(whoseTurn)){
      jlbMessage.setText(whoseTurn+"赢得了比赛");
      whoseTurn=' ';
     }
     else if(isFull()){
      jlbMessage.setText("平局,游戏结束");
      whoseTurn=' ';
     }
     else{
      whoseTurn=(whoseTurn=='X')?'O':'X';
      jlbMessage.setText("现在轮到"+whoseTurn+"下了");
     } 
    }
   }
  }
 }
 
 //主类
 public static void main(String[] args){
  TicTacToe frame=new TicTacToe();
  frame.setSize(400,400);
  frame.setLocationRelativeTo(null);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);
 }
}

分享到:
评论

相关推荐

    三子棋三子棋三子棋三子棋

    三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋

    java三子棋简单三子棋

    java三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋三子棋

    三子棋程序

    JAVA 三子棋程序 用到了 网络 多线程等的技术 可以用来学习参考

    新手自己做的vb三子棋

    新手自己做的vb三子棋,很简陋,而且只能两个人在电脑前点没什么技术含量。。

    易语言智能三子棋

    易语言智能三子棋源码,智能三子棋,初始化,判断胜利,启动AI,AI触发2

    三子棋三子棋三子棋c#

    自己为了交作业简单做的,大家可以拿去看看,有不好的地方可以提点意见

    三子棋源码

    三子棋源代码,写的不知行不行

    三子棋(井字棋)C#程序

    这是我用C#实现的一个三子棋的小程序,在VS2005上开发的。包括可运行的程序,和必要的注释。

    三子棋设计

    用c++来设计一个三子棋的程序,这个程序是让人与电脑相互比赛的,

    三子棋游戏

    像五子棋一样,尽量使自己的子能凑成‘三’,当你的棋子凑成‘三’了以后,你可以把对方任一个子废掉(该子将会变灰色,下子完了以后,它将会被去掉)。2)行棋阶段:下完子了,就进入行棋阶段。在这个阶段,不能下...

    三子棋.zip

    小时候玩的三子棋游戏 用C语言编写的

    三子棋源代码

    自己做的三子棋的源代码,希望大家提出建议.

    Java写的网络三子棋

    仅供参考 模仿了QQ斗地主等游戏的大厅方式。 运行效果可参考我的博客:http://dengjij.blog.sohu.com/139857508.html?act=1261035670057 Java课程的实验。 含源代码、jar、生成的javadoc,说明和设计报告等文件。

    三子棋游戏java源码

    一个简单的三子棋游戏,不包含复杂的算法,很容易理解

    关于三子棋结局的判断

    简介:这是关于三子棋结局的判定的详细介绍,介绍了和c/c++,关于三子棋结局的判定有关的知识,

    人机版三子棋

    小弟做的一个三子棋``很很简单的 这是我刚学完VC做的 新手做参考```

    三子棋的源码

    三子棋的源码,其逻辑和五子棋类似。可以作为学习五子棋的基础来学习。

    三子棋之C语言实现

    一款用C语言做的简易游戏,exe可以直接运行 sanziqi.h是头文件 三子棋.cpp是实现的函数 test.cpp是测试文件,包含main函数

    vs2010 c++ 三子棋程序

    三子棋游戏,基于vs2010 控制台开发。对抗模式 人人对抗,人机对抗,AI vs AI

    用c#制作的有可爱主题三子棋

    这是使用c#制作的三子棋,其中有一些东西做的不好请大家指导!!

Global site tag (gtag.js) - Google Analytics