java實作五子棋小遊戲
package Gomoku; import java.awt.Toolkit; import javax.swing.JFrame; public class GomokuFrame extends JFrame { //定義一個操作面板OperatorPane op=null; public GomokuFrame() { //設定名稱this.setTitle("五子棋" ); //設定視窗大小this.setSize(510,510); //設定視窗位置//取得電腦螢幕大小int computer_width=Toolkit.getDefaultToolkit().getScreenSize().width; int computer_height=Toolkit.getDefaultToolkit().getScreenSize().height; System.out.println("電腦螢幕的寬度:/n"+computer_width+"/n電腦螢幕的高度:/n"+computer_height); //居中this.setLocation((computer_width-510)/2, (computer_height- 510)/2); //實例化幕布op=new OperatorPane(); //導入幕布this.add(op); //新增滑鼠監聽this.addMouseListener(op); //設定視窗的顯示this.setVisible(true); //設定視窗的正常關閉this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } //執行測試public static void main (String[] args) { new GomokuFrame(); } }
package Gomoku; import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.event.MouseEvent;import java.awt.event.MouseListener; java.awt.event.MouseEvent;import java.awt.event.MouseListener; import java.awt.image.BufferedImage;import java.awt.image.BufferedImageFilter; import javax.swing.ImageIcon;import javax.swing.JOptionPane;import javax.swing.JPanel; public class OperatorPane extends JPanel implements MoListList //定義棋盤的格子的行數int boardrows=18; //定義棋盤的格子的列數int boardcols=18; //定義棋盤的格子的大小int boardsize=20; //保存棋子坐標int x=0,y=0; //保存之前下過的全部棋子座標// 其中資料內容0: 表示這個點並沒有棋子, 1: 表示這個點是黑子, 2:表示這個點是白子int allchess[][]=new int [19][19]; //標記下一步下黑棋還是白棋boolean isBlack=true; //判斷遊戲是否能夠繼續boolean canPlay=true; //儲存顯示訊息String message="黑棋先行"; / / 儲存最多擁有多少時間(秒) int maxTime = 0; // 做倒數計時的線程類別Thread t = new Thread(this); // 保存黑方與白方的剩餘時間int blackTime = 0; int whiteTime = 0; // 儲存雙方剩餘時間的顯示訊息String blackMessage = "無限制"; String whiteMessage = "無限制"; @SuppressWarnings("deprecation") public OperatorPane() { t.start(); t.suspend (); imageBackground=new ImageIcon("image/background.jpg").getImage(); } public void paint(Graphics g) { //雙緩衝技術BufferedImage b1=new BufferedImage(495,475,BufferedImage.TYPE_INT_ARGB); Graphics g2=b1.createGraphics(); // 畫出背景圖片g2.drawImage(imageBackground, 05,494,05,494,05,005,05,409,05,909,409,59,409,59,05,05,409,05,005,409,059,409,05,05,050,050, 05,490,055,005,059,050,050, 05,059,405,005 ); //畫出棋盤線Color c=g2.getColor(); g2.setColor(Color.BLACK); for(int i=0;i<=boardrows;i++) { g2.drawLine(10,50+boardsize*i,10+boardsize*boardrows, 50+boardsize*i); } for(int i=0;i<=boardcols;i++) { g2.drawLine(10+boardsize*i,50,10+boardsize*i,50+boardsize*boardcols); } //畫出三三位置g2.fillOval(67, 107, 6, 6); g2.fillOval( 67, 347, 6, 6); g2.fillOval(307, 107, 6, 6); g2.fillOval(307, 347, 6, 6); //畫出附點g2.fillOval(67, 227, 6, 6); g2.fillOval(307, 227, 6, 6); g2.fillOval(187 , 107, 6, 6); g2.fillOval(187, 347, 6, 6); //畫出天元g2.fillOval(187, 227, 6, 6); //畫出文字提示/*Font f=new Font("黑體", Font.BOLD, 24); g. setFont(f);*/ g2.setFont(new Font("黑體", Font.BOLD, 20)); g2.setColor(Color.BLACK); g2.drawString("遊戲資訊:"+message, 130, 40); g2.setFont(new Font("宋體", Font.ITALIC, 15)); g2.drawString("黑方時間:"+blackMessage,25 , 445); g2.drawString("白方時間:"+whiteMessage,245, 445); //繪製全部棋子for(int i=0;i<=boardrows;i++) { for(int j=0;j<=boardcols;j++) { //儲存黑棋if(allchess[i][j]= =1) { int tempX=i*20-10; int tempY=j*20+30; //畫黑棋g2.setColor(Color.BLACK); g2.fillOval(tempX+12, tempY+13, 15, 15); } //儲存白棋if(allchess[i][j]==2) { int tempX=i*20-10; int tempY=j *20+30; //畫白棋g2.setColor(Color.BLACK); g2.drawOval(tempX+12, tempY+13, 15, 15); g2.setColor(Color.WHITE); g2.fillOval(tempX+12, tempY+13, 15, 15); } } } g2.setColor(c); g.drawImage(b1,0,0 ,this); } private boolean checkWin() { boolean flag=false; int color = allchess[x][y]; /*// 保存共有相同顏色多少棋子相連int count1=1; int count2=1; int count3=1; int count4=1; // 判斷橫向是否有5個棋子相連,特徵縱座標是相同, 即allChess[x][y]中y值是相同// 透過循環來做棋子相連的判斷int i = 1; while (color == allchess[x+i][y]) { count1++; i++; } //將i值重設i = 1; while (color == allchess[xi][y]) { count1++; i++; } if(count1 >= 5) { flag = true; } //判斷縱向,即allChess[x][y]中x值為相同int j = 1; while (color == allchess[x][y+j]) { count2++; j++; } //將j值重設j = 1; while (color == allchess[x][yj]) { count2++; j++; } if(count2>= 5) { flag = true; } //判斷斜向"/" int m1=1; int n1=1; while (color == allchess[x+m1][y+n1]) { count3++; m1++; n1++; } m1=1; n1=1; while (color == allchess[x-m1][y-n1]) { count3++; m1++; n1++; } if(count3>= 5) { flag = true; } //判斷斜向"/" int m2=1; int n2=1; while (color == allchess[x+m2][y-n2]) { count4++; m2++; n2++; } m2=1; n2=1; while (color == allchess[x-m2][y +n2]) { count4++; m2++; n2++; } if(count4>= 5) { flag = true; } */ int count; //橫向判斷count=this.checkCount(1, 0, color); if(count>=5) { flag = true; } else { //縱向判斷count=this.checkCount(0, 1, color); if (count>=5) { flag = true; } else { //斜向「/」 count=this.checkCount(1, 1, color); if(count>=5) { flag = true; } else { //斜向「/」 count=this.checkCount(1, -1, color); if(count>=5) { flag = true; } } } } return flag; } private int checkCount( int xChange,int yChange,int color) { int count=1; int tempX=xChange; int tempY=yChange; while (color==allchess[x+xChange][y+yChange]) { count++; if(xChange!=0) { xChange++; } if(yChange!=0) { if(yChange<0) { yChange--; } else { yChange++; } } } //重設xChange=tempX; yChange=tempY; while (color==allchess[x-xChange][y-yChange]) { count++; if(xChange!=0) { xChange++; } if(yChange!=0) { if(yChange<0) { yChange--; } else { yChange++; } } } return count; } public void mouseClicked(MouseEvent e) { System.out.println("x:"+e.getX()+"y:"+e.getY()); x=e.getX(); y=e.getY(); if(x>= 10&&x<=(10+boardsize*boardrows+20)&&y>=50&&y<=(50+boardsize*boardcols+40)) { //System.out.println("點在棋盤內。 "); x=(x-10)/20; y=(y-50-20)/20; if(canPlay==true) { //判斷目前要下什麼顏色if(allchess[x][y] ==0) { if(isBlack==true) { allchess[x][y]=1; isBlack=false; message="輪到白方"; } else { allchess[x][y]=2; isBlack=true; message="輪到黑方"; } // 判斷這個棋子是否和其他的棋子連成5連,即判斷遊戲是否結束boolean winFlag=this.checkWin (); if(winFlag==true) { JOptionPane.showMessageDialog(this,"遊戲結束!"+ (allchess[x][y]==1?"黑方":"白方")+"獲勝。"); canPlay=false; } } else { JOptionPane.showMessageDialog(this,"當前位置已經有棋子,請重新落子! //點擊,遊戲開始按鈕//重新開始新的遊戲if(e.getX()>=400&&e.getX()<=470&&e.getY()>=80&&e.getY()<=110) { int result= JOptionPane.showConfirmDialog(this, "設定完成,是否重新開始遊戲?"); if(result==0) { //重新開始的操作,allchess[][]陣列中的資訊全部為0 //清空棋盤for (int i = 0; i < 19; i++) { for (int j = 0; j < 19; j++) { allchess[i][j] = 0; } } //另一種方式allChess = new int[19][19]; blackTime = maxTime; whiteTime = maxTime; if (maxTime > 0) { blackMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600 * 60) + ":" + (maxTime - maxTime / 60 * 60); whiteMessage = maxTime / 36000 + 36000 " + (maxTime / 60 - maxTime / 3600 * 60) + ":" + (maxTime - maxTime / 60 * 60); t.resume(); } else { blackMessage = "無限"; whiteMessage = "無限"; } message = "黑方先行"; isBlack = true; this.canPlay = true; this.repaint(); } } //點選遊戲設定按鈕if(e.getX()>=400&&e.getX()<=470&&e.getY()>=130&&e.getY()<=160) { String input = JOptionPane .showInputDialog("請輸入遊戲的最大時間(單位:分鐘),如果輸入0,表示沒有時間限制:"); try { maxTime = Integer.parseInt(input) * 60; if (maxTime < 0) { JOptionPane.showMessageDialog(this, "請輸入正確資訊,不允許輸入負數!"); } if (maxTime == 0) { int result = JOptionPane. showConfirmDialog(this, "設定完成,是否重新開始遊戲?"); if (result == 0) { for (int i = 0; i < 19; i++) { for (int j = 0; j < 19; j++) { allchess[i][j] = 0; } } // 另一種方式allChess = new int[19][19 ]; message = "黑方先行"; isBlack = true; blackTime = maxTime; whiteTime = maxTime; blackMessage = "無限"; whiteMessage = "無限"; this.canPlay = true; this.repaint(); } } if (maxTime > 0) { int result = JOptionPane.showConfirmDialog(this, "設定完成,是否重新開始遊戲?"); if (result == 0) { for (int i = 0; i < 19; i++) { for (int j = 0; j < 19; j++) { allchess[i][j] = 0; } } // 另一種方式allChess = new int[19][19]; message = "黑方先行"; isBlack = true; blackTime = maxTime; whiteTime = maxTime; blackMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600 * 60) + ":" + (maxTime - maxTime / 60 * 60); whiteMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600 * 60) + ":" + (maxTime - maxTime / 60 * 60); t.resume(); this.canPlay = true; this.repaint(); } } } catch (NumberFormatException e1) { // TODO Auto-generated catch block JOptionPane.showMessageDialog(this, "請正確輸入訊息!"); } } //點擊遊戲說明按鈕if(e.getX()>=400&&e.getX()<=470&&e.getY()>=180&&e.getY()<=210) { JOptionPane.showMessageDialog(this,"這個五子棋遊戲程序,黑白雙方輪流下棋,當某一方連到五子時,遊戲結束。 "); } //點選認輸按鈕if(e.getX()>=400&&e.getX()<=470&&e.getY()>=280&&e.getY()<=310) { int result=JOptionPane.showConfirmDialog(<=310) { int result=JOptionPane.showConfirmDialog(this ,"是否確定認輸?"); if (result == 0) { if (isBlack) { JOptionPane.showMessageDialog(this, "黑方已經認輸,遊戲結束!"); } else { JOptionPane.showMessageDialog(this, "白方已經認輸,遊戲結束!"); } canPlay = false; } } //點擊關於按鈕if(e.getX()>=400&&e.getX()<=470&&e.getY()>=330&&e.getY()<=360) { JOptionPane.showMessageDialog(this,"本遊戲由南木工作室製作,有相關問題可以上www.yiyiinformation.com"); } //點選退出按鈕if(e.getX()>=400&&e.getX()<=470&&e.getY()>=380&&e.getY()<=410) { JOptionPane.showMessageDialog(this, "遊戲結束"); System.exit(0); } } //************************// @Override public void mouseEntered(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent arg0) { // TODO Auto-genated TOmethod @Override public void mouseReleased(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void run() { if (maxTime > 0) { while (true) { if (isBlack) { blackTime--; if (blackTime == 0) { JOptionPane .showMessageDialog(this, "黑方超時,遊戲結束!"); } } else { whiteTime--; if (whiteTime == 0) { JOptionPane.showMessageDialog(this, "白方超時,遊戲結束!"); } } blackMessage = blackTime / 3600 + ":" + (blackTime / 60 - blackTime / 3600 * 60) + " " + (blackTime - blackTime / 60 * 60); whiteMessage = whiteTime / 3600 + ":" + (whiteTime / 60 - whiteTime / 3600 * 60) + ":" + (whiteTime - whiteTime / 60 * 60); this.repaint(); try { Thread.1000) ; } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(blackTime + " -- " + whiteTime); } } } } }
示範圖:
以上所述就是本文的全部內容了,希望能對大家熟練java有所幫助。