开发思路

调用applet类作为父类。在init事件中调用Qipan类,作出panel,上加控制用控件。在paint事件里调用drawline函数画棋盘,注册鼠标动作。鼠标单击位置上用drawoval画出棋子,

事件处理过程

A。重新开始

B。选择尺寸

C。悔棋事件

D。前进事件

有三个文件Weiqi.java,Qizi.java,Qipan.java

weiqi.java

//Weiqi.java

import java.awt.*;

import java.awt.event.*;

import java.applet.*;

import sunw.util.Eventlistener;

class Weiqi extends applet

{

Qipan qipan;

public void init()

{//初始化外观

qipan=new Qipan();

setLayout(new BorderLayout());

setSize(qipan.getsize());

add(qipan,"Center");

}

public int getWidth();//得到宽数值

{

return qipan.getWidth();

}

public int getHeight();//得到高数值

{

return qipan.getHeight();

}

public static void main(string[] args)

{

Frame f=new Frame("Weiqi"); //棋盘设置

f.setResizable(false);

f.setLayout(new BorderLayout());

Weiqi weiqi=new Weiqi();//开始下棋程序

weiqi.init();

weiqi.start();

f.setSize(weiqi.getWidth(),20+weiqi.getHeight());//棋盘设置

f.add(weiqi,"Center");

f.setVisible(true);

}}

Qizi.java

//Qizi.java

//取得黑白子的位置

public class Qizi

{

public static int_black=0,_white=1;

protected int x,y;

protected int color;

public Qizi(int i,int j,int c)

{

x=i;

y=j;

color=c;

}

public String toString()

{//

String c=(color==_black?"black":"white");

return "["+x+","+y+"]:"+c;

}

}

Qipan.java

//Qipan.java

import java.awt.*;

import java.awt.event.*;

import java.util.*;

//***************************************************************

class Qipan extends Panel

{

public static final int _rectlen=22,_rectnum=19;

//默认的方格长度及数目

protected Vector qizis;

//保存所有已下的棋子,包括在棋盘上的所有棋子和被提掉的

//若某一次落子没有造成提子,则Vector qizis中保存的就是这个棋子

//若某一次落子造成了提子,则Vector qizis中保存的就是一的Vector,

//这个Vector中包括所有被这个棋子提掉的棋子及这个棋子本身,

//这个棋子本身位于这个Vector的最后

protected int num; //已下数目

protected int currentTurn; //轮到谁下

protected int rectnum,rectlen; //方格长度及数目

protected int qizilen; //棋子的直径

protected Qizi[][] map; //在棋盘上的所有棋子

protected Image offscreen;

protected Graphics offg;

protected int size; //棋盘的宽度及高度

protected int top,left; //棋盘左边及上边的边距

protected Point mouseLoc; //鼠标的位置,即map数组中的下标

//*********************************************************

protected ControlPanel controlPanel; //控制面板

public int getWidth()

{

return size+controlPanel.getWidth()+35;

}

public int getHeight()

{

return size;

}

//********************************************************

public Qipan()

{//棋盘外观

top=left=20;

rectnum=_rectnum;

rectlen=_rectlen;

qizilen=rectlen*9/10;

size=2*left+rectnum*rectlen;

//********************************************************

addMouseListener(new ML());

addMouseMotionListener(new MML());

//********************************************************

setLayout(new BorderLayout() );

controlPanel=new ControlPanel();

setSize(getWidth(),size);

add(controlPanel,"East");

setSize(getWidth(),size);

add(controlPanel,"East");

//初始化

start();

}

public void addNotify()

{

super.addNotify();

offscreen=createImage(size,size);

offg=offscreen.getGraphics();

}

public void paint(Graphics g)

{

offg.setColor(new Color(180,150,100) );

offg.fillRect(0,0,size,size);

//******************画出棋盘格子***************************

offg.setColor(Color.black);

for(int i=0;i

{

int x1=left+i*rectlen;

int x2=x1;

int y1=top;

int y2=top+rectnum*rectlen;

offg.drawline(x1,y1,x2,y2);

//*********************************************************

x1=left;

x2=left+rectnum*rectlen;

y1=top+i*rectlen;

y2=y1;

offg.drawLine(x1,y1,x2,y2);

}

//*********************画出棋子****************************

for(int i=0;i

for(int j=0;j

{

if(map[i][j]==null)

continue;

offg.setColor(map[i][j].color==Qizi._black?Color.black:Color.white);

offg.fillOval(left+i*rectlen-qizilen/2,top+j*rectlen-qizilen/2,

qizilen,qizilen);

}

//************画出鼠标的位置,即下一步将要下的位置**********

if(mouseLoc!=null)

{

offg.setColor(currentTurn==Qizi._black?Color.gray:

newColor(200,200,250) );

offg.fillOval(left+mouseLoc.x*rectlen-qizilen/2,

top+mouseLoc.y*rectlen-qizilen/2,

qizilen,qizilen);

}

//**************画面画出****************************

g.drawImage(offscreen,0,0,this);

}

public void update(Graphics g)

{//更新

paint(g);

}

//*********************************************************

class ML extends MouseAdapter

{ //放一颗棋子

public void mousePressed(MouseEvent evt)

{

int xoff=left/2;

int yoff=top/2;

int x=(evt.getX()-xoff)/rectlen;

int y=(evt.getY()-yoff)/rectlen;

if(x<0 || x>rectnum || y<0 || y>rectnum)

return;

if(map[x][y]!=null)

return;

//**************清除多余的棋子*************************

if(num

{

int size=qizis.size();

for(int i=size-1;i>=num;i--)

qizis.removeElementAt(i);

}

//*******************************************************

Qizi qizi=new Qizi(x,y,currentTurn);

map[x][y]=qizi;

//********************************************************

qizis.addElement(qizi);

num++;

if(currentTurn==Qizi._black)

currentTurn=Qizi._white;

else

currentTurn=Qizi._black;

//*****************判断在[x,y]落子后,是否可以提掉对方的子

tizi(x,y);

//******************判断是否挤死了自己,若是则已落的子无效

if(allDead(qizi).size()!=0)

{

map[x][y]=null;

repaint();

controlPanel.setMsg("挤死自己");

//***********************back***************************

qizis.removeElement(qizi);

num--;

if(currentTurn==Qizi._black)

currentTurn=Qizi._white;

else

currentTurn=Qizi._black;

return;

}

mouseLoc=null;

//更新控制面板

controlPanel.setLabel();

}

public void mouseExited(MouseEvent evt)

{//鼠标退出时,清除将要落子的位置

mouseLoc=null;

repaint();

}

}

private class MML extends MouseMotionAdapter

{//取得将要落子的位置

public void mouseMoved(MouseEvent evt)

{

int xoff=left/2;

int yoff=top/2;

int x=(evt.getX()-xoff)/rectlen;

int y=(evt.getY()-yoff)/rectlen;

if(x<0 || x>rectnum || y<0 || y>rectnum)

return;

if(map[x][y]!=null)

return;

mouseLoc=new Point(x,y);

repaint();

}

}

//**********判断在[x,y]落子后,是否可以提掉对方的子***********

public static int[] xdir={0,0,1,-1};

public static int[] ydir={1,-1,0,0};

public void tizi(int x,int y)

{

Qizi qizi;

if( (qizi=map[x][y])==null)

return;

int color=qizi.color;

//***************取得qizi四周围的几个子*****************

Vector v=around(qizi);

for(int l=0;l

{

Qizi q=(Qizi)(v.elementAt(l) );

if(q.color==color)

continue;

//*****************若颜色不同,取得和q连在一起的所有已死的子。

//若没有已死的子则返回一个空的Vector

Vector dead=allDead(q);

//移去所有已死的子

removeAll(dead);

//**********若造成提子,则保存所有被提掉的棋子*************

if(dead.size()!=0)

{

Object obj=qizis.elementAt(num-1);

if(obj instanceof Qizi)

{

qizi=(Qizi)(qizis.elementAt(num-1));

dead.addElement(qizi);

}else

{

Vector vector=(Vector)obj;

for(int i=0;i

dead.addElement(vector.elementAt(i) );

}

//更新Vector qizis中的第num个元素

qizis.setElementAt(dead,num-1);

}

}

repaint();

}

public boolean sideByBlank(Qizi qizi)

{//判断qizi周围是否有空白

for(int l=0;l

{

int xl=qizi.x+xdir[l];

int yl=qizi.y+ydir[l];

if(xl<0 || xl>rectnum || yl>rectnum)

continue;

if(map[xl][yl]==null)

return true;

}

return false;

}

//*************取得qizi四周围的几个子*****************

public Vector around(Qizi qizi)

{

Vector v=new Vector();

for(int l=0;l

{

int xl=qizi.x+xdir[l];

int yl=qizi.y+ydir[l];

if(xl<0 || xl>rectnum || yl<0 || yl>rectnum || map[xl][yl]==null)

continue;

v.addElement(map[xl][yl]);

}

return v;

}

//取得和q连在一起的所有已死的人,

//若没有已死的子则返回一个空的Vector

public Vector allDead(Qizi q)

{

Vector v=new Vector();

v.addElement(q);

int count=0;

while(true)

{

int origsize=v.size();

for(int i=count;i

{

Qizi qizi=(Qizi)(v.elementAt(i) );

if(sideByBlank(qizi) )

return new Vector();

Vector around=around(qizi);

for(int j=0;j

{

Qizi a=(Qizi)(around.elementAt(j) );

if(a.color!=qizi.color)

continue;

if(v.indexOf(a)<0)

v.addElement(a);

}

}

if(origsize==v.size())

break;

else

count=origsize;

}

return v;

}

//从棋盘上移去Vector v中棋子

public void removeAll(Vector v)

{

for(int i=0;i

{

Qizi q=(Qizi)(v.elementAt(i) );

map[q.x][q.y]=null;

}

//*******************悔棋**********************

public void back()

{

if(num==0)

{

controlPanel.setMsg("无子可悔");

return;

}

Object obj=qizis.elementAt(--num);

if(obj instanceof Qizi)

{

Qizi qizi=(Qizi)obj;

map[qizi.x][qizi.y]=null;

currentTurn=qizi.color;

}else

{

Vector v=(Vector)obj;

for(int i=0;i

{

Qizi q=(Qizi)(v.elementAt(i) );

if(i==v.size()-1)

{

map[q.x][q.y]=null;

int index=qizis.indexOf(v);

qizis.setElementAt(q,index);

currentTurn=q.color;

}else

{

map[q.x][q.y]=q;

}

}

}

controlPanel.setLabel();

repaint();

}

//***********悔棋后再次前进*************

public void forward()

{

if(num==qizis.size())

{

controlPanel.setMsg("不能前进");

return;

}

Object obj=qizis.elementAt(num++);

Qizi qizi;

if(obj instanceof Qizi)

{

qizi=(Qizi)(obj);

map[qizi.x][qizi.y]=qizi;

}else

{

Vector v=(Vector)obj;

qizi=(Qizi)(v.elementAt(v.size()-1) );

map[qizi.x][qizi.y]=qizi;

}

if(qizi.color==Qizi._black)

currentTurn=Qizi._white;

else

currentTurn=Qizi._black;

tizi(qizi.x,qizi.y);

controlPanel.setLabel();

repaint();

}

//**************重新开始游戏****************

public void start()

{

qizis=new Vector();

num=0;

map=new Qizi[rectnum+1][rectnum+1];

currentTurn=Qizi._black;

controlPanel.setLabel();

repaint();

}

//*****************控制面板类***************

class ControlPanel extends Panel

{

protected Label lblTurn=new Label("",Label.CENTER);

protected Label lblNum=new Label("",Label.CENTER);

protected Label lblMsg=new Label("",Label.CENTER);

protected Choice choice=new Choice();

protected Button back=new Button("<< 悔棋");

protected Button forward=new Button("前进>>");

protected Button start=new Button("重新开始");

//********************************************

public int getWidth()

{

return 45;

}

public int getHeight()

{

return size;

}

//******************选择棋盘的大小******************

public ControlPanel()

{

setSize(this.getWidth(),this.getHeight());

setLayout(new GridLayout(12,1,0,10));

setLabel();

choice.add("19 X 19");

choice.add("15 X 15");

choice.add("13 X 13");

choice.add("11 X 11");

choice.add("7 X 7");

choice.addItemListener(new IL());

add(lblTurn);

add(lblNum);

add(start);

add(choice);

add(lblMsg);

add(back);

add(forward);

back.addActionListener(new AL());

forward.addActionListener(new AL());

start.addActionListener(new AL());

setBackground(new Color(120,120,200));

}

public Insets getInsets()

{

return new Insets(5,5,5,5);

}

private class AL implements ActionListener

{//悔棋与前进

public void actionPerformed(ActionEvent evt)

{

if(evt.getSource()==back)

Qipan.this.back();

else if(evt.getSource()==forward)

Qipan.this.forward();

else if(evt.getSource()==start)

Qipan.this.start();

}

}

private class IL implements ItemListener

{//下棋动作

public void itemStateChanged(ItemEvent evt)

{

String s=(String)(evt.getItem());

int rects=Integer.parseInt(s.substring(0,2).trim() );

if(rects!=Qipan.this.rectnum)

{

Qipan.this.rectlen=(_rectlen*_rectnum)/rects;

Qipan.this.qizilen=rectlen*9/10;

Qipan.this.rectnum=rects;

Qipan.this.start();

}

}

}

public void setLabel()

{//标签待下方的颜色与步数

lblTurn.setText(Qipan.this.currentTurn==Qizi._black?"黑 方":"白 方");

lblTurn.setForeground(Qipan.this.currentTurn==Qizi._black?Color.black:

Color.white);

lblNum.setText("第"+(Qipan.this.num+1)+"手");

lblNum.setForeground(Qipan.this.currentTurn==Qizi._black?Color.black:

Color.white);

lblMsg.setText("");

}

public void setMsg(String msg)

{

lblMsg.setText(msg);//提示信息

}

}

}

java写的围棋游戏小程序_java写的围棋游戏小程序相关推荐

  1. Java猜数游戏怎么验证_Java实现猜数游戏

    利用Math.random()方法产生1~100的随机整数,利用JOptionPane.showInputDialog()方法产生一个输入对话框,用户可以输入所猜的数.若所猜的数比随机生成的数大,则显 ...

  2. java项目如何直接在桌面运行_java项目制作成可安装exe程序

    java项目制作成可安装exe程序 文章目录 java项目制作成可安装exe程序 1.制作可安装的exe程序步骤 2. IDEA项目导出jar包 2.1. 打开project Structure 2. ...

  3. java台球游戏设计原理_Java实现简单台球游戏

    Java实现简单台球桌问题,供大家参考,具体内容如下 需求: 使小球可以在桌面上移动,移动到桌面边缘将被弹回,显示小区的移动 素材: 小球照片 桌球照片 程序源代码: package 桌球游戏; im ...

  4. java打字游戏课程设计_java课程设计打字游戏

    <java课程设计打字游戏>由会员分享,可在线阅读,更多相关<java课程设计打字游戏(32页珍藏版)>请在金锄头文库上搜索. 1.Java 课程设计 1各专业全套优秀毕业设计 ...

  5. java中抽牌程序_Java—— 随机抽取扑克牌游戏

    /* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作    者:李晓凯 * 完成日期:2015年 ...

  6. java 数字转换开发票大写格式_Java数字转大写金额格式小程序代码

    今天看到可以用toCharArray()可以将字符串转换成数组,跟switch结合做个数字转中文大写金额格式的Java小程序,思路也很简单,全篇用switch.由于是字符串,无需担心输入数字过大,可以 ...

  7. java猜拳程序_Java基础之:猜拳小程序

    /** 有个人 小范 设计他的成员变量. 成员方法, 可以电脑猜拳. 电脑每次都会随机生成 0, 1, 2 0 表示 石头 1 表示剪刀 2 表示 布 并要可以显示 小范 的输赢次数(清单), 假定 ...

  8. 发扑克牌java程序_Java实现简易扑克牌游戏

    功能描述 1.创建扑克牌.包括四种花色(黑桃,红心,梅花,方块),十三种点数(2-10,J,Q,K),不考虑大小王. 2.创建两个玩家.包括玩家id.姓名.手牌等集合,手牌为扑克牌的集合. 3.洗牌. ...

  9. java游戏贪吃蛇_Java实现贪吃蛇游戏

    最近JAVA和JSwing上手练习了一下贪吃蛇,供大家参考,具体内容如下 欢迎交流和加入新的内容 用到了JSwing,下面是一些具体的思路 实现 * 蛇: 采用单链表记录首尾,整个蛇被分为lattic ...

最新文章

  1. Facial Landmark Detection(人脸特征点检测)
  2. 折腾的人生......
  3. 数据结构之希尔排序------java实现
  4. jzoj3682-Points and Segments【模型转化,欧拉回路】
  5. 论文浅尝 - ISWC2020 | KnowlyBERT: 知识图谱结合语言模型补全图谱查询
  6. [Unity] Canvas 设置为 Screen Space - Camera 时,UI 被场景物体遮挡的解决办法:设置 Canvas 的 Plane Distance 为一个较小的数
  7. ThingJS平台制作第一人称视角下的巡更效果
  8. 老板催你交圣诞海报设计?PSD源文件素材,直接编辑
  9. 台湾大学生来厦门参访交流
  10. OSPF NSSA区域路由的计算过程与FA值实验
  11. [Windows API] Listing the Files in a Directory,可用来数文件夹下有多少个子文件(夹)...
  12. DXperience 9.1.3
  13. 珠海实验室通风系统建设安装说明
  14. Tickeys -- 找对打字的感觉 (机械键盘音效软件)
  15. 基于PaddleOCR银行卡识别实现(二)
  16. GYM 101128 H.Sheldon Numbers(枚举)
  17. 读研不要钱?就业可定向推荐?国防科大计算机学院yyds
  18. impala 源码级别优化
  19. 运用PyPDF2模块,解密PDF文件
  20. 连续忙碌了好一阵,太想出去透透气了,最近有假想去湖南玩玩,不知道有哪些好玩的景点?有哪些旅游线路推荐?~在线等哦

热门文章

  1. 纯小白尝试TensorFlow篇一:组装电脑
  2. PhotonServer
  3. CodeForces - 719A Vitya in the Countryside(暴力)
  4. linux让程序在gpu上运行,在Linux上,使RX 480与AMDGPU一起运行
  5. java mvc jquery weui_jquery weui做的三级联动
  6. java数据字典开发实例,实战解析
  7. 【MATLAB】绘制向量场
  8. Python游戏汇总:三十个pygame游戏代码
  9. 关于Android市场这件事,没有饱和的市场只有饱和的思维
  10. 前端市场真的饱和了吗?