java实现最简单的五子棋,基于java的五子棋游戏的设计代码
本文分享Java实现简单五子棋游戏的具体代码,供大家参考。具体内容如下
五子棋是一个简单的小游戏。先想想五子棋有什么,棋子,棋盘。
首先我们可以定义一个棋子类,有棋子的坐标、半径、颜色;和卒的构造者;
导入Java . awt . color;/* *卒类*/公类棋类{ private int x;//棋子private int y的x坐标索引;//棋子的y坐标索引,私有颜色Color;//卒色公共静态int DIAMETER=30//直径公棋(int x,int y,color color){//卒构造器this.x=xthis.y=ythis.color=color} public int getX(){ return x;} public int getY(){ return y;} public Color getColor(){ return Color;}}接下来,我们定义一个主框架。在主框架中,有面板对象和三个按钮对象,分别是重启按钮、后悔按钮和退出按钮。还设置了一个按钮事件类来监控三个按钮并做出相应的动作。
导入Java . awt . *;导入Java . awt . event . action event;导入Java . awt . event . action listener;导入javax . swing . *;/* *五子棋主框架*/公开课Chess JFrame扩展JFrame {私棋Bord Chess Bord//声明一个棋盘对象私有面板工具;//声明一个面板对象私有按钮StartButton//声明开始按钮私有按钮BackButton//声明后悔按钮私有按钮exitButton//声明退出按钮public chesjframe(){//构造函数setTitle(单机五子棋);//设置标题my button Lister MB=New my button Lister();//按钮事件处理对象tool=new Panel();//Panel对象chess bord=new chess bord();//棋盘对象start Button=new Button( restart );//设置开始按钮BackButton=新建按钮(后悔棋);//设置后悔按钮exitButton=new按钮(退出游戏);//设置退出游戏按钮tool . Set layout(new flow layout(flow layout . center));//流式布局tool . add(start button);tool.add(后退按钮);tool . add(exit button);//在面板对象startbutton.addActionListener中添加三个按钮(MB);back button . addactionlistener(MB);exit button . addactionlistener(MB);//将三个按钮添加到事件监视器add(tool,BorderLayout。南);//按钮add的位置(chess bord);//添加棋盘对象SetDefaultCloseoperation(jframe . exit _ on _ close);//设置为close pack();//Adaptive}私有类My Button Listener实现Action Listener {//Button处理事件类@ Override Public Void Action Performed(Action Event E){//todo自动生成方法stub object obj=E . getsource();//获取事件源if(obj==StartButton) {//事件源为重启按钮system . out . println( restart );
chessbord.restartGame(); } else if(obj==BackButton) {//事件源是悔棋按钮 System.out.println("悔棋!"); chessbord.goback(); } else if(obj==exitButton) {//事件源是退出按钮 System.exit(0); } } } public static void main(String[] args) { ChessJFrame jf=new ChessJFrame();//声明框架对象 jf.setLocationRelativeTo(null);//居中显示 jf.setVisible(true);//设置为可见 } }最后一个类是棋盘类,我们要对棋盘的边距,网格的距离进行赋值,设定棋盘的初始状态,如默认黑子先下,定义一个棋子类数组,来保存棋子对象,再定义一个字符串二维数组函数来保存的颜色,用来判断输赢,用匿名内部类来处理当棋子在面板上移动时的一些状态;
代码如下:
public static int MARGIN=30;//定义边距 public static int ROWS=15;//定义行数 public static int COLS=15;//定义列数 public static int GRID_SPAN=35;//网格间距 Chess[] chessList=new Chess[(ROWS+1)*(COLS+1)];//定义一个棋子数组 String[][] board=new String[MARGIN*2+GRID_SPAN*COLS][MARGIN*2+GRID_SPAN*COLS];//声明一个字符串数组,用来判断输赢 int chessCount;//棋子数目 int xindex,yindex;//棋子的坐标索引 boolean start=true;//开始默认黑子先下 boolean GameOver=false;//定义是否游戏结束 public ChessBord() {//棋盘类构造函数 setBackground(Color.LIGHT_GRAY);//设置背景颜色 addMouseListener(this);//将棋盘类添加到鼠标事件监听器 addMouseMotionListener(new MouseMotionListener() {//匿名内部类 @Override public void mouseMoved(MouseEvent e) {//根据鼠标的移动所在的坐标来设置鼠标光标形状 int x1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//对鼠标光标的x坐标进行转换 int y1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//对鼠标光标的y坐标进行转换 if(x1<0x1>ROWSy1<0y1>COLSGameOverfindchess(x1, y1)) { setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//设置鼠标光标为默认形状 }else { setCursor(new Cursor(Cursor.HAND_CURSOR));//设置鼠标光标为手型 } } @Override public void mouseDragged(MouseEvent e) { } }); for(int i=0;i<MARGIN*2+GRID_SPAN*COLS;i++) {//对board[][]赋初值 for (int j = 0; j < MARGIN*2+GRID_SPAN*COLS; j++) { board[i][j]="0"; } } }
我们再对下棋时鼠标按下时的动作事件类进行解析,当在网格上下棋时,判断是否在棋盘内和判断网格上有没有棋子,当棋子在棋盘内并且网格上没有棋子,我们就开始画棋子,将棋子对象和颜色保存,接下来判断是否胜利,判断棋盘是否下满,如果没有继续下棋;
代码如下;
public void mousePressed(MouseEvent e) {//鼠标点击事件 if(GameOver)//游戏结束,不能按 return ; String colorName=start?"黑棋":"白棋";//判断是什么颜色的棋子 xindex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//得到棋子x坐标 yindex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//得到棋子y坐标 board[xindex][yindex]=colorName;//以棋子x坐标y坐标做索引将棋子的颜色添加到board中 if(xindex<0xindex>ROWSyindex<0yindex>COLS) {//棋子在棋盘外不能下, return ; }else if(findchess( xindex, yindex)) {//所下位置已有棋子,不能下 return ; } Chess po=new Chess(xindex,yindex,start?Color.black:Color.WHITE);//对棋子对象进行初始化 chessList[chessCount++]=po;//将棋子对象添加到棋子数组中 repaint();//重画图型 if(win( xindex,yindex,start)) {//判断是否胜利 String msg=String.format("恭喜 %s赢了",colorName); JOptionPane.showMessageDialog(this, msg); //gameOver=true; GameOver=true; }else if(chessCount==(COLS+1)*(ROWS+1)) {//判断是否全部下满 String msg=String.format("恭喜 %s赢了",colorName); JOptionPane.showMessageDialog(this, msg); GameOver=true; } start=!start;//改变棋子先下棋状态 }
函数paintComponent来对棋盘和棋子进行画图,对棋子进行绘图时,将最后一个棋子设为红色;
代码如下;
protected void paintComponent(Graphics g) {//画棋盘和棋子 super.paintComponent(g); for(int i=0;i<=ROWS;i++) {//画横线 g.drawLine(MARGIN, MARGIN+i*GRID_SPAN, MARGIN+COLS*GRID_SPAN, MARGIN+i*GRID_SPAN); } for(int j=0;j<=COLS;j++) {//画竖线 g.drawLine(MARGIN+j*GRID_SPAN, MARGIN, MARGIN+j*GRID_SPAN, MARGIN+ROWS*GRID_SPAN); } for(int i=0;i<chessCount;i++) {//画棋子 int xpos=chessList[i].getX()*GRID_SPAN+MARGIN;//得到棋子x坐标 int ypos=chessList[i].getY()*GRID_SPAN+MARGIN;//得到棋子y坐标 g.setColor(chessList[i].getColor());//设置棋子颜色 g.fillOval(xpos-Chess.DIAMETER/2, ypos-Chess.DIAMETER/2, Chess.DIAMETER, Chess.DIAMETER);//画棋子 if(i==chessCount-1){ g.setColor(Color.red);//标记最后一个棋子为红色 g.drawRect(xpos-Chess.DIAMETER/2, ypos-Chess.DIAMETER/2, Chess.DIAMETER, Chess.DIAMETER); } } }
最后就是判断棋子输赢的函数,用字符串数组保存的棋子的颜色来进行判断所在行和列有没有五个棋子相连,判断撇和捺行的棋子有没有五个相连的,如果有则某位棋子胜利;
代码如下;
private boolean win(int x,int y,boolean start) {//对棋子输赢的判断 String str=start?"黑棋":"白棋"; //棋子所在行和列是否有五子相连的情况 for(int i=0;i<16;i++){ if((board[x][i].equals(str)&&board[x][i+1].equals(str)&&board[x][i+2].equals(str)&&board[x][i+3].equals(str)&&board[x][i+4].equals(str))(board[i][y].equals(str)&&board[i+1][y].equals(str)&&board[i+2][y].equals(str)&&board[i+3][y].equals(str)&&board[i+4][y].equals(str))) return true; } //棋子所在撇行是否有五子相连的情况 if(x+y>=4&&x+y<=30){ int i=(x+y<=19)?x+y:x+y-20; if(x+y<=19){ for(int k=0;k<=i-4;k++){ if(board[k][i-k].equals(str)&&board[k+1][i-k-1].equals(str)&&board[k+2][i-k-2].equals(str)&&board[k+3][i-k-3].equals(str)&&board[k+4][i-k-4].equals(str)) return true; } }else{ for(int k=i;k<=15;k++){ if(board[k][20-k].equals(str)&&board[k+1][20-k-1].equals(str)&&board[k+2][20-k-2].equals(str)&&board[k+3][20-k-3].equals(str)&&board[k+4][20-k-4].equals(str)) return true; } } } //棋子所在捺行是否有五子相连的情况 if(y-x<=15&&x-y<=15){ int i=(x<y)?y-x:x-y; if(x<y){ for(int k=0;k<=19-4-i;k++){ if(board[k][i+k].equals(str)&&board[k+1][i+k+1].equals(str)&&board[k+2][i+k+2].equals(str)&&board[k+3][i+k+3].equals(str)&&board[k+4][i+k+4].equals(str)) return true; } }else{ for(int k=i;k<=15;k++){ if(board[k][i+k].equals(str)&&board[k+1][i+k+1].equals(str)&&board[k+2][i+k+2].equals(str)&&board[k+3][i+k+3].equals(str)&&board[k+4][i+k+4].equals(str)) return true; } } } return false; }
最后我就将完整的棋盘类代码贴出来,写五子棋代码时参考了很多其他人的想法,有相同的请不要见怪;
棋盘类完整代码如下:
import java.awt.*;import java.awt.event.*; import javax.swing.*;/* * 五子棋的棋盘类 */ public class ChessBord extends JPanel implements MouseListener{//继承面板类和鼠标事件接口 public static int MARGIN=30;//定义边距 public static int ROWS=15;//定义行数 public static int COLS=15;//定义列数 public static int GRID_SPAN=35;//网格间距 Chess[] chessList=new Chess[(ROWS+1)*(COLS+1)];//定义一个棋子数组 String[][] board=new String[MARGIN*2+GRID_SPAN*COLS][MARGIN*2+GRID_SPAN*COLS];//声明一个字符串数组,用来判断输赢 int chessCount;//棋子数目 int xindex,yindex;//棋子的坐标索引 boolean start=true;//开始默认黑子先下 boolean GameOver=false;//定义是否游戏结束 public ChessBord() {//棋盘类构造函数 setBackground(Color.LIGHT_GRAY);//设置背景颜色 addMouseListener(this);//将棋盘类添加到鼠标事件监听器 addMouseMotionListener(new MouseMotionListener() {//匿名内部类 @Override public void mouseMoved(MouseEvent e) {//根据鼠标的移动所在的坐标来设置鼠标光标形状 int x1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//对鼠标光标的x坐标进行转换 int y1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//对鼠标光标的y坐标进行转换 if(x1<0x1>ROWSy1<0y1>COLSGameOverfindchess(x1, y1)) { setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//设置鼠标光标为默认形状 }else { setCursor(new Cursor(Cursor.HAND_CURSOR));//设置鼠标光标为手型 } } @Override public void mouseDragged(MouseEvent e) { } }); for(int i=0;i<MARGIN*2+GRID_SPAN*COLS;i++) {//对board[][]赋初值 for (int j = 0; j < MARGIN*2+GRID_SPAN*COLS; j++) { board[i][j]="0"; } } } @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) {//鼠标点击事件 if(GameOver)//游戏结束,不能按 return ; String colorName=start?"黑棋":"白棋";//判断是什么颜色的棋子 xindex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//得到棋子x坐标 yindex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//得到棋子y坐标 board[xindex][yindex]=colorName;//以棋子x坐标y坐标做索引将棋子的颜色添加到board中 if(xindex<0xindex>ROWSyindex<0yindex>COLS) {//棋子在棋盘外不能下, return ; }else if(findchess( xindex, yindex)) {//所下位置已有棋子,不能下 return ; } Chess po=new Chess(xindex,yindex,start?Color.black:Color.WHITE);//对棋子对象进行初始化 chessList[chessCount++]=po;//将棋子对象添加到棋子数组中 repaint();//重画图型 if(win( xindex,yindex,start)) {//判断是否胜利 String msg=String.format("恭喜 %s赢了",colorName); JOptionPane.showMessageDialog(this, msg); //gameOver=true; &
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。