/*五子棋背景知识
相传我们的祖先轩辕黄帝无意之中画下了十七条横线十条竖线,这无意中的发明造就出了五子棋。
五子棋盘是方形的,由纵横各15条线组成。15╳15形成了225个交叉点。
五子棋的棋子分为黑白两色,黑子113枚,白子112枚,黑白子加起来是225枚,恰好和棋盘的点数相同。
早在公元595年古人就用瓷来烧制五子棋盘了,五子棋盘中间一点成为天元,四周的四点叫做星。*/
//设计思路:设置二维数组win[15][15] 其中每个值对应棋盘的相应点 如果是黑棋 值为1 如果是白棋值为-1 如果没棋子 值为0
// 这种方法便于判断胜负 无论是从行、从列、从左上到右下、从右上到坐下 取各直线上紧挨的五个win[i][j]值
// 若均为1 则黑方胜利,若均为-1 则白方胜 否则若超过棋盘还分不处胜负则平局 这要用到两重循环
//声明:这一思路是我从Baidu上查来的 如有雷同 绝非巧合
//具体程序如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.border.*;
import javax.swing.JOptionPane;
public class MyGobang
{
public static void main(String[] args)
{
GameFrame frame = new GameFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
class GameFrame extends JFrame
{
public GameFrame()
{
//设置窗口标题栏的文字
setTitle("我的五子棋");
//设置窗口的大小
setSize(width,height);
//设置图标
Toolkit tk=Toolkit.getDefaultToolkit();
Image img=tk.getImage("icon.jpg");
setIconImage(img);
//类java.awt.Dimension将组件的宽、高封装在单个对象中
//得到屏幕大小 Java提供了一个ToolKit类 他的getScreenSize方法可以获得屏幕尺寸
Dimension screenSize=tk.getScreenSize();
int screenHeight=screenSize.height;
int screenWidth=screenSize.width;
//设置框架显示位置
int x=(screenWidth-width)/2;
int y=(screenHeight-height)/2;
setLocation(x,y);
//设置框架大小可变
setVisible(true);
//创建面板
PaintPanel panel=new PaintPanel();
//创建面板的边界
Border titled=BorderFactory.createTitledBorder(BorderFactory.createMatteBorder(5,5,5,5,Color.orange),"我的棋盘");
panel.setBorder(titled);
//得到JFrame的内容窗格对象
Container contentPane=getContentPane();
//将组件加入到内容窗格中
contentPane.add(panel);
//心得:上两行语句也可写为:getContentPane().add(panel);
}
public static final int width=900;
public static final int height=600;
}
class PaintPanel extends JPanel
{
//用于存储Ellipse2D型数据的列表 Items.size()表示目前所下棋子数目
ArrayList Items=new ArrayList();
public PaintPanel()
{
//setLayout(new BorderLayout());
setLayout(new FlowLayout(FlowLayout.LEFT));
//上面这条语句用来设定所有组件的排列方式
//添加文本域
ButtonPanel_1 buttonPanel_1=new ButtonPanel_1();
//添加按钮面板
ButtonPanel buttonPanel = new ButtonPanel();
add(buttonPanel_1,BorderLayout.NORTH);
add(buttonPanel,BorderLayout.SOUTH);
//添加鼠标监听器
addMouseListener(new MouseHandler());//用于监听鼠标单击事件 以便记录下的步数
addMouseMotionListener(new MouseMotionHandler());//用于监听鼠标的移动事件 以便显示鼠标当前位置
//获取装饰图像文件 嘿 用我比较喜欢的卡通围棋高手"进藤光"吧
image1=Toolkit.getDefaultToolkit().getImage("icon1.jpg");
//用于设置棋盘背景 想找张和棋盘一样大的图片作为棋盘背景 可惜没有好看的 而且怕影响效果 先留着 以后遇到合适的再加进来
//image2=Toolkit.getDefaultToolkit().getImage("icon2.jpg");
MediaTracker tracker=new MediaTracker(this);
tracker.addImage(image1,1);
//tracker.addImage(image2,2);
try
{
tracker.waitForID(1);
//tracker.waitForID(2);
}
catch(InterruptedException exception)
{}
//添加按钮
JButton yellow = new JButton("橙色");
add(yellow);
JButton gray = new JButton("灰色");
add(gray);
yellowground listenery=new yellowground();
yellow.addMouseListener(listenery);
grayground listenerg=new grayground();
gray.addMouseListener(listenerg);
}
private class yellowground extends MouseAdapter
{
public void mouseClicked(MouseEvent event)
{
setBackground(Color.orange);
}
}
private class grayground extends MouseAdapter
{
public void mouseClicked(MouseEvent event)
{
setBackground(Color.gray);
}
}
public void paintComponent(Graphics g) //绘画
{
super.paintComponent(g);
//设置鼠标形状为手形
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
//设置字体属性
Font s=new Font("宋体",Font.BOLD,17);
g.setFont(s);
String Mytext="点击 |重新开始| 和 |悔棋| 系统反应会比较慢 请耐心等待";
g.drawString(Mytext,55,520);
if(mousex<=480&&mousex>=60&&mousey<=490&&mousey>=70)
{
n=((mousex+15)/30*30-60)/30+1;
m=((mousey+35)/30*30-20-70)/30+1;
String text=" 当前棋盘位置 第"+(int)m+"行:第"+(int)n+"列";
g.drawString(text,540,50);
}
else
{
String text="鼠标不在棋盘内";
g.drawString(text,600,50);
}
//显示图片
g.drawImage(image1,500,80,null);
//g.drawImage(image2,100,50,null);
Graphics2D g2 = (Graphics2D)g;
for(int i=0; i<15; i++)
{
//画行
g2.draw(new Line2D.Double(startX, startY+30*i, startX+420, startY+30*i));
//画列
g2.draw(new Line2D.Double(startX+30*i, startY, startX+30*i, startY+420));
}
//绘画棋盘上的"天元"和"星"
g2.setColor(Color.gray);
Ellipse2D smallellipse1=new Ellipse2D.Double();
Ellipse2D smallellipse2=new Ellipse2D.Double();
Ellipse2D smallellipse3=new Ellipse2D.Double();
Ellipse2D smallellipse4=new Ellipse2D.Double();
Ellipse2D smallellipse5=new Ellipse2D.Double();
smallellipse1.setFrameFromCenter(startX+90, startY+90, startX+90+5, startY+90+5);//左上
smallellipse2.setFrameFromCenter(startX+330,startY+90, startX+330+5,startY+90+5);//右上
smallellipse3.setFrameFromCenter(startX+210,startY+210,startX+210+5,startY+210+5);//中间
smallellipse4.setFrameFromCenter(startX+90, startY+330,startX+90+5, startY+330+5);//坐下
smallellipse5.setFrameFromCenter(startX+330,startY+330,startX+330+5, startY+330+5);//右下
g2.fill(smallellipse1);
g2.fill(smallellipse2);
g2.fill(smallellipse3);
g2.fill(smallellipse4);
g2.fill(smallellipse5);
//设置此变量可实现黑白方轮流下棋
boolean isMy = false;
for(int i=0; i<Items.size(); i++) //每一次鼠标单击都会使前面的棋子重新绘制
{
//先下黑棋 然后白棋 依次循环
isMy = !isMy;
if(isMy)
g2.setColor(Color.BLACK);
else
g2.setColor(Color.WHITE);
java五子棋 可悔棋
4星 · 超过85%的资源 需积分: 50 158 浏览量
2008-09-09
15:05:27
上传
评论 4
收藏 110KB RAR 举报
lihanyuan2008
- 粉丝: 0
- 资源: 4