您的位置:首页 > 编程语言 > Java开发

java-----五子棋小游戏(五)-----按钮功能设置(The End)

2014-04-15 22:19 316 查看
一、代码实现

package org.like.game.frame;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class FiveChessFrame extends JFrame implements MouseListener,Runnable//实现Runnable接口
{
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
BufferedImage bgImage = null;
int x = 0;
int y = 0;

int[][] allChess = new int[19][19];
boolean isBlack = true;
boolean canPlay = true;
String message = "黑方先行";
int maxTime = 0;
Thread td= new Thread(this);//创建线程用来显示计时
int blackTime = 0;//黑方剩余时间
int whiteTime = 0;//白方剩余时间
String blackMessage = "无限制";//计时区间所显示的内容
String whiteMessage = "无限制";//如果没有设置时间或是设置时间为0,则显示"无限制",否则,通过线程显示剩余时间

public FiveChessFrame()
{
this.setTitle("五子棋");
this.setSize(500,500);
this.setLocation((width-500)/2,(height-500)/2);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
td.start();//启动线程
td.suspend();//线程挂起
this.repaint();//刷新一遍界面,防止刚开始运行程序时出现黑窗口现象
this.addMouseListener(this);
try
{
bgImage = ImageIO.read(new File("F:/mypicture/java/background.jpg"));
}
catch (IOException e)
{
e.printStackTrace();
}
}

public void paint(Graphics g)
{
BufferedImage bi = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);
Graphics g2 = bi.createGraphics();
g2.setColor(Color.BLACK);
g2.drawImage(bgImage,3,20,this);
g2.setFont(new Font("黑体",Font.BOLD,20));
g2.drawString("游戏信息:"+message, 150, 50);
g2.setFont(new Font("宋体",0,14));
g2.drawString("黑方时间:"+blackMessage, 45, 470);
g2.drawString("白方时间:"+whiteMessage, 260, 470);
for(int i=0;i<19;i++)
{
g2.drawLine(13, 70+20*i, 372, 70+20*i);
g2.drawLine(13+20*i,70,13+20*i,430);
}
g2.fillOval(71, 128, 4, 4);
g2.fillOval(311, 128, 4, 4);
g2.fillOval(311, 368, 4, 4);
g2.fillOval(71, 368, 4, 4);
g2.fillOval(311, 248, 4, 4);
g2.fillOval(191, 128, 4, 4);
g2.fillOval(71, 248, 4, 4);
g2.fillOval(191, 368, 4, 4);
g2.fillOval(191, 248, 4, 4);

for(int i=0;i<19;i++)
{
for(int j=0;j<19;j++)
{
if(allChess[i][j] == 1)
{
x = i * 20 + 13;
y = j * 20 + 70;
g2.fillOval(x-7, y-7, 14, 14);
}
if(allChess[i][j] == 2)
{
x = i * 20 + 13;
y = j * 20 + 70;
g2.setColor(Color.WHITE);
g2.fillOval(x-7, y-7, 14, 14);
g2.setColor(Color.BLACK);
g2.drawOval(x-7, y-7, 14, 14);
}
}
}
g.drawImage(bi, 0, 0, this);
}

@Override
public void mouseClicked(MouseEvent e)
{

}

@Override
public void mousePressed(MouseEvent e)
{
if(canPlay == true)
{
x = e.getX();
y = e.getY();
if(x >= 13 && x <= 380 && y >= 70 && y <= 440)//在原来基础上将x,y的上限扩大了一点,使得最右边和最下边也能下棋子
{
x = (x - 13) / 20;
y = (y - 70) / 20;
if(allChess[x][y] == 0)
{
if(isBlack)
{
allChess[x][y] = 1;
isBlack = false;
message = "轮到白方下棋";
}
else
{
allChess[x][y] = 2;
isBlack = true;
message = "轮到黑方下棋";
}
this.repaint();
boolean winFlag = this.checkWin();
if(winFlag == true)
{
JOptionPane.showMessageDialog(this, "游戏结束"+(allChess[x][y] == 1?"黑方":"白棋")+"获胜!");
canPlay = false;
}
}
else
{
JOptionPane.showMessageDialog(this, "当前位置已经有棋子了,请重新落子!");
}
}
}//重新开始按钮功能实现
if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 72 && e.getY() <= 99)
{
td.suspend();暂停计时
if(JOptionPane.showConfirmDialog(this, "是否重新开始游戏?") == 0)
{//弹出确认消息对话框,若选择“是”,就初始化allChess中的值
for(int i=0;i<19;i++)
{
for(int j=0;j<19;j++)
{
allChess[i][j] = 0;
}
}
this.message = "黑方先行";//并初始化一些显示和标记
isBlack = true;
canPlay = true;
blackTime = maxTime;
whiteTime = maxTime;
this.repaint();//刷新
td.resume();//唤醒线程,比如哪一方用时完毕结束时会挂起线程,而点开始按钮又重新唤醒线程
}
}

if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 121 && e.getY() <= 151)
{
String input = JOptionPane.showInputDialog("请输入游戏的最大时间(分钟),如果输入0,表示没有时间限制");
try
{
maxTime = Integer.parseInt(input) * 60;
if(maxTime < 0)
{
JOptionPane.showMessageDialog(this, "输入有误,不允许输入负数");
}
if(maxTime == 0)
{
if(JOptionPane.showConfirmDialog(this, "设置完成,是否重新开始游戏?") == 0)
{
for(int i=0;i<19;i++)
{
for(int j=0;j<19;j++)
{
allChess[i][j] = 0;
}
}
this.message = "黑方先行";
isBlack = true;
canPlay = true;
blackTime = maxTime;
whiteTime = maxTime;
blackMessage = "无限制";
whiteMessage = "无限制";
this.repaint();//repaint别忘了

}//maxTime为0时,时间无限制,所以也不用唤醒线程

}
if(maxTime > 0)
{
if(JOptionPane.showConfirmDialog(this, "设置完成,是否重新开始游戏?") == 0)
{
for(int i=0;i<19;i++)
{
for(int j=0;j<19;j++)
{
allChess[i][j] = 0;
}
}
this.message = "黑方先行";
isBlack = true;
canPlay = true;
blackTime = maxTime;
whiteTime = maxTime;
blackMessage = maxTime/3600 + ":" + (maxTime/60-maxTime/3600*60) + ":" + (maxTime-maxTime/60*60);
whiteMessage = maxTime/3600 + ":" + (maxTime/60-maxTime/3600*60) + ":" + (maxTime-maxTime/60*60);
this.repaint();//repaint别忘了

td.resume();
}

}
}
catch (Exception e2)
{
JOptionPane.showMessageDialog(this, "输入有误,请正确输入信息");
}

}
//说明按钮功能实现
if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 171 && e.getY() <= 199)
{
JOptionPane.showMessageDialog(this, "这是一个五子棋程序,黑白方轮流下棋,当某一方连到五子时,游戏结束。");
}
//认输按钮功能实现
if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 271 && e.getY() <= 299)
{
if(JOptionPane.showConfirmDialog(this, "是否确认认输?") == 0)
{
if(isBlack)
{
JOptionPane.showMessageDialog(this, "黑方已经认输,游戏结束!");
td.suspend();//挂起线程,防止继续计时
}
else
{
JOptionPane.showMessageDialog(this, "白方已经认输,游戏结束!");
td.suspend();
}
canPlay = false;//设置不能再落子了
}
}
//关于按钮功能实现
if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 322 && e.getY() <= 348)
{
JOptionPane.showMessageDialog(this, "本游戏由周子新制作\nblog.csdn.net/zhouzixin053");
}
//退出按钮功能实现
if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 371 && e.getY() <= 398)
{
if(JOptionPane.showConfirmDialog(this, "确认退出吗?", "退出", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE) == 0)
{
System.exit(0);
}

}

}

@Override
public void mouseReleased(MouseEvent e)
{

}

@Override
public void mouseEntered(MouseEvent e)
{

}

@Override
public void mouseExited(MouseEvent e)
{

}

public static void main(String[] args)
{
FiveChessFrame ff = new FiveChessFrame();

}

private boolean checkWin()
{
boolean flag = false;
int count = 1;
int color = allChess[x][y];
count = this.checkCount(1, 0, color);
if (count >= 5)
{
flag = true;
}
else
{
// 判断纵向
count = this.checkCount(0, 1, color);
if (count >= 5)
{
flag = true;
}
else
{
// 判断右上、左下
count = this.checkCount(1, -1, color);
if (count >= 5)
{
flag = true;
}
else
{
// 判断右下、左上
count = this.checkCount(1, 1, color);
if (count >= 5)
{
flag = true;
}
}
}
}

return flag;
}

private int checkCount(int xChange, int yChange, int color)
{
int count = 1;
int tempX = xChange;
int tempY = yChange;
while (x + xChange >= 0 && x + xChange <= 18 && y + yChange >= 0&& y + yChange <= 18
&& color == allChess[x + xChange][y + yChange])
{
count++;
if (xChange != 0)
xChange++;
if (yChange != 0) {
if (yChange > 0)
yChange++;
else {
yChange--;
}
}
}
xChange = tempX;
yChange = tempY;
while (x - xChange >= 0 && x - xChange <= 18 && y - yChange >= 0&& y - yChange <= 18
&& color == allChess[x - xChange][y - yChange])
{
count++;
if (xChange != 0)
xChange++;
if (yChange != 0) {
if (yChange > 0)
yChange++;
else {
yChange--;
}
}
}
return count;
}

@Override
public void run()
{
while(true)
{
this.repaint();
if(maxTime > 0)
{
if(isBlack)
{
blackTime--;
if(blackTime == 0)//时间为0就弹出窗口提示游戏结束
{
JOptionPane.showMessageDialog(this, "黑方超时,游戏结束!");
canPlay = false;//设置不能再落子
td.suspend();//线程挂起,不然就会在计时区域继续显示,并且显示负数
}
}
else
{
whiteTime--;
if(whiteTime == 0)
{
JOptionPane.showMessageDialog(this, "白方超时,游戏结束!");
canPlay = false;
td.suspend();
}
}
try
{
Thread.sleep(1000);//使计时以1秒为单位
}
catch (InterruptedException e)
{
e.printStackTrace();
}
blackMessage = blackTime/3600 + ":" + (blackTime/60-blackTime/3600*60) + ":" + (blackTime-blackTime/60*60);
whiteMessage = whiteTime/3600 + ":" + (whiteTime/60-whiteTime/3600*60) + ":" + (whiteTime-whiteTime/60*60);
this.repaint();//每次计时完毕就刷新一遍
}
}
}
}

二、效果展示



















内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 五子棋
相关文章推荐