制作简单的五子棋
通过类的继承,使用全局变量,为了以后的修改做准备,这样也是便于修改的体现
public interface Config {
int x0=40,y0=40;//坐标起始位置
int ROWS=15,COLS=15;//行列数
int SIZE=36;//单元格大小
int Chess_Size=30;//棋子大小
//定义一个数组保存棋盘的状态
byte[][] CHESSES=new byte[ROWS][COLS];
}
首先就是界面的设置
public void CHESSUI(){
//添加菜单
/*
* JMenuBar bar=new JMenuBar()
* JMenu menu=new JMenu("文件")
* bar.add(menu)
* JMenuItem item=new JMenuItem("新建")
* menu.add(item)
*设置窗体菜单
*this.setJMenuBar(bar)
* */
this.setTitle("五子棋");
this.setSize(600, 600);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
JPanel jpanel=new Mypanel();
jpanel.setBackground(new Color(194,157,68));
this.add(jpanel);
this.setVisible(true);
Graphics g=jpanel.getGraphics();
ChessListener clis=new ChessListener(g);
jpanel.addMouseListener(clis);
}
上面是调试之后的界面。
class Mypanel extends JPanel{
@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
SuanFa(g);
CHESS(g);
}
public void SuanFa(Graphics g){
for(int i=0;i<ROWS;i++) 这个是画表格的方法,以每一个方块为界限 用For循环实现你
{
g.drawLine(x0, y0+SIZE*i, x0+SIZE*(COLS-1),y0+SIZE*i );
}
for(int i=0;i<COLS;i++)
{
g.drawLine(x0+SIZE*i, y0, x0+SIZE*i,y0+SIZE*(ROWS-1) );
}
}
因为是定义好了 黑棋(1)和白棋(-1),由于没下一次就给数组定义一个数,所以根据数组是1还是-1来判断是什么棋,下面的方法是保存棋盘的方法
public void CHESS(Graphics g){
for(int i=0;i<ROWS;i++){
for(int j=0;j<COLS;j++)
{
if(CHESSES[i][j]!=0)
{
if(CHESSES[i][j]==1)
{
g.setColor(Color.BLACK);
}else if(CHESSES[i][j]==-1)
{
g.setColor(Color.WHITE);
}
int x1=x0+SIZE*j;
int y1=y0+SIZE*i;
g.fillOval(x1-Chess_Size/2, y1-Chess_Size/2, Chess_Size, Chess_Size);
}
}
}
}
下面是监听器部分
public class ChessListener extends MouseAdapter implements Config {
private Graphics g;
private byte flag=1;
private boolean isOver=false;
public ChessListener(Graphics g){
this.g=g;
}
public void mouseReleased(MouseEvent e) {
//获得点击点的坐标
//ROWS是行
int x=e.getX();
int y=e.getY();
//行数,列数
int r=(y-y0)/SIZE;
int c=(x-x0)/SIZE; 没有点击在点上的话,根据距离点的范围,判断棋显示在哪里,大于一半就加一
//判断是左还是右
if((y-y0)%SIZE>SIZE/2){
r++;
}
if((x-x0)%SIZE>SIZE/2){
c++;
}
是不是在棋盘范围内,棋盘上是不是有棋子判断是否可以落子
if(!isOver&&c>=0&&c<COLS&&r>=0&&r<ROWS&&CHESSES[r][c]==0){
int x1=x0+SIZE*c;
int y1=y0+SIZE*r;
CHESSES[r][c]=flag;
落完之后改变棋子的flag
if(flag==1){
g.setColor(Color.BLACK);
flag=-1;
}
else if(flag==-1){
g.setColor(Color.WHITE);
flag=1;
}
g.fillOval(x1-Chess_Size/2, y1-Chess_Size/2, Chess_Size, Chess_Size);
}
根据算法判断输赢
if(SUANFA.Chessheng(r, c)||SUANFA.Chess45(r, c)||SUANFA.Chess135(r, c)){
if(CHESSES[r][c]==1){
JOptionPane.showMessageDialog(null, "黑棋赢了!");
}else {
JOptionPane.showMessageDialog(null, "白棋赢了!");
}
isOver=true;
}
}
}
五子棋算法
public class SUANFA implements Config {
/**
* 五子棋算法
*/
//横向
public static boolean Chessheng(int r,int c){
int count=0;
for(int i=c+1;i<COLS;i++){
if (CHESSES[r][i]==CHESSES[r][c])
count++;
else{
break;
}
}
for(int i=c;i>=0;i--){
if(CHESSES[r][i]==CHESSES[r][c])
count++;
else{
break;
}
}
if(count>=5){
return true;
}
return false;
}
public static boolean Chess45(int r,int c)
{
int count=0;
//正
for(int i=r,j=c;i>=0&&j<COLS;i--,j++){
if(CHESSES[i][j]==CHESSES[r][c]){
count++;
}
else {
break;
}
}
for(int i=r+1,j=c-1;i<ROWS&&j>=0;i++,j--)
{
if(CHESSES[i][j]==CHESSES[r][c])
{
count++;
}
else{
break;
}
}
if(count>=5){
return true;
}
return false;
}public static boolean Chess135(int r,int c)
{
int count=0;
//正
for(int i=r,j=c;i>=0&&j>=0;i--,j--){
if(CHESSES[i][j]==CHESSES[r][c]){
count++;
}
else {
break;
}
}
for(int i=r+1,j=c+1;i<ROWS&&j<COLS;i++,j++)
{
if(CHESSES[i][j]==CHESSES[r][c])
{
count++;
}
else{
break;
}
}
if(count>=5){
return true;
}
return false;
}
}
简单五子棋
猜你喜欢
转载自mr20747252013.iteye.com/blog/2159562
今日推荐
周排行