题目要求:
1.定义一个五子棋的棋盘。五子棋棋盘含有宽w,高h,行数r,列数c和边距align,网格为正方形宽和高都为size,画棋盘的方法public void paint(Griphics g)。
2.定义一个中国象棋的棋盘。象棋棋盘含有与五子棋相同的属性,画棋盘的方法名称相同,但算法不同。
3.设计一个抽象类Board,设计两个子类五子棋类(RenjuBoard)和中国象棋类(ChineseChessBoard)。
4.主窗体通过菜单选择,可以在窗体内实现对应棋盘。
效果如下:
代码如下:
1. 定义抽象类。
package abstractChess;
import java.awt.Graphics;
public abstract class Board {
int w, h;// 宽和高,用像素为单位。
int c, r;// //列和行,列的线条和行的线条数用正整数表示。
int align;// 边距
int size;// 网格间距,网格距离窗体的距离
public abstract void paint(Graphics g);
}
2.五子棋棋盘
package abstractChess;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class RenjuBoard extends Board {
public RenjuBoard()// 无参构造函数
{
this.w = 0;
this.h = 0;
this.c = 0;
this.r = 0;
}
public RenjuBoard(int w, int h, int c, int r)// 有宽、高、列和行的构造函数
{
this.w = w;
this.h = w;
this.c = c;
this.r = r;
}
public RenjuBoard(int w, int h)// 只有宽和高数的构造函数
{
this(0, 0, 15, 15);
this.w = w;
this.h = h;
}
public void paint(Graphics g) {
align = 100;//棋盘距离窗体的网格距离
size = (w - 2 * align) / (c - 1);// 每一列的平均宽度
for (int y = 1; y < r-1; y++)// 划横线。留下四周边界不画
{
g.drawLine(0 + align, y * size + align, align + (c - 1) * size, y
* size + align);
}
for (int x = 1; x < c-1; x++)// 划纵线。留下四周边界不画
{
g.drawLine(x * size + align, 0 + align, x * size + align, align
+ (r - 1) * size);
}
// 设置四周边线为粗线
float lineWidth = 3.0f;
((Graphics2D) g).setStroke(new BasicStroke(lineWidth));
//划边界四周
g.drawLine(align, align, size * (c - 1) + align, align);
g.drawLine(align, size * (r-1) + align,size * (c - 1) + align, (r-1) * size+ align);
g.drawLine(align, align, align, (r-1) * size + align);
g.drawLine(align + size * (c - 1), align,align + size * (c - 1), (r-1) * size + align);
}
}