五子棋总结
总结错误:
1、绘制UI时的错误
(1)将面板添加到窗体上时需写在面板属性的后面。
(2)空件及组件需写在可见之前。
(3)绘制棋盘时,重绘,画笔
//在面板上画线
public void paintBoard(Graphics g){
//super.paint(g);不能绘制窗体本身
for(int i=1;i<=10;i++){
g.drawLine(50,50*i, 450, 50*i);
for(int j=1;j<9;j++){
g.drawLine(50*i, 50, 50*i, 500);
}
设置全局变量
<pre name="code" class="java">//创建全局的画笔
Graphics g = null;
//创建面板对象 功能的实现
JPanel boardPanel=new JPanel(){
//当窗体改变时重绘
public void paint(Graphics g){
super.paint(g);
//绘制棋盘
paintBoard(g);
//绘制已经下过的棋子
for(int i=0;i<list.size()/3;i++){
int x=(int) list.get(3*i);
int y=(int) list.get(3*i+1);
Color color=(Color) list.get(3*i+2);
//重画棋子
g.setColor(color);
g.fillOval(x, y, 30, 30);
}
}
};
//棋盘面板获取画笔
g=boardPanel.getGraphics();
2、事件监听
(1)按钮监听
给关于按钮添加监听时需写在它本身的方法中,如果写在鼠标监听中则会出现不能关闭的错误。
});
//给关于按钮添加监听
about.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//flagabout=false;
if(flagabout){
JOptionPane.showMessageDialog(FiveChess.this, "你是猪吗?");
}
}})
(2)鼠标监听
MouseListener mouselistener=new MouseListener(){
public void mouseClicked(MouseEvent e) {
if(flagbegin){
//下棋子
int x=e.getX();
int y=e.getY();
//距离鼠标单击点最近的交叉点下棋
for(int i=0;i<=10;i++){//横线
for(int j=0;j<=9;j++){//竖线
//所有交叉点通式
//int x0 = 50*(j-1);
//int y0 = 50*(i-1);
int x0 = 50*(j+1);
int y0 = 50*(i+1);
//判断 单击点是否在误差范围内 误差范围为50/3
if((x>x0-50/3&&x<x0+50/3&&y>y0-50/3&&y<y0+50/3)){
//list获得棋子的坐标,保存到list中;
list.add(x0-15);
list.add(y0-15);
//判断该交叉点是否有棋子
// if(flagregret){
// chesses[i][j]=0;cc
// flagregret = false;
// }
if(flagagain)
for(int i1=0;i1<100;i1++){
{
chesses[i][j]=0;
//flagagain=false;
}}
if(chesses[i][j]==0){//没有棋子
//区分颜色
if(flagregret==true){
System.out.println("++++++");
g.setColor(color);//存储删除后的棋子的颜色
list.add(color);
//chesses[i][j]=q;
flagregret=false;
}
else if(flagColor == true){
//保存的颜色,将颜色存入list
list.add(Color.black);
//改变画布的颜色
g.setColor(Color.black);
chesses[i][j] = 1;//黑色
flagColor = false;
}
else if(flagColor == false){
//保存的颜色,将颜色存入list
list.add(Color.white);
//改变画布的颜色
g.setColor(Color.white);
chesses[i][j] = 2;//白色
flagColor = true;
}
//以x,y为圆心画填充圆
g.fillOval(x0-15,y0-15,30,30);
//判断输赢
win(i,j);
//list获得棋子的坐标;
//list.add(arg0);
}
}
}
}
}else{
//显示错误
JOptionPane.showMessageDialog(FiveChess.this, "没有点击开始按钮!");
}
//if(flagabout){
//JOptionPane.showMessageDialog(FiveChess.this, "你是猪吗?");
// }
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}};
//给面板添加鼠标监听
boardPanel.addMouseListener(mouselistener);
//给关于按钮添加鼠标监听
about.addMouseListener(mouselistener);
//给开始按钮添加鼠标监听
begin.addMouseListener(mouselistener);
again.addMouseListener(mouselistener);
运行后的界面
3、判断输赢
(1)定义win方法
(2)调用方法
根据二维数组的下标判断,进行遍历,判断输赢。
//判断输赢
public void win(int i,int j){
int count=1;
int m=1;
//判断横向向右下
while(j-m>=0&&chesses[i][j]==chesses[i][j-m]){
m++;
count++;
}
m=1;
//判断横向向左下
while(j+m<10&&chesses[i][j]==chesses[i][j+m]){
m++;
count++;
}
//判断纵向向下下
while(i-m>0&&chesses[i][j]==chesses[i-m][j]){
m++;
count++;
}
m=1;
//判断纵向向上下
while(i+m<10&&chesses[i][j]==chesses[i+m][j]){
m++;
count++;
}
//往左上角下
while(i+m<10&&j-m>=0&&chesses[i][j]==chesses[i+m][j-m]){
m++;
count++;
}
m=1;
//往左下角下
while(i-m>=0&&j-m>=0&&chesses[i][j]==chesses[i-m][j-m]){
m++;
count++;
}
//往右上角下
while(i+m<10&&j+m<10&&chesses[i][j]==chesses[i+m][j+m]){
m++;
count++;
}
m=1;
//往右下角下
while(i-m>=0&&j+m<10&&chesses[i][j]==chesses[i-m][j+m]){
m++;
count++;
}
//黑棋胜
if(count>=5&&chesses[i][j]==1){
//弹出提示框
JOptionPane.showMessageDialog(this, "黑棋胜");
}
//白棋胜
if(count>=5&&chesses[i][j]==2){
//弹出提示框
JOptionPane.showMessageDialog(this, "白棋胜");
}
}
4、悔棋、重来,对链表中的元素进行删除,根据链表的位置,判断i,j值,判断棋子的位置,将二维数组的标记置零。
//给悔其按钮添加监听
regret.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// 从list中删除一个棋子(三个元素)
Color color=(Color)list.get(list.size()-1);
int x0 = (Integer)list.get(list.size()-2);
int y0 = (Integer)list.get(list.size()-3);
chesses[x0/50][y0/50] = 0;
//chesses[x0/50][y0/50]=q;
list.remove(list.size()-1);
list.remove(list.size()-1);
list.remove(list.size()-1);
flagregret= true;
//强制刷新窗体 执行paint方法
repaint();
}
});