最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

一、實踐目標

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

二、實踐內(nèi)容

設計一個簡單的五子棋程序,能夠實現(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;//網(wǎng)格間距 
 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; 
 //將鼠標點擊的坐標位置轉成網(wǎng)格索引 
 int y1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN; 
 //游戲已經(jīng)結束不能下 
 //落在棋盤外不能下 
 //x,y位置已經(jīng)有棋子存在,不能下 
 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++){ 
 //網(wǎng)格交叉點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){//鼠標在組件上按下時調(diào)用 
 
 //游戲結束時,不再能下 
 if(gameOver) return; 
 
 String colorName=isBlack?"黑棋":"白棋"; 
 
 //將鼠標點擊的坐標位置轉換成網(wǎng)格索引 
 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位置已經(jīng)有棋子存在,不能下 
 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){ 
 //鼠標按鍵在組件上單擊時調(diào)用 
 } 
 
 public void mouseEntered(MouseEvent e){ 
 //鼠標進入到組件上時調(diào)用 
 } 
 public void mouseExited(MouseEvent e){ 
 //鼠標離開組件時調(diào)用 
 } 
 public void mouseReleased(MouseEvent e){ 
 //鼠標按鈕在組件上釋放時調(diào)用 
 } 
 //在棋子數(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)聽器內(nèi)部類 
 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內(nèi)部類引用外部類 
 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ù)結構?

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

相關文章

  • maven?setting.xml文件配置禪定之旅

    maven?setting.xml文件配置禪定之旅

    這篇文章主要為大家介紹了maven?setting.xml文件禪定之旅,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Java17和springboot3.0使用shiro報ClassNotFoundException的解決

    Java17和springboot3.0使用shiro報ClassNotFoundException的解決

    本文主要介紹了Java17和springboot3.0使用shiro報ClassNotFoundException的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-04-04
  • 使用Java和SNMP4J實現(xiàn)SNMP操作完整代碼

    使用Java和SNMP4J實現(xiàn)SNMP操作完整代碼

    這篇文章主要介紹了如何使用Java和SNMP4J庫進行SNMP操作,包括初始化SNMP、創(chuàng)建目標、創(chuàng)建PDU、發(fā)送SNMP請求和處理響應等內(nèi)容,通過編寫SnmpUtil類,展示了完整的SNMP操作流程,需要的朋友可以參考下
    2024-12-12
  • java?數(shù)組實現(xiàn)學生成績統(tǒng)計教程

    java?數(shù)組實現(xiàn)學生成績統(tǒng)計教程

    這篇文章主要介紹了java?數(shù)組實現(xiàn)學生成績統(tǒng)計教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Mybatis與Ibatis的區(qū)別

    Mybatis與Ibatis的區(qū)別

    這篇文章主要介紹了Mybatis與Ibatis的區(qū)別,需要的朋友可以參考下
    2016-05-05
  • Java調(diào)用高德地圖API根據(jù)詳細地址獲取經(jīng)緯度詳細教程

    Java調(diào)用高德地圖API根據(jù)詳細地址獲取經(jīng)緯度詳細教程

    寫了一個經(jīng)緯度相關的工具,分享給有需求的小伙伴們,下面這篇文章主要給大家介紹了關于Java調(diào)用高德地圖API根據(jù)詳細地址獲取經(jīng)緯度,文中通過圖文以及代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • 探索Java分布式限流技術

    探索Java分布式限流技術

    探索Java分布式限流技術,讓你的系統(tǒng)遠離流量過載的煩惱,本指南將帶你了解如何使用Java實現(xiàn)高效的限流策略,幫助你輕松應對高并發(fā)場景,讓我們一起開啟這段精彩的技術之旅,打造更加穩(wěn)定可靠的系統(tǒng),需要的朋友可以參考下
    2024-03-03
  • 詳解Java中的悲觀鎖與樂觀鎖

    詳解Java中的悲觀鎖與樂觀鎖

    樂觀鎖對應于生活中樂觀的人總是想著事情往好的方向發(fā)展,悲觀鎖對應于生活中悲觀的人總是想著事情往壞的方向發(fā)展.這兩種人各有優(yōu)缺點,不能不以場景而定說一種人好于另外一種人,文中詳細介紹了悲觀鎖與樂觀鎖,需要的朋友可以參考下
    2021-05-05
  • 詳解AngularJs與SpringMVC簡單結合使用

    詳解AngularJs與SpringMVC簡單結合使用

    本篇文章主要介紹了AngularJs與SpringMVC簡單結合使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java中關于內(nèi)存泄漏出現(xiàn)的原因匯總及如何避免內(nèi)存泄漏(超詳細版)

    Java中關于內(nèi)存泄漏出現(xiàn)的原因匯總及如何避免內(nèi)存泄漏(超詳細版)

    這篇文章主要介紹了Java中關于內(nèi)存泄漏出現(xiàn)的原因匯總及如何避免內(nèi)存泄漏(超詳細版)的相關資料,需要的朋友可以參考下
    2016-09-09

最新評論

泰兴市| 泾源县| 玉山县| 丰宁| 石渠县| 桃园市| 铁力市| 伊金霍洛旗| 邢台县| 海兴县| 嘉义市| 布拖县| 湖南省| 孟津县| 凌海市| SHOW| 大英县| 长武县| 嵩明县| 洪洞县| 周至县| 道孚县| 金乡县| 南康市| 清涧县| 五华县| 光泽县| 密云县| 兰州市| 开鲁县| 珠海市| 石家庄市| 房产| 许昌市| 囊谦县| 桦南县| 武宣县| 和政县| 信丰县| 曲阜市| 简阳市|