JAVA课程设计 五子棋(内附完整代码)

时间:2024.5.8

JAVA课程设计

设计题目:五子棋游戏

一. 简要的介绍五子棋

1. 五子棋的起源

五子棋,又被称为“连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋”。五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。

2.现在五子棋标准棋盘(如图所示)

JAVA课程设计五子棋内附完整代码

3.五子棋的棋子

五子棋采用两种颜色棋子,黑色棋子和白色棋子,和围棋相同,

4.五子棋规则

五子棋就是五个棋子连在一起就算赢,黑棋先行,下棋下在棋盘交叉线上,由于黑棋先行,优势太大,所以对黑棋设了禁手,又规定了“三手交换”,

就是黑棋下第 2 手棋,盘面第 3 着棋之后,白方在应白 2 之前,如感觉黑方棋形不利于己方,可出交换,即执白棋一方变为执黑棋一方。和“五手两打法”,就是黑棋在下盘面上关键的第 5 手时,必须下两步棋,让白方在这两步棋中任选一步,然后再续下。不过一般爱好者不需要遵循这么多规则。

二.程序流程

JAVA课程设计五子棋内附完整代码

三.代码设计与分析

main方法创建了ChessFrame类的一个实例对象(cf), 并启动屏幕显示显示该实例对象。

public class FiveChessAppletDemo {

public static void main(String args[]){

ChessFrame cf = new ChessFrame(); }

}

用类ChessFrame创建五子棋游戏主窗体和菜单

import java.awt.*;

import java.awt.event.*;

import java.applet.*;

import javax.swing.*;

import java.io.PrintStream;

import javax.swing.JComponent;

import javax.swing.JPanel;

class ChessFrame extends JFrame implements ActionListener { private String[] strsize={"标准棋盘","改进棋盘","扩大棋盘"}; private String[] strmode={"人机对战","人人对战"};

public static boolean iscomputer=true,checkcomputer=true; private int width,height;

private ChessModel cm;

private MainPanel mp;

构造五子棋游戏的主窗体

public ChessFrame() {

this.setTitle("五子棋游戏");

cm=new ChessModel(1);

mp=new MainPanel(cm);

Container con=this.getContentPane();

con.add(mp,"Center");

this.setResizable(false);

this.addWindowListener(new ChessWindowEvent());

MapSize(14,14);

JMenuBar mbar = new JMenuBar();

this.setJMenuBar(mbar);

JMenu gameMenu = new JMenu("游戏");

mbar.add(makeMenu(gameMenu, new Object[] {

"开局", null,"棋盘",null,"模式", null, "退出"

}, this));

JMenu lookMenu =new JMenu("外观");

mbar.add(makeMenu(lookMenu,new Object[] {

"类型一","类型二","类型三"

},this));

JMenu helpMenu = new JMenu("版本");

mbar.add(makeMenu(helpMenu, new Object[] {

"关于"

}, this));

}

构造五子棋游戏的主菜单

public JMenu makeMenu(Object parent, Object items[], Object target){ JMenu m = null;

if(parent instanceof JMenu)

m = (JMenu)parent;

else if(parent instanceof String)

m = new JMenu((String)parent);

else

return null;

for(int i = 0; i < items.length; i++)

if(items[i] == null)

m.addSeparator();

else if(items[i] == "棋盘"){

JMenu jm = new JMenu("棋盘");

ButtonGroup group=new ButtonGroup();

JRadioButtonMenuItem rmenu;

for (int j=0;j<strsize.length;j++){

rmenu=makeRadioButtonMenuItem(strsize[j],target);

if (j==0)

rmenu.setSelected(true);

jm.add(rmenu);

group.add(rmenu);

}

m.add(jm);

}else if(items[i] == "模式"){

JMenu jm = new JMenu("模式");

ButtonGroup group=new ButtonGroup();

JRadioButtonMenuItem rmenu;

for (int h=0;h<strmode.length;h++){

rmenu=makeRadioButtonMenuItem(strmode[h],target);

if(h==0)

rmenu.setSelected(true);

jm.add(rmenu);

group.add(rmenu);

}

m.add(jm);

}else

m.add(makeMenuItem(items[i], target));

return m;

}

构造五子棋游戏的菜单项

public JMenuItem makeMenuItem(Object item, Object target){ JMenuItem r = null;

if(item instanceof String)

r = new JMenuItem((String)item);

else if(item instanceof JMenuItem)

r = (JMenuItem)item;

else

return null;

if(target instanceof ActionListener)

r.addActionListener((ActionListener)target);

return r;

}

构造五子棋游戏的单选按钮式菜单项

public JRadioButtonMenuItem makeRadioButtonMenuItem( Object item, Object target){

JRadioButtonMenuItem r = null;

if(item instanceof String)

r = new JRadioButtonMenuItem((String)item);

else if(item instanceof JRadioButtonMenuItem)

r = (JRadioButtonMenuItem)item;

else

return null;

if(target instanceof ActionListener)

r.addActionListener((ActionListener)target); return r;

}

public void MapSize(int w,int h){

setSize(w * 24, h * 27);

if(this.checkcomputer)

this.iscomputer=true;

else

this.iscomputer=false;

mp.setModel(cm);

mp.repaint();

}

public boolean getiscomputer(){

return this.iscomputer;

}

public void restart(){

int modeChess = cm.getModeChess();

if(modeChess <= 3 && modeChess >= 0){

cm = new ChessModel(modeChess);

MapSize(cm.getWidth(),cm.getHeight());

}

}

public void actionPerformed(ActionEvent e){

String arg=e.getActionCommand();

try{

if (arg.equals("类型三"))

UIManager.setLookAndFeel(

"com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); else if(arg.equals("类型二"))

UIManager.setLookAndFeel(

"com.sun.java.swing.plaf.motif.MotifLookAndFeel"); else

UIManager.setLookAndFeel(

"javax.swing.plaf.metal.MetalLookAndFeel" );

SwingUtilities.updateComponentTreeUI(this);

}catch(Exception ee){}

if(arg.equals("标准棋盘")){

this.width=14;

this.height=14;

cm=new ChessModel(1);

MapSize(this.width,this.height);

SwingUtilities.updateComponentTreeUI(this);

}

if(arg.equals("改进棋盘")){

this.width=18;

this.height=18;

cm=new ChessModel(2);

MapSize(this.width,this.height);

SwingUtilities.updateComponentTreeUI(this);

}

if(arg.equals("扩大棋盘")){

this.width=22;

this.height=22;

cm=new ChessModel(3);

MapSize(this.width,this.height);

SwingUtilities.updateComponentTreeUI(this);

}

if(arg.equals("人机对战")){

this.checkcomputer=true;

this.iscomputer=true;

cm=new ChessModel(cm.getModeChess());

MapSize(cm.getWidth(),cm.getHeight());

SwingUtilities.updateComponentTreeUI(this); }

if(arg.equals("人人对战")){

this.checkcomputer=false;

this.iscomputer=false;

cm=new ChessModel(cm.getModeChess());

MapSize(cm.getWidth(),cm.getHeight());

SwingUtilities.updateComponentTreeUI(this); }

if(arg.equals("开局")){

restart();

}

if(arg.equals("关于"))

JOptionPane.showMessageDialog(null, "第一版", "版本",JOptionPane.PLAIN_MESSAGE );

if(arg.equals("退出"))

System.exit(0);

}

}

用类ChessModel实现了整个五子棋程序算法的核心 import java.awt.*;

import java.awt.event.*;

import java.applet.*;

import javax.swing.*;

import java.io.PrintStream;

import javax.swing.JComponent;

import javax.swing.JPanel;

class ChessModel {

规定棋盘的宽度、高度、棋盘的模式

private int width,height,modeChess;

规定棋盘方格的横向、纵向坐标

private int x=0,y=0;

棋盘方格的横向、纵向坐标所对应的棋子颜色, 数组arrMapShow只有3个值:1,2,3,-1, 其中1代表该棋盘方格上下的棋子为黑子,

2代表该棋盘方格上下的棋子为白子,

3代表为该棋盘方格上没有棋子,

-1代表该棋盘方格不能够下棋子

private int[][] arrMapShow;

交换棋手的标识,棋盘方格上是否有棋子的标识符

private boolean isOdd,isExist;

public ChessModel() {}

该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘

public ChessModel(int modeChess){

this.isOdd=true;

if(modeChess == 1){

PanelInit(14, 14, modeChess);

}

if(modeChess == 2){

PanelInit(18, 18, modeChess);

}

if(modeChess == 3){

PanelInit(22, 22, modeChess);

}

}

按照棋盘模式构建棋盘大小

private void PanelInit(int width, int height, int modeChess){ this.width = width;

this.height = height;

this.modeChess = modeChess;

arrMapShow = new int[width+1][height+1];

for(int i = 0; i <= width; i++){

for(int j = 0; j <= height; j++){

arrMapShow[i][j] = -1;

}

}

}

获取是否交换棋手的标识符 public boolean getisOdd(){ return this.isOdd;

}

设置交换棋手的标识符

public void setisOdd(boolean isodd){ if(isodd)

this.isOdd=true;

else

this.isOdd=false;

}

获取某棋盘方格是否有棋子的标识值 public boolean getisExist(){ return this.isExist;

}

获取棋盘宽度

public int getWidth(){

return this.width;

}

获取棋盘高度

public int getHeight(){

return this.height;

}

获取棋盘模式

public int getModeChess(){ return this.modeChess;

}

获取棋盘方格上棋子的信息 public int[][] getarrMapShow(){ return arrMapShow;

}

判断下子的横向、纵向坐标是否越界

private boolean badxy(int x, int y){

if(x >= width+20 || x < 0)

return true;

return y >= height+20 || y < 0;

}

计算棋盘上某一方格上八个方向棋子的最大值,

这八个方向分别是:左、右、上、下、左上、左下、右上、右下 public boolean chessExist(int i,int j){

if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2) return true;

return false;

}

判断该坐标位置是否可下棋子

public void readyplay(int x,int y){

if(badxy(x,y))

return;

if (chessExist(x,y))

return;

this.arrMapShow[x][y]=3;

}

在该坐标位置下棋子

public void play(int x,int y){

if(badxy(x,y))

return;

if(chessExist(x,y)){

this.isExist=true;

return;

}else

this.isExist=false;

if(getisOdd()){

setisOdd(false);

this.arrMapShow[x][y]=1;

}else{

setisOdd(true);

this.arrMapShow[x][y]=2;

}

}

计算机走棋

说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数, 最后得出棋子数最大值的坐标,下子

public void computerDo(int width,int height){

int max_black,max_white,max_temp,max=0;

setisOdd(true);

System.out.println("计算机走棋 ...");

for(int i = 0; i <= width; i++){

for(int j = 0; j <= height; j++){

算法判断是否下子

if(!chessExist(i,j)){

判断白子的最大值

max_white=checkMax(i,j,2);

判断黑子的最大值

max_black=checkMax(i,j,1);

max_temp=Math.max(max_white,max_black);

if(max_temp>max){

max=max_temp;

this.x=i;

this.y=j;

}

}

}

}

setX(this.x);

setY(this.y);

this.arrMapShow[this.x][this.y]=2;

}

记录电脑下子后的横向坐标

public void setX(int x){

this.x=x;

}

记录电脑下子后的纵向坐标

public void setY(int y){

this.y=y;

}

获取电脑下子的横向坐标

public int getX(){

return this.x;

}

获取电脑下子的纵向坐标

public int getY(){

return this.y;

}

计算棋盘上某一方格上八个方向棋子的最大值,

这八个方向分别是:左、右、上、下、左上、左下、右上、右下 public int checkMax(int x, int y,int black_or_white){

int num=0,max_num,max_temp=0;

int x_temp=x,y_temp=y;

int x_temp1=x_temp,y_temp1=y_temp;

判断右边

for(int i=1;i<5;i++){

x_temp1+=1;

if(x_temp1>this.width)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)

num++;

else

break;

}

判断左边

x_temp1=x_temp;

for(int i=1;i<5;i++){

x_temp1-=1;

if(x_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

if(num<5)

max_temp=num;

判断上面

x_temp1=x_temp;

y_temp1=y_temp;

num=0;

for(int i=1;i<5;i++){

y_temp1-=1;

if(y_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

判断下面

y_temp1=y_temp;

for(int i=1;i<5;i++){

y_temp1+=1;

if(y_temp1>this.height)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

if(num>max_temp&&num<5)

max_temp=num;

判断左上方

x_temp1=x_temp;

y_temp1=y_temp;

num=0;

for(int i=1;i<5;i++){

x_temp1-=1;

y_temp1-=1;

if(y_temp1<0 || x_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

判断右下方

x_temp1=x_temp;

y_temp1=y_temp;

for(int i=1;i<5;i++){

x_temp1+=1;

y_temp1+=1;

if(y_temp1>this.height || x_temp1>this.width) break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

if(num>max_temp&&num<5)

max_temp=num;

判断右上方

x_temp1=x_temp;

y_temp1=y_temp;

num=0;

for(int i=1;i<5;i++){

x_temp1+=1;

y_temp1-=1;

if(y_temp1<0 || x_temp1>this.width)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

判断左下方

x_temp1=x_temp;

y_temp1=y_temp;

for(int i=1;i<5;i++){

x_temp1-=1;

y_temp1+=1;

if(y_temp1>this.height || x_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

if(num>max_temp&&num<5)

max_temp=num;

max_num=max_temp;

return max_num;

}

判断胜负

public boolean judgeSuccess(int x,int y,boolean isodd){ int num=1;

int arrvalue;

int x_temp=x,y_temp=y;

if(isodd)

arrvalue=2;

else

arrvalue=1;

int x_temp1=x_temp,y_temp1=y_temp;

判断右边胜负

for(int i=1;i<6;i++){

x_temp1+=1;

if(x_temp1>this.width)

break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;

else

break;

}

判断左边胜负

x_temp1=x_temp;

for(int i=1;i<6;i++){

x_temp1-=1;

if(x_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;

else

break;

}

if(num==5)

return true;

判断上方胜负

x_temp1=x_temp;

y_temp1=y_temp;

num=1;

for(int i=1;i<6;i++){

y_temp1-=1;

if(y_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;

else

break;

}

判断下方胜负

y_temp1=y_temp;

for(int i=1;i<6;i++){

y_temp1+=1;

if(y_temp1>this.height)

break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;

else

break;

}

if(num==5)

return true;

判断左上胜负

x_temp1=x_temp;

y_temp1=y_temp;

num=1;

for(int i=1;i<6;i++){

x_temp1-=1;

y_temp1-=1;

if(y_temp1<0 || x_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;

else

break;

}

判断右下胜负

x_temp1=x_temp;

y_temp1=y_temp;

for(int i=1;i<6;i++){

x_temp1+=1;

y_temp1+=1;

if(y_temp1>this.height || x_temp1>this.width) break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;

else

break;

}

if(num==5)

return true;

判断右上胜负

x_temp1=x_temp;

y_temp1=y_temp;

num=1;

for(int i=1;i<6;i++){

x_temp1+=1;

y_temp1-=1;

if(y_temp1<0 || x_temp1>this.width)

break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;

else

break;

}

判断左下胜负

x_temp1=x_temp;

y_temp1=y_temp;

for(int i=1;i<6;i++){

x_temp1-=1;

y_temp1+=1;

if(y_temp1>this.height || x_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)

num++;

else

break;

}

if(num==5)

return true;

return false;

}

赢棋后的提示

public void showSuccess(JPanel jp){

JOptionPane.showMessageDialog(jp,"你赢了","结果",

JOptionPane.INFORMATION_MESSAGE);

}

输棋后的提示

public void showDefeat(JPanel jp){

JOptionPane.showMessageDialog(jp,"你输了","结果",

JOptionPane.INFORMATION_MESSAGE);

}

}

用类MainPanel主要完成如下功能:

1、构建一个面板,在该面板上画上棋盘;

2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等)

import java.awt.*;

import java.awt.event.*;

import java.applet.*;

import javax.swing.*;

import java.io.PrintStream;

import javax.swing.JComponent;

import javax.swing.JPanel;

class MainPanel extends JPanel

implements MouseListener,MouseMotionListener{

设定棋盘的宽度和高度

private int width,height;

private ChessModel cm;

根据棋盘模式设定面板的大小

MainPanel(ChessModel mm){

cm=mm;

width=cm.getWidth();

height=cm.getHeight();

addMouseListener(this);

}

根据棋盘模式设定棋盘的宽度和高度

public void setModel(ChessModel mm){

cm = mm;

width = cm.getWidth();

height = cm.getHeight();

}

根据坐标计算出棋盘方格棋子的信息(如白子还是黑子), 然后调用draw方法在棋盘上画出相应的棋子

public void paintComponent(Graphics g){

super.paintComponent(g);

for(int j = 0; j <= height; j++){

for(int i = 0; i <= width; i++){

int v = cm.getarrMapShow()[i][j];

draw(g, i, j, v);

}

}

}

根据提供的棋子信息(颜色、坐标)画棋子

public void draw(Graphics g, int i, int j, int v){

int x = 20 * i+20;

int y = 20 * j+20;

画棋盘

if(i!=width && j!=height){

g.setColor(Color.darkGray);

g.drawRect(x,y,20,20);

}

画黑色棋子

if(v == 1 ){

g.setColor(Color.gray);

g.drawOval(x-8,y-8,16,16);

g.setColor(Color.black);

g.fillOval(x-8,y-8,16,16);

}

画白色棋子

if(v == 2 ){

g.setColor(Color.gray);

g.drawOval(x-8,y-8,16,16);

g.setColor(Color.white);

g.fillOval(x-8,y-8,16,16);

}

if(v ==3){

g.setColor(Color.cyan);

g.drawOval(x-8,y-8,16,16);

}

}

响应鼠标的点击事件,根据鼠标的点击来下棋,

根据下棋判断胜负等

public void mousePressed(MouseEvent evt){

int x = (evt.getX()-10) / 20;

int y = (evt.getY()-10) / 20;

System.out.println(x+" "+y);

if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){

cm.play(x,y);

System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]); repaint();

if(cm.judgeSuccess(x,y,cm.getisOdd())){

cm.showSuccess(this);

evt.consume();

ChessFrame.iscomputer=false;

}

判断是否为人机对弈

if(ChessFrame.iscomputer&&!cm.getisExist()){

cm.computerDo(cm.getWidth(),cm.getHeight());

repaint();

if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){ cm.showDefeat(this);

evt.consume();

}

}

}

}

public void mouseClicked(MouseEvent evt){}

public void mouseReleased(MouseEvent evt){}

public void mouseEntered(MouseEvent mouseevt){}

public void mouseExited(MouseEvent mouseevent){}

public void mouseDragged(MouseEvent evt){}

响应鼠标的拖动事件

public void mouseMoved(MouseEvent moveevt){

int x = (moveevt.getX()-10) / 20;

int y = (moveevt.getY()-10) / 20;

cm.readyplay(x,y);

repaint();

}

}

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

响应退出窗口

class ChessWindowEvent extends WindowAdapter{

public void windowClosing(WindowEvent e){

System.exit(0);

}

ChessWindowEvent()

{

}

}

四.程序调试与运行

JAVA课程设计五子棋内附完整代码

运行:

JAVA课程设计五子棋内附完整代码

标准棋盘

JAVA课程设计五子棋内附完整代码

改进棋盘:

JAVA课程设计五子棋内附完整代码

扩大棋盘:

JAVA课程设计五子棋内附完整代码

外观类型二:

JAVA课程设计五子棋内附完整代码

外观类型三:

JAVA课程设计五子棋内附完整代码

人机对战:

JAVA课程设计五子棋内附完整代码

JAVA课程设计五子棋内附完整代码

结果:

JAVA课程设计五子棋内附完整代码

五.结论

通过对五子棋游戏的编写,使自己对java语言有了更深的了解。也更加熟悉和了解了java开发工具Eclipse的使用。不过还有很多不足之处,比如没有能设置禁手,没有能设置悔棋,还有很多东西可以扩充完善。

完整源代码:

import java.awt.*;

import java.awt.event.*;

import java.applet.*;

import javax.swing.*;

import java.io.PrintStream;

import javax.swing.JComponent;

import javax.swing.JPanel;

class ChessFrame extends JFrame implements ActionListener {

private String[] strsize={"标准棋盘","改进棋盘","扩大棋盘"};

private String[] strmode={"人机对战","人人对战"};

public static boolean iscomputer=true,checkcomputer=true;

private int width,height;

private ChessModel cm;

private MainPanel mp;

public ChessFrame() {

this.setTitle("五子棋游戏");

cm=new ChessModel(1);

mp=new MainPanel(cm);

Container con=this.getContentPane();

con.add(mp,"Center");

this.setResizable(false);

this.addWindowListener(new ChessWindowEvent());

MapSize(14,14);

JMenuBar mbar = new JMenuBar();

this.setJMenuBar(mbar);

JMenu gameMenu = new JMenu("游戏");

mbar.add(makeMenu(gameMenu, new Object[] {

"开局", null,"棋盘",null,"模式", null, "退出"

}, this));

JMenu lookMenu =new JMenu("外观");

mbar.add(makeMenu(lookMenu,new Object[] {

"类型一","类型二","类型三"

},this));

JMenu helpMenu = new JMenu("版本");

mbar.add(makeMenu(helpMenu, new Object[] {

"关于"

}, this));

}

public JMenu makeMenu(Object parent, Object items[], Object target){ JMenu m = null;

if(parent instanceof JMenu)

m = (JMenu)parent;

else if(parent instanceof String)

m = new JMenu((String)parent);

else

return null;

for(int i = 0; i < items.length; i++)

if(items[i] == null)

m.addSeparator();

else if(items[i] == "棋盘"){

JMenu jm = new JMenu("棋盘");

ButtonGroup group=new ButtonGroup();

JRadioButtonMenuItem rmenu;

for (int j=0;j<strsize.length;j++){

rmenu=makeRadioButtonMenuItem(strsize[j],target);

if (j==0)

rmenu.setSelected(true);

jm.add(rmenu);

group.add(rmenu);

}

m.add(jm);

}else if(items[i] == "模式"){

JMenu jm = new JMenu("模式");

ButtonGroup group=new ButtonGroup();

JRadioButtonMenuItem rmenu;

for (int h=0;h<strmode.length;h++){

rmenu=makeRadioButtonMenuItem(strmode[h],target); if(h==0)

rmenu.setSelected(true);

jm.add(rmenu);

group.add(rmenu);

}

m.add(jm);

}else

m.add(makeMenuItem(items[i], target));

return m;

}

public JMenuItem makeMenuItem(Object item, Object target){ JMenuItem r = null;

if(item instanceof String)

r = new JMenuItem((String)item);

else if(item instanceof JMenuItem)

r = (JMenuItem)item;

else

return null;

if(target instanceof ActionListener)

r.addActionListener((ActionListener)target); return r;

}

public JRadioButtonMenuItem makeRadioButtonMenuItem( Object item, Object target){

JRadioButtonMenuItem r = null;

if(item instanceof String)

r = new JRadioButtonMenuItem((String)item); else if(item instanceof JRadioButtonMenuItem) r = (JRadioButtonMenuItem)item;

else

return null;

if(target instanceof ActionListener)

r.addActionListener((ActionListener)target); return r;

}

public void MapSize(int w,int h){

setSize(w * 24, h * 27);

if(this.checkcomputer)

this.iscomputer=true;

else

this.iscomputer=false;

mp.setModel(cm);

mp.repaint();

}

public boolean getiscomputer(){

return this.iscomputer;

}

public void restart(){

int modeChess = cm.getModeChess();

if(modeChess <= 3 && modeChess >= 0){

cm = new ChessModel(modeChess);

MapSize(cm.getWidth(),cm.getHeight());

}

}

public void actionPerformed(ActionEvent e){

String arg=e.getActionCommand();

try{

if (arg.equals("类型三"))

UIManager.setLookAndFeel(

"com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); else if(arg.equals("类型二"))

UIManager.setLookAndFeel(

"com.sun.java.swing.plaf.motif.MotifLookAndFeel"); else

UIManager.setLookAndFeel(

"javax.swing.plaf.metal.MetalLookAndFeel" );

SwingUtilities.updateComponentTreeUI(this);

}catch(Exception ee){}

if(arg.equals("标准棋盘")){

this.width=14;

this.height=14;

cm=new ChessModel(1);

MapSize(this.width,this.height);

SwingUtilities.updateComponentTreeUI(this);

}

if(arg.equals("改进棋盘")){

this.width=18;

this.height=18;

cm=new ChessModel(2);

MapSize(this.width,this.height);

SwingUtilities.updateComponentTreeUI(this); }

if(arg.equals("扩大棋盘")){

this.width=22;

this.height=22;

cm=new ChessModel(3);

MapSize(this.width,this.height);

SwingUtilities.updateComponentTreeUI(this); }

if(arg.equals("人机对战")){

this.checkcomputer=true;

this.iscomputer=true;

cm=new ChessModel(cm.getModeChess());

MapSize(cm.getWidth(),cm.getHeight());

SwingUtilities.updateComponentTreeUI(this); }

if(arg.equals("人人对战")){

this.checkcomputer=false;

this.iscomputer=false;

cm=new ChessModel(cm.getModeChess());

MapSize(cm.getWidth(),cm.getHeight());

SwingUtilities.updateComponentTreeUI(this); }

if(arg.equals("开局")){

restart();

}

if(arg.equals("关于"))

JOptionPane.showMessageDialog(null, " 第一版 ", "版本",JOptionPane.PLAIN_MESSAGE );

if(arg.equals("退出"))

System.exit(0);

}

}

import java.awt.*;

import java.awt.event.*;

import java.applet.*;

import javax.swing.*;

import java.io.PrintStream;

import javax.swing.JComponent;

import javax.swing.JPanel;

class ChessModel {

private int width,height,modeChess;

private int x=0,y=0;

private int[][] arrMapShow;

private boolean isOdd,isExist;

public ChessModel() {}

public ChessModel(int modeChess){

this.isOdd=true;

if(modeChess == 1){

PanelInit(14, 14, modeChess);

}

if(modeChess == 2){

PanelInit(18, 18, modeChess);

}

if(modeChess == 3){

PanelInit(22, 22, modeChess);

}

}

private void PanelInit(int width, int height, int modeChess){ this.width = width;

this.height = height;

this.modeChess = modeChess;

arrMapShow = new int[width+1][height+1];

for(int i = 0; i <= width; i++){

for(int j = 0; j <= height; j++){

arrMapShow[i][j] = -1;

}

}

}

public boolean getisOdd(){

return this.isOdd;

}

public void setisOdd(boolean isodd){

if(isodd)

this.isOdd=true;

else

this.isOdd=false;

}

public boolean getisExist(){

return this.isExist;

}

public int getWidth(){

return this.width;

}

public int getHeight(){

return this.height;

}

public int getModeChess(){

return this.modeChess;

}

public int[][] getarrMapShow(){

return arrMapShow;

}

private boolean badxy(int x, int y){

if(x >= width+20 || x < 0)

return true;

return y >= height+20 || y < 0;

}

public boolean chessExist(int i,int j){

if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2) return true;

return false;

}

public void readyplay(int x,int y){

if(badxy(x,y))

return;

if (chessExist(x,y))

return;

this.arrMapShow[x][y]=3;

}

public void play(int x,int y){

if(badxy(x,y))

return;

if(chessExist(x,y)){

this.isExist=true;

return;

}else

this.isExist=false;

if(getisOdd()){

setisOdd(false);

this.arrMapShow[x][y]=1;

}else{

setisOdd(true);

this.arrMapShow[x][y]=2;

}

}

public void computerDo(int width,int height){ int max_black,max_white,max_temp,max=0; setisOdd(true);

System.out.println("计算机走棋 ..."); for(int i = 0; i <= width; i++){ for(int j = 0; j <= height; j++){ if(!chessExist(i,j)){

max_white=checkMax(i,j,2);

max_black=checkMax(i,j,1);

max_temp=Math.max(max_white,max_black); if(max_temp>max){

max=max_temp;

this.x=i;

this.y=j;

}

}

}

}

setX(this.x);

setY(this.y);

this.arrMapShow[this.x][this.y]=2; }

public void setX(int x){

this.x=x;

}

public void setY(int y){

this.y=y;

}

public int getX(){

return this.x;

}

public int getY(){

return this.y;

}

public int checkMax(int x, int y,int black_or_white){ int num=0,max_num,max_temp=0;

int x_temp=x,y_temp=y;

int x_temp1=x_temp,y_temp1=y_temp;

for(int i=1;i<5;i++){

x_temp1+=1;

if(x_temp1>this.width)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

x_temp1=x_temp;

for(int i=1;i<5;i++){

x_temp1-=1;

if(x_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

if(num<5)

max_temp=num;

x_temp1=x_temp;

y_temp1=y_temp;

num=0;

for(int i=1;i<5;i++){

y_temp1-=1;

if(y_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

y_temp1=y_temp;

for(int i=1;i<5;i++){

y_temp1+=1;

if(y_temp1>this.height)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

if(num>max_temp&&num<5)

max_temp=num;

x_temp1=x_temp;

y_temp1=y_temp;

num=0;

for(int i=1;i<5;i++){

x_temp1-=1;

y_temp1-=1;

if(y_temp1<0 || x_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

x_temp1=x_temp;

y_temp1=y_temp;

for(int i=1;i<5;i++){

x_temp1+=1;

y_temp1+=1;

if(y_temp1>this.height || x_temp1>this.width) break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

if(num>max_temp&&num<5)

max_temp=num;

x_temp1=x_temp;

y_temp1=y_temp;

num=0;

for(int i=1;i<5;i++){

x_temp1+=1;

y_temp1-=1;

if(y_temp1<0 || x_temp1>this.width)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

x_temp1=x_temp;

y_temp1=y_temp;

for(int i=1;i<5;i++){

x_temp1-=1;

y_temp1+=1;

if(y_temp1>this.height || x_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

if(num>max_temp&&num<5)

max_temp=num;

max_num=max_temp;

return max_num;

}

public boolean judgeSuccess(int x,int y,boolean isodd){ int num=1;

int arrvalue;

int x_temp=x,y_temp=y;

if(isodd)

arrvalue=2;

else

arrvalue=1;

int x_temp1=x_temp,y_temp1=y_temp;

for(int i=1;i<6;i++){

x_temp1+=1;

if(x_temp1>this.width)

break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;

else

break;

}

x_temp1=x_temp;

for(int i=1;i<6;i++){

x_temp1-=1;

if(x_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;

else

break;

}

if(num==5)

return true;

x_temp1=x_temp;

y_temp1=y_temp;

num=1;

for(int i=1;i<6;i++){

y_temp1-=1;

if(y_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;

else

break;

}

y_temp1=y_temp;

for(int i=1;i<6;i++){

y_temp1+=1;

if(y_temp1>this.height)

break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)

num++;

else

break;

}

if(num==5)

return true;

x_temp1=x_temp;

y_temp1=y_temp;

num=1;

for(int i=1;i<6;i++){

x_temp1-=1;

y_temp1-=1;

if(y_temp1<0 || x_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;

else

break;

}

x_temp1=x_temp;

y_temp1=y_temp;

for(int i=1;i<6;i++){

x_temp1+=1;

y_temp1+=1;

if(y_temp1>this.height || x_temp1>this.width) break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;

else

break;

}

if(num==5)

return true;

x_temp1=x_temp;

y_temp1=y_temp;

num=1;

for(int i=1;i<6;i++){

x_temp1+=1;

y_temp1-=1;

if(y_temp1<0 || x_temp1>this.width)

break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;

else

break;

}

x_temp1=x_temp;

y_temp1=y_temp;

for(int i=1;i<6;i++){

x_temp1-=1;

y_temp1+=1;

if(y_temp1>this.height || x_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;

else

break;

}

if(num==5)

return true;

return false;

}

public void showSuccess(JPanel jp){

JOptionPane.showMessageDialog(jp,"你赢了","结果", JOptionPane.INFORMATION_MESSAGE);

}

public void showDefeat(JPanel jp){

JOptionPane.showMessageDialog(jp,"你输了","结果", JOptionPane.INFORMATION_MESSAGE);

}

}

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

class ChessWindowEvent extends WindowAdapter{ public void windowClosing(WindowEvent e){

System.exit(0);

}

ChessWindowEvent()

{

}

}

public class FiveChessAppletDemo {

public static void main(String args[]){ ChessFrame cf = new ChessFrame(); cf.show();

}

}

import java.awt.*;

import java.awt.event.*;

import java.applet.*;

import javax.swing.*;

import java.io.PrintStream;

import javax.swing.JComponent;

import javax.swing.JPanel;

class MainPanel extends JPanel

implements MouseListener,MouseMotionListener{ private int width,height;

private ChessModel cm;

MainPanel(ChessModel mm){

cm=mm;

width=cm.getWidth();

height=cm.getHeight();

addMouseListener(this);

}

public void setModel(ChessModel mm){

cm = mm;

width = cm.getWidth();

height = cm.getHeight();

}

public void paintComponent(Graphics g){

super.paintComponent(g);

for(int j = 0; j <= height; j++){

for(int i = 0; i <= width; i++){

int v = cm.getarrMapShow()[i][j];

draw(g, i, j, v);

}

}

}

public void draw(Graphics g, int i, int j, int v){ int x = 20 * i+20;

int y = 20 * j+20;

if(i!=width && j!=height){

g.setColor(Color.darkGray);

g.drawRect(x,y,20,20);

}

if(v == 1 ){

g.setColor(Color.gray);

g.drawOval(x-8,y-8,16,16);

g.setColor(Color.black);

g.fillOval(x-8,y-8,16,16);

}

if(v == 2 ){

g.setColor(Color.gray);

g.drawOval(x-8,y-8,16,16);

g.setColor(Color.white);

g.fillOval(x-8,y-8,16,16);

}

if(v ==3){

g.setColor(Color.cyan);

g.drawOval(x-8,y-8,16,16);

}

}

public void mousePressed(MouseEvent evt){ int x = (evt.getX()-10) / 20;

int y = (evt.getY()-10) / 20;

System.out.println(x+" "+y);

if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){

cm.play(x,y);

System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]); repaint();

if(cm.judgeSuccess(x,y,cm.getisOdd())){

cm.showSuccess(this);

evt.consume();

ChessFrame.iscomputer=false;

}

if(ChessFrame.iscomputer&&!cm.getisExist()){

cm.computerDo(cm.getWidth(),cm.getHeight());

repaint();

if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){ cm.showDefeat(this);

evt.consume();

}

}

}

}

public void mouseClicked(MouseEvent evt){}

public void mouseReleased(MouseEvent evt){}

public void mouseEntered(MouseEvent mouseevt){}

public void mouseExited(MouseEvent mouseevent){}

public void mouseDragged(MouseEvent evt){}

public void mouseMoved(MouseEvent moveevt){

int x = (moveevt.getX()-10) / 20;

int y = (moveevt.getY()-10) / 20;

cm.readyplay(x,y);

repaint();

}

}

更多相关推荐:
五子棋-课程设计报告

五子棋-课程设计报告单位分院(系)专业学号学生姓名指导教师完成日期20xx年05月日摘要五子棋的历史:五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。容易上手…

五子棋游戏 课程设计报告(含源代码可以运行)

五子棋游戏课程设计报告(含源代码可以运行)目录第一章需求分析.11.1总体分析.11.2初始化.11.3主循环控制模块.11.4玩家下子.11.5盘面分析填写棋型表.21.6对方下子.21.7胜负判断.2第二章…

C语言图形五子棋课程设计报告

北京师范大学C语言课程设计报告课题名称:游戏五子棋指导教师:课题组员:院系:信息科学与技术时间:20##.3.15-20##.4.20摘要五子棋是一种两人对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上…

《C++语言程序设计》课程设计报告--五子棋

C语言程序设计课程设计报告课程题目年级专业学号姓名指导教师江苏师范大学数学与统计学院摘要五子棋是我国古代的传统的黑白棋种之一五子棋不仅能增强思维能力提高智力而且富含哲理有助于修身养性本游戏是以C语言作为开发工具...

20xx年C语言五子棋课程设计报告

本科控制软件设计课程设计题目五子棋学院计信院专业自动化年级学号姓名谯平同组人张健李益指导教师黄仁杰20xx年9月6日1目录1设计简介32设计模块3小组分工4流程图5设计过程6调试过程7分析与总结8源程序4445...

c++五子棋课程设计报告

福建农林大学计算机与信息学院课程设计报告课程名称课程设计题目姓名系专业年级学号指导教师职称面向对象程序设计课程设计五子棋计算机软件工程年月日福建农林大学计算机与信息学院计算机类课程设计报告结果评定2目录1设计目...

五子棋JAVA语言课程设计报告

封面Java语言程序设计课程设计报告分院电信分院班级电子商务1班姓名何芳林学号20xx0210460123指导教师吴军良课设时间20xx1220至20xx1231二O一一年十二月二十日10电商1班何芳林Java...

java课程设计_五子棋(附源代码)

课程设计报告20xx20xx年度第二学期科目业面向对象课程设计网络工程董志文13级2班1308020xx7江涛专学生姓名班学级号指导教师完成日期永磁同步电机双环调速系统的仿真研究目录1概述311课程设计目的31...

Java课程设计报告

烟台工程职业技术学院系专业级课程设计论文题目Java五子棋游戏设计姓名学号指导教师签名二一零年七月十二日Java五子棋游戏设计xxx摘要五子棋游戏大家都比较熟悉且老少皆宜我个人也很喜欢五子棋游戏易学易操作使用J...

MFC-C++五子棋课程设计报告

windows程序设计课程设计报告学院系班级学生姓名学号指导教师时间从20xx年1月18日到20xx年1月22日摘要1能够利用所学的基本知识设计一个简单的五子棋序具有以下功能数据结构的设计五子棋棋盘的绘制人机下...

JAVA语言课程设计报告 五子棋源代码

浙江科技学院经济管理学院JAVA语言课程设计报告选题名称五子棋小游戏学生学号专业班级学生姓名学生成绩指导教师朱军工作时间20xx0627目录1选题简介32需求分析321系统要实现的目标分析322对输入输出数据及...

C++课程设计说明书(五子棋)

课程设计说明书五子棋游戏TheGameofGobang学院名称机械工程学院专业班级测控10xx学生姓名江x指导教师姓名张xx指导教师职称副教授20xx年6月目录第一章需求分析511系统概述5111概述512系统...

五子棋课程设计报告(33篇)