java五子棋+源码

        前天断网,闲着没事儿的时候写了个不太完美的 五子棋游戏,功能基本实现了,不过代码没怎么优化,

所以也算不上好,写的时候只顾着偷懒,所有的东西一一堆一堆的写下来了。效果图如下:

mark


呃,至于素材,背景是网上随便找的,棋子是自己用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) {
	}
}


  
  
  
  
  
  
  
  
  
  
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值