前天断网,闲着没事儿的时候写了个不太完美的 五子棋游戏,功能基本实现了,不过代码没怎么优化,
所以也算不上好,写的时候只顾着偷懒,所有的东西一一堆一堆的写下来了。效果图如下:
呃,至于素材,背景是网上随便找的,棋子是自己用Fireworks画的。棋子和背景素材如下:
【ps:点击右键可以下载】
源码如下:
package com.liuleidefeng.ui;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
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;
/**
*
* @author CSDN liruanjianyiyuan
*
*/
public class MainUi extends JFrame implements MouseListener,KeyListener{
private static final long serialVersionUID = 1L;
public Image img=null;
BufferedImage bfi;//背景缓冲区
BufferedImage blackqz;//黑色棋子
BufferedImage whiteqz;//白色棋子
private int qipanx=10;//棋盘左上角x坐标
private int qipany=30;//棋盘左上角y坐标
private int qipanGeziWith=40;//棋盘每格宽度
public int[][] qipan=new int[9][9];//棋盘有效数组,0: 没有:黑色,2:白旗
public int currQiziColor=1;//1:黑色:白色
Point p1=new Point();//胜利时第一个坐标
Point p2=new Point();//胜利时第二个坐标
public boolean hasWinner=false;//是否有人胜利
/**
* 构造方法
*/
public MainUi(){
setSize(550, 450);
addMouseListener(this);
addKeyListener(this);
setTitle("五子棋");
setLayout(null);
String basepath=System.getProperty("user.dir");//获取程序运行路径
try {
File f=new File(basepath+"/images/bg.jpg");
System.out.println("S:"+f.getAbsolutePath());
bfi=ImageIO.read(f);
blackqz=ImageIO.read(new File(basepath+"/images/black2.png"));
whiteqz=ImageIO.read(new File(basepath+"/images/white1.png"));
} catch (IOException e) {
System.out.println("创建图片失败:"+e.getMessage());
}
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
}
/**
* 数据初始化
*/
public void initData(){
qipanx=10;//棋盘左上角x坐标
qipany=30;//棋盘左上角y坐标
qipanGeziWith=40;//棋盘每格宽度
qipan=new int[9][9];//棋盘有效数组,0: 没有�?:黑色,2:白�?
currQiziColor=1;//1:黑色:白
p1=new Point();//胜利时第一个坐标
p2=new Point();//胜利时第二个坐标
hasWinner=false;//是否有人胜利
this.repaint();
}
/**
* 重写 paint方法,采用双缓冲,防止闪烁
*/
@Override
public void paint(Graphics g) {
img=this.createImage(this.getWidth(),this.getHeight());
Graphics gtmp= img.getGraphics();
gtmp.setColor(Color.black);
drawBac(gtmp);
drawRightInfo(gtmp);
if(hasWinner){//如果有人胜利
gtmp.setColor(Color.red);
gtmp.drawLine(p1.x, p1.y, p2.x, p2.y);
}
g.drawImage(img,0,0,null);
gtmp.dispose();
}
/**
* 画背景
* @param g
*/
public void drawBac(Graphics g){
g.drawImage(bfi, 0, 18, null);//画背景
g.setColor(Color.gray);
for(int i=1;i<10;i++){
g.drawLine(10, 30+i*40, 410, 30+i*40);
g.drawLine(10+i*40, 30, 10+i*40, 430);
}
drawQizi(g);
g.setColor(Color.black);
g.drawRect(qipanx, qipany, 400, 400);
}
/**
* 画右边信息
* @param g
*/
public void drawRightInfo(Graphics g){
g.drawString("当前玩家:", 434, 55);
if(currQiziColor==1){
g.drawImage(blackqz, 475, 64, null);
}else{
g.drawImage(whiteqz, 475, 64, null);
}
}
/**
* 画棋子的方法
* @param g
*/
public void drawQizi(Graphics g){
int tmpx=0;//当前循环点的x
int tmpy=0;//当前循环点的y
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
//System.out.println("当前位置�?+qipan[i][j]);
int t=qipan[i][j];
if(t!=0){
tmpx=qipanx+(i+1)*qipanGeziWith;
tmpy=qipany+(j+1)*qipanGeziWith;
if(t==1){//更改画笔颜色
g.drawImage(blackqz, tmpx-16, tmpy-16, null);
}else if(t==2){
g.drawImage(whiteqz, tmpx-16, tmpy-16, null);
}
if(i==p1.x && j==p1.y){
p1.setLocation(tmpx,tmpy);
}
if(i==p2.x && j==p2.y){
p2.setLocation(tmpx, tmpy);
}
}
}
}
g.setColor(Color.black);
}
/**
* 激活棋子,即用户点击后的一系列判断;先判断游戏是否正常进行,
* 然后判断该位置是否存在棋子
* @param x 鼠标点击时的x坐标
* @param y 鼠标点击时的Y坐标
*/
public void active(int x,int y){
if(hasWinner){
String s="";
if(currQiziColor==1){
s="白方";
}else{
s="黑方";
}
JOptionPane.showMessageDialog(this, s+"已胜利!按F2重新游戏","信息",JOptionPane.INFORMATION_MESSAGE);
return;
}
int tmpx=0;//当前循环点的x
int tmpy=0;//当前循环点的y
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(qipan[i][j]==0){//如果当前位置不存在点
tmpx=qipanx+(i+1)*qipanGeziWith;
tmpy=qipany+(j+1)*qipanGeziWith;
if(Math.abs(x-tmpx)<20 && Math.abs(y-tmpy)<20){//x在当前范围
qipan[i][j]=currQiziColor;//设置当前棋子颜色
isWin(i, j, currQiziColor);//判断时候胜利
if(currQiziColor==1){//转换棋子颜色
currQiziColor=2;
}else{
currQiziColor=1;
}
this.repaint();
}
}
}
}
}
/**
* 判断是否胜利
* @param indexX 棋盘中x下标
* @param indexY 棋盘中Y下标
* @param qiziColor 当前棋子颜色
* @return b 胜利返回true
*
*/
public boolean isWin(int indexX,int indexY,int qiziColor){
boolean b=false;
int c1=0;//半区统计辅助1
int c2=0;//半区统计辅助2
boolean b1=true;//半区可行辅助1
boolean b2=true;//半区可行辅助2
for(int s=0;s<4;s++){//四个方向
for(int t=1;t<5 t="" if="" s="=0){" if="" b1="" indexx-t="">=0){//上半区可�?
if(qipan[indexX-t][indexY]==qiziColor){//横着 左半
p1.setLocation(indexX-t, indexY);
c1++;
}else{
b1=false;
}
}
if(b2 && indexX+t<9 if="" qipan="" indexx="" t="" indexy="" qizicolor="" p2="" setlocation="" indexx="" t="" indexy="" c2="" else="" b2="false;" else="" if="" s="=1){" if="" b1="" indexy-t="">=0){//上半区可�?
if(qipan[indexX][indexY-t]==qiziColor){//竖着 上半
p1.setLocation(indexX, indexY-t);
c1++;
}else{
b1=false;
}
}
if(b2 && indexY+t<9 if="" qipan="" indexx="" indexy="" t="" qizicolor="" p2="" setlocation="" indexx="" indexy="" t="" c2="" else="" b2="false;" else="" if="" s="=2){" if="" b1="" indexy-t="">=0 && indexX-t>=0){//上半区可�?
if(qipan[indexX-t][indexY-t]==qiziColor){//左上半�?斜\
p1.setLocation(indexX-t, indexY-t);
c1++;
}else{
b1=false;
}
}
if(b2 && indexY+t<9 && indexX+t<9 if="" qipan="" indexx="" t="" indexy="" t="" qizicolor="" p2="" setlocation="" indexx="" t="" indexy="" t="" c2="" else="" b2="false;" else="" if="" s="=3){" if="" b1="" indexy-t="">=0 && indexX+t<9){//上半区可�?
if(qipan[indexX+t][indexY-t]==qiziColor){//右上半�?�?
p1.setLocation(indexX+t,indexY-t);
c1++;
}else{
b1=false;
}
}
if(b2 && indexY+t<9 indexx-t="">=0){//下半区可�?
if(qipan[indexX-t][indexY+t]==qiziColor){//右下半�?�?
p2.setLocation(indexX-t, indexY+t);
c2++;
}else{
b2=false;
}
}
}
}
if(c1+c2==4){
if(c1==4){
p2.setLocation(indexX, indexY);
}else if(c2==4){
p1.setLocation(indexX, indexY);
}
System.out.println("您胜利了");
hasWinner=true;
return true;
}else{
c1=0;
c2=0;
b1=true;
b2=true;
}
}
return b;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MainUi m=new MainUi();
m.setVisible(true);
}
});
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("x:"+e.getX()+" y:"+e.getY());
active(e.getX(), e.getY());
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println(e.getKeyCode());
if(e.getKeyCode()==113){
initData();
}
}
@Override
public void keyReleased(KeyEvent e) {
}
}