最近闲来无事,继续完成之前一直想做的五子棋游戏,有不懂的通过看视频基本完成,大致记录一下,如有问题,请多多指教。
知识点:
Swing的概述:
Swing是在java的基础图形化用户界面AWT的基础上扩展的API集;
- Swing编程
- ImageIO的使用
- 图片的绘制
Swing的功能:通过java代码编写窗口程序,创建图形化用户界面(GUI);
Swing可以创建窗体、面版,在窗口中导入或绘制图片,或输入文本信息,结合java的JDBC和/或IO操作可以实现数据的保存。
JFrame是创建窗体的swing类,用来创建一个图形界面的原始窗口,并设置其大小、位置等属性,是swing编程的基础类之一。
JOptionPane
MouseListener
Graphics//类似画笔
游戏功能:
- 在点击鼠标时,可以在相应的位置显示棋子;
- 可以自动判断游戏是否结束,是否黑方或白方已经胜利。
首先,完成游戏界面设置 ,这里通过PS制作了一个背景,然后在其上画线构成棋盘(19*19),并做了标注点。
g.drawImage(imge,0,30, this);
g.setFont(new Font("黑体",Font.BOLD,20));
g.drawString("游戏信息:"+message, 130, 65);//绘制字符串
g.setFont(new Font("宋体",0,18));
g.drawString("黑方时间:无限制", 40, 500);
g.drawString("白方时间:无限制", 275, 500);
//绘制一条线(棋盘)
for(int i=0;i<19;i++) {
g.drawLine(24, 88+20*i, 384, 88+20*i);
g.drawLine(24+20*i, 88, 24+20*i, 448);
}
//标注点位(实心圆)
g.fillOval(82, 146, 4, 4);
g.fillOval(202, 146, 4, 4);
g.fillOval(322, 146, 4, 4);
g.fillOval(82, 266, 4, 4);
g.fillOval(202, 266, 4, 4);
g.fillOval(322, 266, 4, 4);
g.fillOval(82, 386, 4, 4);
g.fillOval(202, 386, 4, 4);
g.fillOval(322, 386, 4, 4);
其次,绘制棋子,需注意棋盘的大小,并且只能在交叉点处落子。
for(int i=0;i<19;i++) {
for(int j=0;j<19;j++) {
if(allchess[i][j]==1) {
//黑子
int tempx=i*20+24;
int tempy=j*20+88;
g.fillOval(tempx-7, tempy-7, 14, 14);
}
if(allchess[i][j]==2) {
//白子
int tempx=i*20+24;
int tempy=j*20+88;
g.setColor(Color.white);
g.fillOval(tempx-7, tempy-7, 14, 14);
g.setColor(Color.black);
g.drawOval(tempx-7, tempy-7, 14, 14);
}
}
}
然后,保存棋局,这里用的是一个二维数组,0表示没有棋子,1表示黑子,2表示白子;并且注意黑白子轮流落子以及原有位置的棋子不能覆盖。
x=e.getX();
y=e.getY();
if(x>=24&&x<=384&&y>=88&&y<=448) {
x=(x-24)/20;
y=(y-88)/20;
if(allchess[x][y]==0) {//不能在原有位置下子
//判断当前需下什么颜色的棋子
if(isblack==true) {
allchess[x][y]=1;
isblack=false;
message="轮到白方";
}
else {
allchess[x][y]=2;
isblack=true;
message="轮到黑方";
}
}else {
JOptionPane.showMessageDialog(this, "当前位置有棋子,请重新落子!");
}
this.repaint();
}
最后,判断胜负(以横向为例)
即横向五个黑子或五个白子为胜(x变y不变)
总共分为四种情况:横向相等,竖向相等,左斜相等,右斜相等,而每种情况需要分为两个部分检查。
private boolean checkwin(){
boolean flag=false;
//横向
int count=1;//保存共有多少相同颜色棋子相连
int value=allchess[x][y];
int i=1;
while(value==allchess[x+i][y]) {
count++;
i++;
}
i=1;
while(value==allchess[x-i][y]) {
count++;
i++;
}
if(count>=5) {
flag=true;
}
return flag;
}
只实现简单功能,也可以再加附加功能,如可以对游戏时间进行设置,判断是否超出规定时间等。