五子棋 java

五子棋小游戏

需求

游戏设置优先出棋子、游戏说明、重新开始、悔棋、认输、退出、关于。

图像界面如下在这里插入图片描述

源码

package keshe;
import java.util.*;
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 FiveChess extends JFrame implements MouseListener{
	String message = "轮到黑方";
	int x; //鼠标横坐标
	int y; //鼠标纵坐标
	int [][]chess = new int[19][19];
	
	int jilu =0;
	boolean isBlack =true;  //轮到哪一方落子,默认黑色落子
	boolean  canPlay= true;
	
	int X[] = new int [181];
	int Y[] = new int [181];
	
   public  FiveChess(){
    	this.setTitle("欢乐五子棋");
        this.setSize(690,660);//宽 高
        this.setVisible(true);  //可显示

		int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width; //获取屏幕宽
		int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height;//获取屏幕高
        this.setLocation((screen_width -690)/2,(screen_height-695)/2); //使屏幕正中间显示
        this.addMouseListener(this); //监听鼠标          
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭                                                                                                                 
  }
  @Override
 public void paint(Graphics g){  //加载图片
	   
	  //添加背景图片
 	
// if(Pattern.equals("One")) {	  
	try{ 
		 BufferedImage img = ImageIO.read(new File("C:\\Users\\Administrator\\Desktop\\eclipse-jee-oxygen-R-win32-x86_64\\ke\\bg1.jpg"));// bg1.jpg是图片名 将图片加载到程序当中来
         g.drawImage(img,0,35,this);//参数(画哪张图片, 开始画位置 ,开始画位置 ,)
	  } catch(IOException e){		
	   e.printStackTrace(); //在命令行输出异常的原因
    
	  }
	  //生成19*19的棋盘
     for(int i=0 ; i<19; i++){
		//画19条横线
		g.drawLine(35, 125+25*i, 485,125+i*25); //画横线的方法 参数(起点横坐标,起点纵坐标,结束横坐标,结束纵坐标)

     }
	 for(int j=0;j<19;j++){
		 //画19条竖线
		g.drawLine(35+25*j,125,35+j*25,575);//画竖线的方法 参数(起点横坐标,起点纵坐标,结束横坐标,结束纵坐标)

	 }

    //生成顶部提示信息
	g.setFont(new Font("黑体",Font.BOLD,20));  //Font.BOLD为字体加粗
	g.drawString("提示信息: "+this.message,200,100);   //数字为坐标

    g.drawRect(520,125,120,40);//画矩形 参数(开始横坐标,开始纵坐标,长,宽)           
	g.drawString("游戏设置",530,160);
	
	g.drawRect(520,185,120,40);
	g.drawString("游戏说明",530,210);

	g.drawRect(520,235,120,40);
	g.drawString("重新开始",530,260);

	g.drawRect(520, 285, 120, 40);
	g.drawString("悔棋",530,310);
	
	g.drawRect(520,335,120,40);
	g.drawString("认输",530,360);

	g.drawRect(520,385,120,40);
	g.drawString("退出",530,410);

	g.drawRect(520,435,120,40);
	g.drawString("关于",530,460);

	
   //遍历数组,输出棋子 
   for(int i=0 ; i<19; i++){
	 for(int j=0; j<19;j++){
		if(chess[i][j]==1){ //1落黑子    
          g.setColor(Color.BLACK);
		  g.fillOval(j*25+35-8,i*25+125-8,16,16);  //参数(坐标x,坐标y,长,宽)	  
	    }    
		else if(chess[i][j]==2){
			g.setColor(Color.RED);
			g.fillOval(j*25+35-8,i*25+125-8,16,16);
		}	            	    
	}
   }	  
  }
@Override 
public void mouseReleased(MouseEvent e){
	
	if(canPlay) {
	this.x = e.getX();
	this.y = e.getY();
    
	if(x>=35 &&x<485&&y>=125&&y<=575){ //单击是否在棋盘
	int j =(x-35+25/2)/25;//纵坐标
    int i =(y-125+25/2)/25; //横坐标 
	if(chess[i][j]!= 0) {
	   JOptionPane.showMessageDialog(this,"不能重复落子");	
	}else{

		if(isBlack){
			 
			chess[i][j] = 1;
	        ++jilu;
	        X[jilu]=i;
	        Y[jilu]=j;
			isBlack = false;
			
		//	chesshui.add(chess);
			message ="轮到红方";
		}
		else{
			++jilu;
	        X[jilu]=i;
	        Y[jilu]=j;
			chess[i][j] = 2;
			isBlack = true;
		//	chesshui.add(chess);
			message = "轮到黑方";
		 }
	  }
	this.repaint();

	 int count=0;
	 int index_j = j;
	 while(chess[i][j]==chess[i][index_j++]){
		   count++;
           
	 }
      index_j = j;
	 while(chess[i][j]==chess[i][--index_j]){
		 count++;

	 }
	 if(count>=5){
		
     JOptionPane.showMessageDialog(this,"恭喜"+(isBlack ?"红方":"黑方")+"获胜!");
	  canPlay= false;
      isBlack =true;
	 }
	 //判断竖线是否五个连珠
    count =0;
    int index_i =i;
	 while(chess[i][j]==chess[index_i++][j]){
		
		count++;
	 }
	  index_i =i;
	  while(chess[i][j] == chess[--index_i][j]){
		
           count++;
	  }
    if(count>=5){
		JOptionPane.showMessageDialog(this,"恭喜"+(isBlack ?"红方":"黑方")+"获胜!");
        canPlay = false;
        isBlack =true;
    }
	 //判断斜线是否五个连珠 
	 count =0;
	 index_i = i;
	 index_j = j;
     while(chess[i][j]==chess[index_i++][index_j++]) {
   	   count++;
                  	  
     }
     index_i =i;
     index_j =j;
     while(chess[i][j]==chess[--index_i][--index_j]) {
    	 
    	 count++;
     }
     if(count>=5){
 		JOptionPane.showMessageDialog(this,"恭喜"+(isBlack ?"红方":"黑方")+"获胜!");
        canPlay = false;
        isBlack =true;
     }
     //判断斜线是否五个连珠
     count =0;
	 index_i = i;
	 index_j = j;
     while(chess[i][j]==chess[index_i++][index_j--]) {
    	 
    	 count++;
     }
     index_i = i;
	 index_j = j;
     while(chess[i][j]==chess[--index_i][++index_j]) {
    	 count++;
     }
     if(count>=5) {
    	 JOptionPane.showMessageDialog(this,"恭喜"+(isBlack ?"红方":"黑方")+"获胜!");
         canPlay = false;
         isBlack =true;
         count =0;//
     }
	}//
}
	this.x = e.getX();
	this.y = e.getY();
  if(x>=520&&x<=640&&y>=185&&y<=225) {//游戏说明
		
		JOptionPane.showMessageDialog(this,"一方抢先横、竖、斜五颗连珠即可获胜");
	 }
  
  if(x>=520&&x<=640&&y>=125&&y<=165) { //游戏设置
	
	  JOptionPane.showMessageDialog(this,"已调换哪一方先出");
	  canPlay =true;
		for(int i=0; i<19;i++) {
			for(int j=0; j<19;j++) {
				chess[i][j]=0;
			}
		}
		this.repaint();
		if(isBlack) {
		isBlack = false;
		message = "轮到红方";
	  }
		else {
			isBlack = true;
            message = "轮到红方";
		}
	}
   if(x>=520&&x<=640&&y>=235&&y<=275) {  //重新开始游戏
    	canPlay =true;
		for(int i=0; i<19;i++) {
			for(int j=0; j<19;j++) {
				chess[i][j]=0;
			}
		}
		this.repaint();
	 }
   if(x>=520&&x<=640&&y>=285&&y<=325) {  //悔棋
    	if(isBlack) {
    	chess[X[jilu]][Y[jilu]] = 0;
    	isBlack=false;
    	}
    	else {
    		chess[X[jilu]][Y[jilu]] = 0;
        	isBlack=true;
    	}
    	this.repaint();
    }
  if(x>=520&&x<=640&&y>=335&&y<=375) {//认输
		if(isBlack) {
			JOptionPane.showMessageDialog(this,"恭喜!" +(isBlack ? "红方" : "黑方") +"获胜");
			  //重新开始游戏
				for(int i=0; i<19;i++) {
					for(int j=0; j<19;j++) {
						chess[i][j]=0;
					}
				}
			
				this.repaint();
			 
		}
		else {
			JOptionPane.showMessageDialog(this,"恭喜!黑方获胜");
			  //重新开始游戏
				for(int i=0; i<19;i++) {
					for(int j=0; j<19;j++) {
						chess[i][j]=0;
					}
				}
				
				this.repaint();
			 
		}
	 }
  if(x>=520&&x<=640&&y>=385&&y<=425) { //退出
	this.dispose();
	 
	 }
  if(x>=520&&x<=640&&y>=435&&y<=475) {      //关于
	  JOptionPane.showMessageDialog(this,"本软件由南航188207140吴华制作");
	  
  }
}

public void mouseClidked(MouseEvent e){

 
 } 
@Override 
  public void mouseEntered(MouseEvent e){
	

 }
@Override
  public void mouseExited(MouseEvent e){
                                          
 } 
 
 public void mousePressed(MouseEvent e){
	

 }
@Override
public void mouseClicked(MouseEvent e) {
	
	
 }
}

public class Test {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		FiveChess f = new FiveChess();
	}

}

效果如下所示
在这里插入图片描述

感觉一步一步来就不难

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值