自制单机五子棋

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
public class FiveChess extends JFrame implements MouseListener{
String info = "游戏信息:游戏开始,黑方先行!";
int[][] a = new int[19][19];//a数组用来保存棋子  0表示没有棋子  1表示黑子  2表示白子
int x,y;//保存棋子坐标
int i,j;//保存数组下标
boolean isBlack = true;//true表示黑子  false表示白子
boolean islock = false;//false表示没有锁棋盘  true锁棋盘
BufferedImage img;
public FiveChess(){
try {
img = ImageIO.read(new File("image\\back.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.setSize(500, 500);
this.setResizable(false);//设置窗口大小不可变
this.setTitle("五子棋--单机版");//设置标题
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭
this.setLocationRelativeTo(null);//设置居中
this.setVisible(true);
this.addMouseListener(this);//注册监听
}
public static void main(String[] args) {
new FiveChess();
}

@Override
public void paint(Graphics g) {
//画背景图片
g.drawImage(img, 2, 25, this);
//画棋盘
for(int i=0;i<=18;i++){
g.drawLine(20, 98+i*20, 380, 98+i*20);//横线
g.drawLine(20+i*20, 98, 20+i*20, 458);//竖线
}
//标注特殊点
g.fillOval(200-2, 278-2, 4, 4);//中心点
g.fillOval(100-2, 278-2, 4, 4);//左
g.fillOval(300-2, 278-2, 4, 4);//右
g.fillOval(200-2, 178-2, 4, 4);//上
g.fillOval(200-2, 378-2, 4, 4);//下
g.fillOval(100-2, 178-2, 4, 4);//左上
g.fillOval(300-2, 178-2, 4, 4);//右上
g.fillOval(100-2, 378-2, 4, 4);//左下
g.fillOval(300-2, 378-2, 4, 4);//右下
//画棋子
for(int i = 0;i<=a.length-1;i++){
for(int j = 0;j<=a[i].length-1;j++){
if(a[i][j]==1){
//画黑子(将下标--》坐标)
g.setColor(Color.BLACK);
g.fillOval(i*20+20-7, j*20+98-7, 14, 14);
}else if(a[i][j]==2){
//画白子(将下标--》坐标)
g.setColor(Color.WHITE);
g.fillOval(i*20+20-7, j*20+98-7, 14, 14);
}
}
}
//画游戏信息
g.setFont(new Font("黑体",Font.BOLD,22));//设置画笔字体
g.setColor(Color.WHITE);
g.drawString(info, 84, 482);
g.setColor(Color.BLACK);
g.drawString(info, 85, 483);

}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println(e.getX()+"  "+e.getY());
x = e.getX();
y = e.getY();
if(x>=20&&x<=380&&y>=98&&y<=458){//控制下棋范围
if(islock){
//锁棋盘了
JOptionPane.showMessageDialog(this, "游戏结束,棋盘锁定,请重新开始游戏!");
}else{
//将坐标--》数组下标
i = (x-20)/20;
j = (y-98)/20;
//将棋子下到最近点
if((x-20)%20>10){
i = i+1;
}
if((y-98)%20>10){
j = j +1;
}
//下棋
if(a[i][j]==0){//此处没有棋子
if(isBlack){
a[i][j] = 1;//下黑子
info = "游戏信息:白方下棋!";
isBlack = false;
}else{
a[i][j] = 2;//下白子
info = "游戏信息:黑方下棋!";
isBlack = true;
}
this.repaint();
//判断输赢
if(this.winOrLost()){
if(a[i][j]==1){
info = "游戏信息:game over,黑方获胜!";
JOptionPane.showMessageDialog(this, "游戏结束,黑方获胜");
}else{
info = "游戏信息:game over,白方获胜!";
JOptionPane.showMessageDialog(this, "游戏结束,白方获胜");
}
islock = true;//锁棋盘
}
}else{
JOptionPane.showMessageDialog(this, "此处已有棋子,请重新下棋!");
}
}
}
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub

}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub

}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub

}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub

}

//判断输赢
public boolean winOrLost(){
boolean flag = false;
int color = a[i][j];//保存当前下的这个棋子的颜色

//判断水平方向
int count1 = 1;//统计相同颜色棋子的个数
int x1 = 1;
while(i-x1>=0&&a[i-x1][j]==color){//左边
count1++;
x1++;
}
x1 = 1;//还原x
while(i+x1<=18&&a[i+x1][j]==color){//右边
count1++;
x1++;
}

//判断垂直方向
int count2 = 1;
int x2 = 1;
while(j-x2>=0&&a[i][j-x2]==color){//上
count2++;
x2++;
}
x2=1;
while(j+x2<=18&&a[i][j+x2]==color){//下
count2++;
x2++;
}

//判断斜线(左上+右下)
int count3 = 1;
int x3 = 1;
while(i-x3>=0&&j-x3>=0&&a[i-x3][j-x3]==color){//左上
count3++;
x3++;
}
x3 = 1;
while(i+x3<=18&&j+x3<=18&&a[i+x3][j+x3]==color){//右下
count3++;
x3++;
}

//判断斜线(右上+左下)
int count4 = 1;
int x4 = 1;
while(i+x4<=18&&j-x4>=0&&a[i+x4][j-x4]==color){//右上
count4++;
x4++;
}
x4=1;
while(i-x4>=0&&j+x4<=18&&a[i-x4][j+x4]==color){//左下
count4++;
x4++;
}

//判断是否赢了
if(count1>=5||count2>=5||count3>=5||count4>=5){
flag = true;
}
return flag;
}
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值