欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java棋類游戲實踐之單機版五子棋

 更新時間:2021年04月26日 14:49:05   作者:濤涌四海  
這篇文章主要為大家詳細介紹了Java棋類游戲中的五子棋實現(xiàn)方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例講述了java實現(xiàn)的五子棋游戲代碼,分享給大家供大家參考,具體代碼如下

一、實踐目標

1.掌握JavaGUI界面設計
2.掌握鼠標事件的監(jiān)聽(MouseListener,MouseMotionListener)

二、實踐內容

設計一個簡單的五子棋程序,能夠實現(xiàn)五子棋下棋過程。如下圖所示

1.五子棋棋盤類

package cn.edu.ouc.fiveChess; 
 
import java.awt.Color; 
import java.awt.Cursor; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.RadialGradientPaint; 
import java.awt.RenderingHints; 
import java.awt.Toolkit; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.awt.geom.Ellipse2D; 
 
import javax.swing.*; 
/** 
 * 五子棋--棋盤類 
 */ 
 
public class ChessBoard extends JPanel implements MouseListener { 
 public static final int MARGIN=30;//邊距 
 public static final int GRID_SPAN=35;//網格間距 
 public static final int ROWS=15;//棋盤行數(shù) 
 public static final int COLS=15;//棋盤列數(shù) 
 
 Point[] chessList=new Point[(ROWS+1)*(COLS+1)];//初始每個數(shù)組元素為null 
 boolean isBlack=true;//默認開始是黑棋先 
 boolean gameOver=false;//游戲是否結束 
 int chessCount;//當前棋盤棋子的個數(shù) 
 int xIndex,yIndex;//當前剛下棋子的索引 
 
 Image img; 
 Image shadows; 
 Color colortemp; 
 public ChessBoard(){ 
 
 // setBackground(Color.blue);//設置背景色為橘黃色 
 img=Toolkit.getDefaultToolkit().getImage("board.jpg"); 
 shadows=Toolkit.getDefaultToolkit().getImage("shadows.jpg"); 
 addMouseListener(this); 
 addMouseMotionListener(new MouseMotionListener(){ 
 public void mouseDragged(MouseEvent e){ 
  
 } 
 
 public void mouseMoved(MouseEvent e){ 
 int x1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN; 
 //將鼠標點擊的坐標位置轉成網格索引 
 int y1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN; 
 //游戲已經結束不能下 
 //落在棋盤外不能下 
 //x,y位置已經有棋子存在,不能下 
 if(x1<0||x1>ROWS||y1<0||y1>COLS||gameOver||findChess(x1,y1)) 
  setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
 //設置成默認狀態(tài) 
 else setCursor(new Cursor(Cursor.HAND_CURSOR)); 
 
 } 
 }); 
 } 
 
 
 
//繪制 
 public void paintComponent(Graphics g){ 
 
 super.paintComponent(g);//畫棋盤 
 
 int imgWidth= img.getWidth(this); 
 int imgHeight=img.getHeight(this);//獲得圖片的寬度與高度 
 int FWidth=getWidth(); 
 int FHeight=getHeight();//獲得窗口的寬度與高度 
 int x=(FWidth-imgWidth)/2; 
 int y=(FHeight-imgHeight)/2; 
 g.drawImage(img, x, y, null); 
 
 
 for(int i=0;i<=ROWS;i++){//畫橫線 
 g.drawLine(MARGIN, MARGIN+i*GRID_SPAN, MARGIN+COLS*GRID_SPAN, MARGIN+i*GRID_SPAN); 
 } 
 for(int i=0;i<=COLS;i++){//畫豎線 
 g.drawLine(MARGIN+i*GRID_SPAN, MARGIN, MARGIN+i*GRID_SPAN, MARGIN+ROWS*GRID_SPAN); 
 
 } 
 
 //畫棋子 
 for(int i=0;i<chessCount;i++){ 
 //網格交叉點x,y坐標 
 int xPos=chessList[i].getX()*GRID_SPAN+MARGIN; 
 int yPos=chessList[i].getY()*GRID_SPAN+MARGIN; 
 g.setColor(chessList[i].getColor());//設置顏色 
 // g.fillOval(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, 
  //Point.DIAMETER, Point.DIAMETER); 
 //g.drawImage(shadows, xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, Point.DIAMETER, Point.DIAMETER, null); 
 colortemp=chessList[i].getColor(); 
 if(colortemp==Color.black){ 
 RadialGradientPaint paint = new RadialGradientPaint(xPos-Point.DIAMETER/2+25, yPos-Point.DIAMETER/2+10, 20, new float[]{0f, 1f} 
 , new Color[]{Color.WHITE, Color.BLACK}); 
 ((Graphics2D) g).setPaint(paint); 
 ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
 ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT); 
 
 } 
 else if(colortemp==Color.white){ 
 RadialGradientPaint paint = new RadialGradientPaint(xPos-Point.DIAMETER/2+25, yPos-Point.DIAMETER/2+10, 70, new float[]{0f, 1f} 
 , new Color[]{Color.WHITE, Color.BLACK}); 
 ((Graphics2D) g).setPaint(paint); 
 ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
 ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT); 
 
 } 
 
 Ellipse2D e = new Ellipse2D.Float(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, 34, 35); 
 ((Graphics2D) g).fill(e); 
 //標記最后一個棋子的紅矩形框 
 
 if(i==chessCount-1){//如果是最后一個棋子 
 g.setColor(Color.red); 
 g.drawRect(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, 
  34, 35); 
 } 
 } 
 } 
 
 public void mousePressed(MouseEvent e){//鼠標在組件上按下時調用 
 
 //游戲結束時,不再能下 
 if(gameOver) return; 
 
 String colorName=isBlack?"黑棋":"白棋"; 
 
 //將鼠標點擊的坐標位置轉換成網格索引 
 xIndex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN; 
 yIndex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN; 
 
 //落在棋盤外不能下 
 if(xIndex<0||xIndex>ROWS||yIndex<0||yIndex>COLS) 
 return; 
 
 //如果x,y位置已經有棋子存在,不能下 
 if(findChess(xIndex,yIndex))return; 
 
 //可以進行時的處理 
 Point ch=new Point(xIndex,yIndex,isBlack?Color.black:Color.white); 
 chessList[chessCount++]=ch; 
 repaint();//通知系統(tǒng)重新繪制 
 
 
 //如果勝出則給出提示信息,不能繼續(xù)下棋 
 
 if(isWin()){ 
 String msg=String.format("恭喜,%s贏了!", colorName); 
 JOptionPane.showMessageDialog(this, msg); 
 gameOver=true; 
 } 
 isBlack=!isBlack; 
 } 
 //覆蓋mouseListener的方法 
 public void mouseClicked(MouseEvent e){ 
 //鼠標按鍵在組件上單擊時調用 
 } 
 
 public void mouseEntered(MouseEvent e){ 
 //鼠標進入到組件上時調用 
 } 
 public void mouseExited(MouseEvent e){ 
 //鼠標離開組件時調用 
 } 
 public void mouseReleased(MouseEvent e){ 
 //鼠標按鈕在組件上釋放時調用 
 } 
 //在棋子數(shù)組中查找是否有索引為x,y的棋子存在 
 private boolean findChess(int x,int y){ 
 for(Point c:chessList){ 
 if(c!=null&&c.getX()==x&&c.getY()==y) 
 return true; 
 } 
 return false; 
 } 
 
 
 private boolean isWin(){ 
 int continueCount=1;//連續(xù)棋子的個數(shù) 
 
 //橫向向西尋找 
 for(int x=xIndex-1;x>=0;x--){ 
 Color c=isBlack?Color.black:Color.white; 
 if(getChess(x,yIndex,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 //橫向向東尋找 
 for(int x=xIndex+1;x<=COLS;x++){ 
 Color c=isBlack?Color.black:Color.white; 
 if(getChess(x,yIndex,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 if(continueCount>=5){ 
 return true; 
 }else 
 continueCount=1; 
 
 //繼續(xù)另一種搜索縱向 
 //向上搜索 
 for(int y=yIndex-1;y>=0;y--){ 
 Color c=isBlack?Color.black:Color.white; 
 if(getChess(xIndex,y,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 //縱向向下尋找 
 for(int y=yIndex+1;y<=ROWS;y++){ 
 Color c=isBlack?Color.black:Color.white; 
 if(getChess(xIndex,y,c)!=null) 
 continueCount++; 
 else 
 break; 
 
 } 
 if(continueCount>=5) 
 return true; 
 else 
 continueCount=1; 
 
 
 //繼續(xù)另一種情況的搜索:斜向 
 //東北尋找 
 for(int x=xIndex+1,y=yIndex-1;y>=0&&x<=COLS;x++,y--){ 
 Color c=isBlack?Color.black:Color.white; 
 if(getChess(x,y,c)!=null){ 
 continueCount++; 
 } 
 else break; 
 } 
 //西南尋找 
 for(int x=xIndex-1,y=yIndex+1;x>=0&&y<=ROWS;x--,y++){ 
 Color c=isBlack?Color.black:Color.white; 
 if(getChess(x,y,c)!=null){ 
 continueCount++; 
 } 
 else break; 
 } 
 if(continueCount>=5) 
 return true; 
 else continueCount=1; 
 
 
 //繼續(xù)另一種情況的搜索:斜向 
 //西北尋找 
 for(int x=xIndex-1,y=yIndex-1;x>=0&&y>=0;x--,y--){ 
 Color c=isBlack?Color.black:Color.white; 
 if(getChess(x,y,c)!=null) 
 continueCount++; 
 else break; 
 } 
 //東南尋找 
 for(int x=xIndex+1,y=yIndex+1;x<=COLS&&y<=ROWS;x++,y++){ 
 Color c=isBlack?Color.black:Color.white; 
 if(getChess(x,y,c)!=null) 
 continueCount++; 
 else break; 
 } 
 if(continueCount>=5) 
 return true; 
 else continueCount=1; 
 
 return false; 
 } 
 
 
 private Point getChess(int xIndex,int yIndex,Color color){ 
 for(Point p:chessList){ 
 if(p!=null&&p.getX()==xIndex&&p.getY()==yIndex 
  &&p.getColor()==color) 
 return p; 
 } 
 return null; 
 } 
 
 
 public void restartGame(){ 
 //清除棋子 
 for(int i=0;i<chessList.length;i++){ 
 chessList[i]=null; 
 } 
 //恢復游戲相關的變量值 
 isBlack=true; 
 gameOver=false; //游戲是否結束 
 chessCount =0; //當前棋盤棋子個數(shù) 
 repaint(); 
 } 
 
 //悔棋 
 public void goback(){ 
 if(chessCount==0) 
 return ; 
 chessList[chessCount-1]=null; 
 chessCount--; 
 if(chessCount>0){ 
 xIndex=chessList[chessCount-1].getX(); 
 yIndex=chessList[chessCount-1].getY(); 
 } 
 isBlack=!isBlack; 
 repaint(); 
 } 
 
 //矩形Dimension 
 
 public Dimension getPreferredSize(){ 
 return new Dimension(MARGIN*2+GRID_SPAN*COLS,MARGIN*2 
  +GRID_SPAN*ROWS); 
 } 
 
 
 
} 

2.棋子類

package cn.edu.ouc.fiveChess; 
 
import java.awt.Color; 
/** 
 * 棋子類 
 */ 
public class Point { 
 private int x;//棋盤中的x索引 
 private int y;//棋盤中的y索引 
 private Color color;//顏色 
 public static final int DIAMETER=30;//直徑 
 
 public Point(int x,int y,Color color){ 
 this.x=x; 
 this.y=y; 
 this.color=color; 
 } 
 
 public int getX(){//拿到棋盤中x的索引 
 return x; 
 } 
 public int getY(){ 
 return y; 
 } 
 public Color getColor(){//獲得棋子的顏色 
 return color; 
 } 
} 

3.五子棋主框架類

package cn.edu.ouc.fiveChess; 
import java.awt.event.*; 
import java.awt.*; 
 
import javax.swing.*; 
/* 
 五子棋主框架類,程序啟動類 
 */ 
public class StartChessJFrame extends JFrame { 
 private ChessBoard chessBoard; 
 private JPanel toolbar; 
 private JButton startButton,backButton,exitButton; 
 
 private JMenuBar menuBar; 
 private JMenu sysMenu; 
 private JMenuItem startMenuItem,exitMenuItem,backMenuItem; 
 //重新開始,退出,和悔棋菜單項 
 public StartChessJFrame(){ 
 setTitle("單機版五子棋");//設置標題 
 chessBoard=new ChessBoard(); 
 
 
 Container contentPane=getContentPane(); 
 contentPane.add(chessBoard); 
 chessBoard.setOpaque(true); 
 
 
 //創(chuàng)建和添加菜單 
 menuBar =new JMenuBar();//初始化菜單欄 
 sysMenu=new JMenu("系統(tǒng)");//初始化菜單 
 //初始化菜單項 
 startMenuItem=new JMenuItem("重新開始"); 
 exitMenuItem =new JMenuItem("退出"); 
 backMenuItem =new JMenuItem("悔棋"); 
 //將三個菜單項添加到菜單上 
 sysMenu.add(startMenuItem); 
 sysMenu.add(exitMenuItem); 
 sysMenu.add(backMenuItem); 
 //初始化按鈕事件監(jiān)聽器內部類 
 MyItemListener lis=new MyItemListener(); 
 //將三個菜單注冊到事件監(jiān)聽器上 
 this.startMenuItem.addActionListener(lis); 
 backMenuItem.addActionListener(lis); 
 exitMenuItem.addActionListener(lis); 
 menuBar.add(sysMenu);//將系統(tǒng)菜單添加到菜單欄上 
 setJMenuBar(menuBar);//將menuBar設置為菜單欄 
 
 toolbar=new JPanel();//工具面板實例化 
 //三個按鈕初始化 
 startButton=new JButton("重新開始"); 
 exitButton=new JButton("退出"); 
 backButton=new JButton("悔棋"); 
 //將工具面板按鈕用FlowLayout布局 
 toolbar.setLayout(new FlowLayout(FlowLayout.LEFT)); 
 //將三個按鈕添加到工具面板 
 toolbar.add(startButton); 
 toolbar.add(exitButton); 
 toolbar.add(backButton); 
 //將三個按鈕注冊監(jiān)聽事件 
 startButton.addActionListener(lis); 
 exitButton.addActionListener(lis); 
 backButton.addActionListener(lis); 
 //將工具面板布局到界面”南方“也就是下方 
 add(toolbar,BorderLayout.SOUTH); 
 add(chessBoard);//將面板對象添加到窗體上 
 //設置界面關閉事件 
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 //setSize(800,800); 
 pack();//自適應大小 
 
 } 
 
 private class MyItemListener implements ActionListener{ 
 public void actionPerformed(ActionEvent e){ 
 Object obj=e.getSource();//獲得事件源 
 if(obj==StartChessJFrame.this.startMenuItem||obj==startButton){ 
 //重新開始 
 //JFiveFrame.this內部類引用外部類 
 System.out.println("重新開始"); 
 chessBoard.restartGame(); 
 } 
 else if (obj==exitMenuItem||obj==exitButton) 
 System.exit(0); 
 else if (obj==backMenuItem||obj==backButton){ 
 System.out.println("悔棋..."); 
 chessBoard.goback(); 
 } 
 } 
 } 
 
 
 
 public static void main(String[] args){ 
 StartChessJFrame f=new StartChessJFrame();//創(chuàng)建主框架 
 f.setVisible(true);//顯示主框架 
 
 } 
} 

三、總結

1.菜單的設計與實現(xiàn)?
2.鼠標點擊棋盤后,如何繪制棋子?如何為剛下的棋子繪制一個紅色框?
3.棋譜是如何一個數(shù)據(jù)結構?

以上就是本文的全部內容,希望對大家學習java程序設計有所幫助。

相關文章

  • Java方法引用原理實例解析

    Java方法引用原理實例解析

    這篇文章主要介紹了Java方法引用的原理實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-08-08
  • java 枚舉類中的valueOf用法說明

    java 枚舉類中的valueOf用法說明

    這篇文章主要介紹了java 枚舉類中的valueOf用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java多線程并發(fā)編程和鎖原理解析

    Java多線程并發(fā)編程和鎖原理解析

    這篇文章主要介紹了Java多線程并發(fā)編程和鎖原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Spring?Boot使用線程池處理上萬條數(shù)據(jù)插入功能

    Spring?Boot使用線程池處理上萬條數(shù)據(jù)插入功能

    這篇文章主要介紹了Spring?Boot使用線程池處理上萬條數(shù)據(jù)插入功能,使用步驟是先創(chuàng)建一個線程池的配置,讓Spring Boot加載,用來定義如何創(chuàng)建一個ThreadPoolTaskExecutor,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2022-08-08
  • Jersey實現(xiàn)Restful服務(實例講解)

    Jersey實現(xiàn)Restful服務(實例講解)

    下面小編就為大家?guī)硪黄狫ersey實現(xiàn)Restful服務(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Spring示例講解條件注入方法

    Spring示例講解條件注入方法

    Spring支持按照條件來注入某些特定的bean,這也是Spring Boot實現(xiàn)自動化配置的底層方法,文中的示例代碼講解詳細,需要的可以參考一下
    2022-06-06
  • Java泛型的概念、定義與運行方法分析

    Java泛型的概念、定義與運行方法分析

    這篇文章主要介紹了Java泛型的概念、定義與運行方法,結合實例形式分析了java泛型的基本概念、定義與IDEA、命令行兩種運行方法,需要的朋友可以參考下
    2019-08-08
  • java 注解annotation的使用以及反射如何獲取注解

    java 注解annotation的使用以及反射如何獲取注解

    這篇文章主要介紹了java 注解annotation的使用以及反射如何獲取注解的相關資料,需要的朋友可以參考下
    2017-01-01
  • MPAndroidChart開源圖表庫的使用介紹之餅狀圖、折線圖和柱狀圖

    MPAndroidChart開源圖表庫的使用介紹之餅狀圖、折線圖和柱狀圖

    這篇文章主要介紹了MPAndroidChart開源圖表庫的使用介紹之餅狀圖、折線圖和柱狀圖的相關資料,需要的朋友可以參考下
    2016-02-02
  • spring WebSocket示例詳解

    spring WebSocket示例詳解

    websocket是Html5新增加特性之一,目的是瀏覽器與服務端建立全雙工的通信方式,本篇文章主要介紹了spring WebSocket示例詳解 ,有興趣的可以了解一下。
    2017-01-01

最新評論