您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“怎么用Java實(shí)現(xiàn)單機(jī)版五子棋游戲”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么用Java實(shí)現(xiàn)單機(jī)版五子棋游戲”吧!
1、對(duì)局雙方各執(zhí)一色棋子。
2、空棋盤開局。
3、玩家(黑棋)先、AI(紅棋)后,交替下子,每次只能下一子。
4、棋子下在棋盤的空白點(diǎn)上,棋子下定后,不得向其它點(diǎn)移動(dòng),不得從棋盤上拿掉或拿起另落別處。
5、黑方的第一枚棋子可下在棋盤任意交叉點(diǎn)上。
6、輪流下子是雙方的權(quán)利,但允許任何一方放棄下子權(quán),先形成5子連線者獲勝。
1、由于是單機(jī)的游戲,啟動(dòng)游戲后,可直接開始游戲。
2、游戲規(guī)則:
對(duì)局雙方各執(zhí)一色棋子。
空棋盤開局。
黑先、紅后,交替下子,每次只能下一子。
棋子下在棋盤的空白點(diǎn)上,棋子下定后,不得向其它點(diǎn)移動(dòng),不得從棋盤上拿掉或拿起另落別處。
黑方的第一枚棋子可下在棋盤任意交叉點(diǎn)上。
輪流下子是雙方的權(quán)利,但允許任何一方放棄下子權(quán),先形成5子連線者獲勝。
3、設(shè)計(jì)排行榜功能
統(tǒng)計(jì)局?jǐn)?shù),步數(shù)和結(jié)果
4、更換棋盤
可以切換不同的棋盤,下棋更加賞心悅目。
5、更換棋子
可以芀不同的棋子顏色。
主界面:
package wuziqi; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; public class Wumain extends JFrame{ Pan p = null; JMenuBar menuber = new JMenuBar(); JMenu jm1 = new JMenu("選項(xiàng)"); JMenu jm2 = new JMenu("設(shè)置"); JMenu jm3 = new JMenu("幫助"); JMenuItem jm1_1 = new JMenuItem("重新開始"); JMenuItem jm1_2 = new JMenuItem(" 排行榜"); JMenuItem jm1_3 = new JMenuItem("退出游戲"); JMenuItem jm2_1 = new JMenuItem("更換棋盤"); JMenuItem jm2_2 = new JMenuItem("更換棋子"); JMenuItem jm3_1 = new JMenuItem("關(guān)于我們"); public Wumain() { p =new Pan(); this.setSize(585,600); this.setLocation(200,100); this.add(p); this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jm1.add(jm1_1); jm1.add(jm1_2); jm1.add(jm1_3); jm2.add(jm2_1); jm2.add(jm2_2); jm3.add(jm3_1); menuber.add(jm1); menuber.add(jm2); menuber.add(jm3); this.setJMenuBar(menuber); this.addMouseListener(p); jm1_3.addActionListener(new ActionListener() { // 匿名虛構(gòu)類 @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }); jm1_1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for(int i=0;i<p.row;i++){ for(int j=0;j<p.col;j++){ p.num[i][j] = 0; } } p.canSetqizi = true; p.qizi_num = 0; repaint(); } }); jm2_1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Random r = new Random(); int n = r.nextInt(8); String qipan_name = "qipan"+n+".jpg"; p.qipan_name = qipan_name; repaint(); } }); jm2_2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Random r = new Random(); int n = r.nextInt(8); String qizi1_name = "c"+n+".png"; String qizi2_name = "c"+(n+1)+".png"; p.qizi1_name = qizi1_name; p.qizi2_name = qizi2_name; repaint(); } }); jm3_1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String msg ="關(guān)于我們\n" + "1、玩家先落子;\n" + "2、形成5顆同色連子即為贏;\n\n\n" + " "; JOptionPane.showMessageDialog(null, msg); } }); jm1_2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String msg ="排行榜\n" + "局?jǐn)?shù) 步數(shù) 結(jié)果\n"; for(int i=0;i<p.paihanglist.size();i++) { PaiHangBang ph = p.paihanglist.get(i); msg = msg+" "+ph.getJushu() +" "+ph.getBushu() +" "+ph.getJieguo()+"\n"; } JOptionPane.showMessageDialog(null, msg); } }); this.setVisible(true); } public static void main(String[] args){ Wumain w = new Wumain(); } }
排行榜
package wuziqi; public class PaiHangBang { private int jushu; private int bushu; private String jieguo; public int getJushu() { return jushu; } public void setJushu(int jushu) { if(jushu<1){ this.jushu = 1; } this.jushu = jushu; } public int getBushu() { return bushu; } public void setBushu(int bushu) { this.bushu = bushu; } public String getJieguo() { return jieguo; } public void setJieguo(String jieguo) { this.jieguo = jieguo; } }
棋盤
package wuziqi; import java.awt.Graphics; import java.awt.Image; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JOptionPane; import javax.swing.JPanel; public class Pan extends JPanel implements MouseListener{ int i=0,j=0; int row = 15; // 數(shù)組下標(biāo) int col = 15; // 數(shù)組上標(biāo) String qipan_name = "qipan1.jpg"; String qizi1_name = "c1.png"; String qizi2_name = "c2.png"; int num[][] = new int[row][col]; // 0:標(biāo)示該位置為空,1:標(biāo)示紅棋子,2:標(biāo)示黑棋子 boolean canSetqizi = true; // 定義boolean值,用來判斷該位置是否有子 int qizi_num = 0; // 定義記錄落子數(shù) List<PaiHangBang> paihanglist = new ArrayList(); // 定義集合,用來存儲(chǔ)排行榜 public void paint(Graphics g){ super.paint(g); Image img= new ImageIcon("img/"+qipan_name).getImage(); // 調(diào)入棋盤圖片 g.drawImage(img, 0, 0, 567, 567, this); // 繪制棋盤 Image c1= new ImageIcon("img/"+qizi1_name).getImage(); Image c2= new ImageIcon("img/"+qizi2_name).getImage(); for(int i = 0;i<num.length;i++){ for(int j = 0;j<num[i].length;j++){ if(num[i][j] == 1) { g.drawImage(c1, i*35+20, j*35+20, 35, 35, this); } else if(num[i][j] == 2) { g.drawImage(c2, i*35+20, j*35+20, 35, 35, this); } } // 重繪棋子 } // 重載整個(gè)界面(防止最小化后原內(nèi)容丟失) } public int[] getLoc(int x,int y) { int count = 1; // 定義計(jì)數(shù)器,用于計(jì)算棋子數(shù) int[] wz1 = null; int[] wz2 = null; // 定義數(shù)組,用來存儲(chǔ)危險(xiǎn)位置 for(int i =x-1;i>=0;i--){ if(num[i][y] == num[x][y]) { count++; } else { if(num[i][y] == 0){ wz1 = new int[]{i,y}; // 獲取左邊的危險(xiǎn)位置坐標(biāo) } break; } } // 左 for(int i =x+1;i<row;i++){ if(num[i][y] == num[x][y]) { count++; }else{ if(num[i][y] == 0){ wz2 = new int[]{i,y}; // 獲取有變位置危險(xiǎn)坐標(biāo) } break; } } // 右 if(count>=3) { if(wz1 != null){ return wz1; // 判斷返回左邊危險(xiǎn)位置 }else if(wz2 != null){ return wz2; // 判斷返回右邊危險(xiǎn)位置 }else{ return null; } } // 左右 count = 1; wz1 = null; wz2 = null; // 初始化所有參數(shù) for(int j =y-1;j>=0;j--){ if(num[x][j] == num[x][y]) { count++; } else { if(num[x][j] == 0){ wz1 = new int[]{x,j}; } break; } } // 上 for(int j =y+1;j<col;j++){ if(num[x][j] == num[x][y]) { count++; }else{ if(num[x][j] == 0){ wz2 = new int[]{x,j}; } break; } } // 下 if(count>=3) { if(wz1 != null){ return wz1; }else if(wz2 != null){ return wz2; }else{ return null; } } // 上下 count = 1; wz1 = null; wz2 = null; for(int i =x-1,j =y-1;i>=0&&j>=0;i--,j--){ if(num[i][j] == num[x][y]) { count++; } else { if(num[i][j] == 0){ wz1 = new int[]{i,j}; } break; } } // 左上 for(int i =x+1,j =y+1;i<row&&j<col;i++,j++){ if(num[i][j] == num[x][y]) { count++; }else{ if(num[i][j] == 0){ wz2 = new int[]{i,j}; } break; } } // 右下 if(count>=3) { if(wz1 != null){ return wz1; }else if(wz2 != null){ return wz2; }else{ return null; } } // 左上右下 count = 1; wz1 = null; wz2 = null; for(int i =x-1,j =y+1;i>=0&&j<col;i--,j++){ if(num[i][j] == num[x][y]) { count++; } else { if(num[i][j] == 0){ wz1 = new int[]{i,j}; } break; } } // 左下 for(int i =x+1,j =y-1;i<row&&j>=0;i++,j--){ if(num[i][j] == num[x][y]) { count++; }else{ if(num[i][j] == 0){ wz2 = new int[]{i,j}; } break; } } // 右上 if(count>=3) { if(wz1 != null){ return wz1; }else if(wz2 != null){ return wz2; }else{ return null; } } // 左下右上 return null; } public boolean iswin(int x,int y){ int count = 1; for(int i =x-1;i>=0;i--){ if(num[i][y] == num[x][y]) { count++; } else { break; } } // 左 for(int i =x+1;i<row;i++){ if(num[i][y] == num[x][y]) { count++; }else{ break; } } // 右 if(count>=5) { return true; } // 左右 count = 1; for(int j =y-1;j>=0;j--){ if(num[x][j] == num[x][y]) { count++; } else { break; } } // 上 for(int j =y+1;j<col;j++){ if(num[x][j] == num[x][y]) { count++; }else{ break; } } // 下 if(count>=5) { return true; } // 上下 count = 1; for(int i =x-1,j =y-1;i>=0&&j>=0;i--,j--){ if(num[i][j] == num[x][y]) { count++; } else { break; } } // 左上 for(int i =x+1,j =y+1;i<row&&j<col;i++,j++){ if(num[i][j] == num[x][y]) { count++; }else{ break; } } // 右下 if(count>=5) { return true; } // 左上右下 count = 1; for(int i =x-1,j =y+1;i>=0&&j<col;i--,j++){ if(num[i][j] == num[x][y]) { count++; } else { break; } } // 左下 for(int i =x+1,j =y-1;i<row&&j>=0;i++,j--){ if(num[i][j] == num[x][y]) { count++; }else{ break; } } // 右上 if(count>=5) { return true; } // 左下右上 return false; } // 判斷輸贏 @Override public void mouseClicked(MouseEvent e) { if(canSetqizi){ Graphics g = this.getGraphics(); int checkusersuccess = 0; // 標(biāo)示是否落子成功 int x = e.getX(); int y = e.getY(); // 獲取鼠標(biāo)點(diǎn)擊的位置 Image c1= new ImageIcon("img/"+qizi1_name).getImage(); int i = (x-25)/35; int j = (y-75)/35; if(num[i][j] != 0){ JOptionPane.showMessageDialog(null, "該位置有旗子,請(qǐng)重新落子"); return; // 判斷有子,終止本次事件,進(jìn)行下次事件觸發(fā) }else{ g.drawImage(c1, i*35+20, j*35+20, 35, 35, this); // 畫出玩家落子 num[i][j] = 1; // 給數(shù)組付一個(gè)只值,表示該位置有旗子 checkusersuccess = 1; // 標(biāo)示量標(biāo)示 qizi_num++; // 記錄玩家落子步數(shù) } boolean b=iswin(i,j); if(b){ JOptionPane.showMessageDialog(null, "你贏了!"); canSetqizi = false; PaiHangBang ph = new PaiHangBang(); ph.setJushu(paihanglist.size()+1); ph.setBushu(qizi_num); ph.setJieguo("win"); paihanglist.add(ph); return; } // 調(diào)用boolean判斷方法 try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); } // 時(shí)間間隔:玩家落子后的等待 Random r = new Random(); Image c2 = new ImageIcon("img/"+qizi2_name).getImage(); // 調(diào)入黑棋子圖片 do{ int[] wz =getLoc(i, j); if(wz == null){ i = r.nextInt(15); j = r.nextInt(15); }else{ i=wz[0]; j=wz[1]; } // 設(shè)置隨機(jī)的坐標(biāo) }while(num[i][j] != 0); g.drawImage(c2, i*35+20, j*35+20, 35, 35, this); num[i][j] = 2; boolean d=iswin(i,j); if(d){ JOptionPane.showMessageDialog(null, "你輸了!"); canSetqizi = false; PaiHangBang ph = new PaiHangBang(); ph.setJushu(paihanglist.size()+1); ph.setBushu(qizi_num); ph.setJieguo("fail"); paihanglist.add(ph); return; } // 隨機(jī)電腦落子位置; } } @Override public void mousePressed(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 } }
到此,相信大家對(duì)“怎么用Java實(shí)現(xiàn)單機(jī)版五子棋游戲”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。