五子棋(极简版)

简介: 简单五子棋

简单五子棋

棋盘棋子

public void paint(Graphics g) {
    super.paint(g);   //super 相当于是指向当前对象的父类
    //画棋盘
    for(int i=0;i<15;i++) {
        g.setColor(Color.blue);
        g.drawLine(30, 150+i*30, 450, 150+i*30);
        g.drawLine(30+i*30, 150, 30+i*30, 570);
      }
    //画棋子
    for(int i=0;i<15;i++)     //进行了一次遍历,遍历 chess[][]!=0.画下棋子
      for(int j=0;j<15;j++) {
      if(allChess[i][j]==1) {
        int ovalX=i*30+20;
        int ovalY=j*30+140;
        g.setColor(Color.black);
        g.fillOval(ovalX,ovalY , 20, 20);
        g.drawOval(ovalX,ovalY , 20, 20);
      } 
      if(allChess[i][j]==2) {
        int ovalX=i*30+20;
        int ovalY=j*30+140;
        g.setColor(Color.white);
        g.fillOval(ovalX,ovalY , 20, 20);
        g.drawOval(ovalX,ovalY , 20, 20);
      } 
    }
  }

鼠标监听

public void mousePressed(MouseEvent e) {
    if(canPlay) {
      x=e.getX();
      y=e.getY();
      if(x>=20 && x<=460 && y>=160 && y<=580) {//判断是否超出棋盘范围
        x=(int)(x/30.0-0.5);
        y=(int)((y-120)/30.0-0.5);//因为要下在相交处,四舍五入确定精度
        if(allChess[x][y]==0) {
          if(isblack) {         
            allChess[x][y]=1;                                                            
            isblack=false;//判定是下哪个棋子
          }
          else {
            allChess[x][y]=2;
            isblack=true;
          }
          this.repaint();//重绘
          if(isWin()) {
            if(allChess[x][y]==1) JOptionPane.showMessageDialog(this, "黑方获胜");
            else          JOptionPane.showMessageDialog(this, "白方获胜");
            this.canPlay=false;//不能下了
          }
        }
      }
      }
    }

判定

  public boolean isWin() {
    boolean flag=false;
    int count=1;
    //四种判定
    //1
    count=checkCount(0, 1, allChess[x][y]);
        if(count==5) flag=true;
        //2
    count=checkCount(1, 0, allChess[x][y]);
        if(count==5) flag=true;
        //3
    count=checkCount(1, 1, allChess[x][y]);
        if(count==5) flag=true;
        //4
    count=checkCount(1, -1, allChess[x][y]);
        if(count==5) flag=true;
    return flag;
  }
  public int checkCount(int xChange,int yChange,int color) {
    int count=1;
    int tX=xChange;
    int tY=yChange;
    while(x+xChange>=0&&x+xChange<=15&&y+yChange>=0&& 
        y+yChange<=15&& color==allChess[x+xChange][y+yChange]) //防止数组越界
    {
      count++;
      if(xChange!=0)  xChange++;
      if(yChange!=0) {
        if(yChange>0) yChange++;
        else  yChange--;
      }   //半边的判断
    }
    xChange=tX;
    yChange=tY;//之所以不用传过来的数据又定义了一个,是防止自加自减出现错误
    while(x-xChange>=0&& x-xChange<15&&y-yChange>=0&&
        y-yChange<15&&color==allChess[x-xChange][y-yChange])
    {
      count++;
      if(xChange!=0)  xChange++;
      if(yChange!=0) {
        if(yChange>0) yChange++;
        else  yChange--;
      }   //半边的判断
    }
    return count;
  }

这是一个极简版的五子棋,不能人人,无悔棋,认输等按钮,只能下棋,以后或许会改进的,接下来上源码

package chess;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
//界面
public class MyChess extends JFrame implements MouseListener{
  /**
   * 
   */
  private static final long serialVersionUID = 1L;
  int [][] allChess=new int [15][15]; //把棋子放进数组中
  int x,y;            //用getX()获得 鼠标点击的坐标
  boolean canPlay=true; //判断是否能下
  boolean isblack=true; //判断是否应该改下黑棋子
  int i,j;
  public MyChess(){
    this.setTitle("五子棋");
    this.setSize(600,600);
    this.setLocation(300, 300);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setResizable(false);         //设置窗口不可改变
    this.getContentPane().setBackground(Color.orange);  //设置窗口的背景颜色
    this.setVisible(true);
    this.repaint();
    this.addMouseListener(this);
  }
  public void paint(Graphics g) {
    super.paint(g);   //super 相当于是指向当前对象的父类
    //画棋盘
    for(int i=0;i<15;i++) {
        g.setColor(Color.blue);
        g.drawLine(30, 150+i*30, 450, 150+i*30);
        g.drawLine(30+i*30, 150, 30+i*30, 570);
      }
    //画棋子
    for(int i=0;i<15;i++)     //进行了一次遍历,遍历 chess[][]!=0.画下棋子
      for(int j=0;j<15;j++) {
      if(allChess[i][j]==1) {
        int ovalX=i*30+20;
        int ovalY=j*30+140;
        g.setColor(Color.black);
        g.fillOval(ovalX,ovalY , 20, 20);
        g.drawOval(ovalX,ovalY , 20, 20);
      } 
      if(allChess[i][j]==2) {
        int ovalX=i*30+20;
        int ovalY=j*30+140;
        g.setColor(Color.white);
        g.fillOval(ovalX,ovalY , 20, 20);
        g.drawOval(ovalX,ovalY , 20, 20);
      } 
    }
  }
  public void mousePressed(MouseEvent e) {
    if(canPlay) {
      x=e.getX();
      y=e.getY();
      if(x>=20 && x<=460 && y>=160 && y<=580) {//判断是否超出棋盘范围
        x=(int)(x/30.0-0.5);
        y=(int)((y-120)/30.0-0.5);//因为要下在相交处,四舍五入确定精度
        if(allChess[x][y]==0) {
          if(isblack) {
            allChess[x][y]=1;                                                                                     
            isblack=false;//判定是下哪个棋子
          }
          else {
            allChess[x][y]=2;
            isblack=true;
          }
          this.repaint();//重绘
          if(isWin()) {
            if(allChess[x][y]==1) JOptionPane.showMessageDialog(this, "黑方获胜");
            else          JOptionPane.showMessageDialog(this, "白方获胜");
            this.canPlay=false;//不能下了
          }
        }
      }
      }
    }
  public boolean isWin() {
    boolean flag=false;
    int count=1;
    //四种判定
    //1
    count=checkCount(0, 1, allChess[x][y]);
        if(count==5) flag=true;
        //2
    count=checkCount(1, 0, allChess[x][y]);
        if(count==5) flag=true;
        //3
    count=checkCount(1, 1, allChess[x][y]);
        if(count==5) flag=true;
        //4
    count=checkCount(1, -1, allChess[x][y]);
        if(count==5) flag=true;
    return flag;
  }
  public int checkCount(int xChange,int yChange,int color) {
    int count=1;
    int tX=xChange;
    int tY=yChange;
    while(x+xChange>=0&&x+xChange<=15&&y+yChange>=0&& 
        y+yChange<=15&& color==allChess[x+xChange][y+yChange]) //防止数组越界
    {
      count++;
      if(xChange!=0)  xChange++;
      if(yChange!=0) {
        if(yChange>0) yChange++;
        else  yChange--;
      }   //半边的判断
    }
    xChange=tX;
    yChange=tY;//之所以不用传过来的数据又定义了一个,是防止自加自减出现错误
    while(x-xChange>=0&& x-xChange<15&&y-yChange>=0&&
        y-yChange<15&&color==allChess[x-xChange][y-yChange])
    {
      count++;
      if(xChange!=0)  xChange++;
      if(yChange!=0) {
        if(yChange>0) yChange++;
        else  yChange--;
      }   //半边的判断
    }
    return count;
  }
  @Override
  public void mouseClicked(MouseEvent e) {
    // TODO Auto-generated method stub
  }
  @Override
  public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub
  }
  @Override
  public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub
  }
  @Override
  public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub
  }
  public static void main(String[] args) {
    new MyChess();
  }
}
相关文章
飞机大战
飞机大战完整版。
88 1
飞机大战-我机是否被击中(7)
编写飞机大战,完成我机是否被击中功能。
50 0
|
小程序 测试技术 Python
软件测试|教你使用Python实现五子棋游戏(一)
软件测试|教你使用Python实现五子棋游戏(一)
软件测试|教你使用Python实现五子棋游戏(一)
|
2月前
|
前端开发 JavaScript 数据可视化
10分钟-带你走进H5-五子棋
10分钟-带你走进H5-五子棋
52 0
10分钟-带你走进H5-五子棋
|
5月前
|
算法 定位技术 C语言
俄罗斯方块游戏编程
设计了一款基于AT89C51单片机的俄罗斯方块游戏,使用LCD12864作为显示界面,并通过按键控制方块移动与变形。系统包括电源、单片机最小系统、显示模块和按键模块。实现了方块随机生成、匀速下落及玩家交互控制等功能。游戏支持得分与计时显示,当方块堆至顶端无法消除时游戏结束。通过Proteus仿真验证了系统的功能性和稳定性,满足设计需求。提供的C代码片段展示了方块碰撞检测与地图检查逻辑。
|
6月前
|
开发者 Python
小游戏实战丨基于Tkinter的五子棋小游戏
小游戏实战丨基于Tkinter的五子棋小游戏
98 4
|
定位技术 开发工具 Python
python实现超级玛丽游戏
Pygame是一个Python模块,旨在使编写视频游戏等多媒体应用程序变得更加轻松。它提供了一个用于处理音频、图像和鼠标/键盘输入等方面的工具集。Pygame也提供了一些预先编写好的模块,如Sprites(用于管理游戏中的对象)和Pygame.display(用于创建和管理窗口)。 Pygame基于SDL库(Simple DirectMedia Layer),它是一个跨平台的开源的低级多媒体库,用于对音频、键盘、鼠标、图形硬件以及低级的操作系统特性进行访问。 当使用Pygame时,你能够创建游戏窗口、读取键盘输入、播放音频、处理碰撞以及执行游戏逻辑。这些功能使Pygame称为一个适用于初学
672 19
python实现超级玛丽游戏
|
算法 Java
Java实现五子棋对战小游戏
Java实现五子棋对战小游戏
Java实现五子棋对战小游戏
|
Java 程序员 PHP
C#五子棋(C#课程设计)
C#五子棋(C#课程设计)
119 0
|
设计模式 测试技术 Python
Python实现坦克大战(TankWar)游戏(下)
Python实现坦克大战(TankWar)游戏
215 0

相关实验场景

更多