五子棋的简单实现
这个是在网上找的资源,出处记不得了,记录一下。
程序的总体结构,很简单的:
代码如下:
ArrComparator.java
类
import java.util.Comparator;
/**
* 排序 Comparator
*/
class ArrComparator implements Comparator<Object> {
int column = 2;
int sortOrder = -1; // 递减
public ArrComparator() {
}
public int compare(Object a, Object b) {
if (a instanceof int[]) {
return sortOrder * (((int[]) a)[column] - ((int[]) b)[column]);
}
throw new IllegalArgumentException("param a,b must int[].");
}
}
ChessMap.java
类
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.URL;
@SuppressWarnings("serial")
public class ChessMap extends JFrame {
private ImageIcon map; //棋盘背景位图
private ImageIcon blackchess; //黑子位图
private ImageIcon whitechess; //白子位图
private ChessPanel cp; //棋盘
private JPanel east;
private JPanel west;
private static final int FINAL_WIDTH = 450;
private static final int FINAL_HEIGHT = 500;
//以下为下拉菜单
private JMenuBar menubar;
private JMenu[] menu={
new JMenu("开始"),new JMenu("设置"),new JMenu("帮助")};
private JMenuItem[] menuitem1={
new JMenuItem("重新开始"),new JMenuItem("悔棋"),new JMenuItem("退出")};
private JMenuItem[] menuitem2={
new JMenuItem("禁手选择"),new JMenuItem("人机博弈"),new JMenuItem("人人对弈")};
private JMenuItem[] menuitem3={
new JMenuItem("规则"),new JMenuItem("关于")};
private boolean haveai=true; //人与人下还是人与电脑下,true与电脑下
Mouseclicked mouseclicked=new Mouseclicked();
MouseMoved mousemoved=new MouseMoved();
Menuitemclicked menuclicked=new Menuitemclicked();
//构造函数
public ChessMap(){
//改变系统默认字体
Font font = new Font("Dialog", Font.PLAIN, 12);
java.util.Enumeration keys = UIManager.getDefaults().keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
Object value = UIManager.get(key);
if (value instanceof javax.swing.plaf.FontUIResource) {
UIManager.put(key, font);
}
}
setTitle("五子棋 ");
setSize(FINAL_WIDTH,FINAL_HEIGHT);
setResizable(false);
init();
setLocation(Toolkit.getDefaultToolkit().getScreenSize().width / 2
- FINAL_WIDTH / 2, Toolkit.getDefaultToolkit()
.getScreenSize().height
/ 2 - FINAL_HEIGHT / 2);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cp.reset();
setVisible(true);
}
//初始化与默认值
public void init()
{
map=new ImageIcon(getClass().getResource("bg.jpg"));
blackchess=new ImageIcon(getClass().getResource("blackchess.gif"));
whitechess=new ImageIcon(getClass().getResource("whitechess.gif"));
cp=new ChessPanel(map,blackchess,whitechess);
menubar=new JMenuBar();
menuitem1[0].setActionCommand("Restart");
menuitem1[1].setActionCommand("Rollback");
menuitem1[2].setActionCommand("Exit");
menuitem2[0].setActionCommand("Forbid");
menuitem2[1].setActionCommand("Robot");
menuitem2[2].setActionCommand("Human");
menuitem3[0].setActionCommand("Rule");
menuitem3[1].setActionCommand("About");
for(int i=0;i<3;i++)
menu[0].add(menuitem1[i]);
for(int i=0;i<3;i++)
menu[1].add(menuitem2[i]);
for(int i=0;i<2;i++)
menu[2].add(menuitem3[i]);
for(int i=0;i<3;i++)
menubar.add(menu[i]);
Container p = getContentPane();
setJMenuBar(menubar);
east = new JPanel();
west = new JPanel();
p.add(east, "East");
p.add(west, "West");
p.add(cp, "Center");
cp.addMouseListener(mouseclicked);
cp.addMouseMotionListener(mousemoved);
menuitem1[0].addActionListener(menuclicked);
menuitem1[1].addActionListener(menuclicked);
menuitem1[2].addActionListener(menuclicked);
menuitem2[0].addActionListener(menuclicked);
menuitem2[1].addActionListener(menuclicked);
menuitem2[2].addActionListener(menuclicked);
menuitem3[0].addActionListener(menuclicked);
menuitem3[1].addActionListener(menuclicked);
}
class Mouseclicked extends MouseAdapter //判断鼠标左击并通知棋盘和电脑
{
public void mouseClicked(MouseEvent e)
{
if(cp.win==false){
if(haveai){
//和电脑博弈
Point p1=new Point();
p1=cp.getPoint(e.getX(),e.getY());
int x=p1.x;
int y=p1.y;
// 如果该位置已经放置棋子
System.out.println("x="+x+",y="+y);
if (cp.isChessOn[x][y] != 2)
return;
// 玩家为黑棋,考虑禁手
if( cp.able_flag && cp.bw == 0) {
int type = cp.getType(x,y,cp.bw);
String str = null;
switch(type){
case 20:
str = "黑长连禁手!请选择其它位置下棋!";
break;
case 21:
str = "黑四四禁手!请选择其它位置下棋!";
break;
case 22:
str = "黑三三禁手!请选择其它位置下棋!";
break;
default : break;
}
if(str != null) {
JOptionPane.showMessageDialog(null,str);
return;
}
}
boolean flag=cp.haveWin(x, y, cp.bw);
cp.update( x, y );
cp.putVoice(); //落子声音
// 第一步棋,需初始化设置边界值
if( cp.chess_num == 1){
if(x-1>=0)
cp.x_min = x-1;
if(x-1<=15)
cp.x_max = x+1;
if(y-1>=0)
cp.y_min = y-1;
if(y-1<=15)
cp.y_max = y+1;
}
else
cp.resetMaxMin(x,y);
if (flag) {
cp.wined(1 - cp.bw);
return;
}
cp.putOne(cp.bw);
}else{
//和人博弈
Point p1=new Point();
p1=cp.getPoint(e.getX(),e.getY());
int x=p1.x;
int y=p1.y;
// 如果该位置已经放置棋子
System.out.println("x="+x+",y="+y);
if (cp.isChessOn[x][y] != 2)
return;
// 玩家为黑棋,考虑禁手
if( cp.able_flag && cp.bw == 0) {
int type = cp.getType(x,y,cp.bw);
String str = null;
switch(type){
case 20:
str = "黑长连禁手!请选择其它位置下棋!";
break;
case 21:
str = "黑四四禁手!请选择其它位置下棋!";
break;
case 22:
str = "黑三三禁手!请选择其它位置下棋!";
break;
default : break;
}
if(str != null) {
JOptionPane.showMessageDialog(null,str);
return;
}
}
boolean flag=cp.haveWin(x, y, cp.bw);
cp.update( x, y );
cp