JAVA程序设计(12.3)---- 监听器初级应用:五子棋

1.制作五子棋游戏软件

因为老师已经基本做完了,重做的时候快了很多……但是还是感觉思维很混乱…… 哪边先哪边后,哪个方法在哪边好之类的问题 太纠结了……

先是窗口 内部类:鼠标适配器  窗口的构造器  绘图

package com.lovo.homework2;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 * 类 : 我的五子棋窗口
 *
 * @author Abe
 */
public class MyFrameRenju extends JFrame {
	private MyboardRenju board = new MyboardRenju();
	private boolean isBlack = true;
	private Image offImage = new BufferedImage(800, 800,
			BufferedImage.TYPE_INT_RGB);// 双缓冲
	private boolean isGameOver = false;

	/**
	 * 内部类:鼠标适配器
	 *
	 * @author Abe
	 */
	public class MyMouseAdapter extends MouseAdapter {
		@Override
		public void mousePressed(MouseEvent e) { // 重写点击鼠标的方法
			if (!isGameOver) {
				int x = e.getX();
				int y = e.getY();
				if (x > 25 && x < 775 && y > 25 && y < 775) {
					int i = (x - 25) / 50;
					int j = (y - 25) / 50;
					if (board.move(i, j, isBlack)) {
						repaint();
						if (board.win(i, j, isBlack)) {
							JOptionPane.showMessageDialog(null,
									isBlack ? "黑方胜!" : "白方胜");
							isGameOver = true;
						}
						isBlack = !isBlack;
					}
				}
			}
		}
	}

	/**
	 * 构造器
	 */
	public MyFrameRenju() {
		this.setTitle("五子棋");
		this.setSize(800, 800);
		this.setResizable(false);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);
		this.setLayout(null);
		this.getContentPane().setBackground(new Color(180, 125, 12));

		MyMouseAdapter l = new MyMouseAdapter();
		this.addMouseListener(l);

	}

	/**
	 * 重写方法画出所有 newG均为双缓冲 去掉闪屏需要
	 */
	@Override
	public void paint(Graphics g) {
		Graphics newG = offImage.getGraphics();
		super.paint(newG);
		board.draw(newG);
		g.drawImage(offImage, 0, 0, 800, 800, null);
	}

	public static void main(String[] args) {
		new MyFrameRenju().setVisible(true);
	}
}

然后是位置面板,绘制棋子,走棋,判断胜负

package com.lovo.homework2;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.Stroke;

import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;

/**
 * 类 : 五子棋棋盘
 *
 * @author Abe
 *
 */
public class MyboardRenju {
	private int[][] p = new int[15][15]; // 给每个交点赋值

	public void draw(Graphics g) {
		g.setColor(Color.BLACK);
		Graphics2D g2d = (Graphics2D) g; // 强转g为2D型 赋值给g2d
		g2d.setStroke(new BasicStroke(5));
		g.drawRect(50, 50, 700, 700);
		g2d.setStroke(new BasicStroke(1));
		g.fillOval(392, 392, 16, 16); // 画天元 星
		g.fillOval(195, 195, 10, 10);
		g.fillOval(195, 595, 10, 10);
		g.fillOval(595, 195, 10, 10);
		g.fillOval(595, 595, 10, 10);

		for (int i = 0; i < 750; i += 50) { // 画横纵坐标线
			g.drawLine(50, 100 + i, 750, 100 + i);
			g.drawLine(100 + i, 50, 100 + i, 750);
		}
		for (int i = 0; i < p.length; i++) { // 画出棋盘上的棋子
			for (int j = 0; j < p.length; j++) {
				if (p[i][j] != 0) {
					g.setColor(p[i][j] == 1 ? Color.black : Color.WHITE);
					g.fillOval(25 + i * 50, 25 + j * 50, 50, 50);
				}
			}
		}
	}

	/**
	 * 走棋
	 */
	public boolean move(int i, int j, boolean isBlack) {
		if (p[i][j] == 0) {
			p[i][j] = isBlack ? 1 : 2;
			return true;
		}
		return false;
	}

	/**
	 * 方法:判断胜负
	 */
	public boolean win(int i, int j, boolean isBlack) {
		int currentColor = isBlack ? 1 : 2;
		if (countH(i, j, currentColor) >= 5 || countV(i, j, currentColor) >= 5
				|| countX1(i, j, currentColor) >= 5
				|| countX2(i, j, currentColor) >= 5) {
			return true;
		}
		return false;
	}

	private int countH(int i, int j, int currentColor) {
		int counter = 1;
		int tempi = i;
		while (--tempi >= 0 && p[tempi][j] == currentColor) {
			counter++;
		}
		tempi = i;
		while (++tempi <= p.length && p[tempi][j] == currentColor) {
			counter++;
		}
		return counter;
	}

	private int countV(int i, int j, int currentColor) {
		int counter = 1;
		int tempj = j;
		while (--tempj >= 0 && p[i][tempj] == currentColor) {
			counter++;
		}
		tempj = j;
		while (++tempj <= p.length && p[i][tempj] == currentColor) {
			counter++;
		}
		return counter;
	}

	private int countX1(int i, int j, int currentColor) {
		int counter = 1;
		int tempi = i;
		int tempj = j;
		while (--tempj >= 0 && --tempi >= 0 && p[tempi][tempj] == currentColor) {
			counter++;
		}
		tempi = i;
		tempj = j;
		while (++tempj <= p.length && ++tempi <= p.length
				&& p[tempi][tempj] == currentColor) {
			counter++;
		}
		return counter;
	}

	private int countX2(int i, int j, int currentColor) {
		int counter = 1;
		int tempi = i;
		int tempj = j;
		while (--tempj >= 0 && ++tempi >= 0 && p[tempi][tempj] == currentColor) {
			counter++;
		}
		tempi = i;
		tempj = j;
		while (++tempj <= p.length && --tempi <= p.length
				&& p[tempi][tempj] == currentColor) {
			counter++;
		}
		return counter;
	}
}

时间: 2024-10-21 11:02:57

JAVA程序设计(12.3)---- 监听器初级应用:五子棋的相关文章

JAVA程序设计(12.2)---- 多态、监听器初级应用:在窗口中绘制图形,可以选择圆形 正方形 线条

1.在800 *800 的窗口中加入3个按钮 可以选择当前的画笔画出什么样的图形 有圆 正方形 直线 三种 JFrame 监听器使用 内部类 匿名内部类 接口 多态 1.先做所有图形的抽象类 package com.lovo.homework; import java.awt.Color; import java.awt.Graphics; /** * 抽象类:图形 * @author Abe * 属性:起点坐标 终点坐标 颜色 */ public abstract class Figure {

JAVA程序设计(11)-----面对对象初级设计 麻将 创建麻将牌 然后洗牌 发牌~ 恩 就这样

zzzzZZZZ 1.开始还想贴图的 实在太懒了-- 这是一张麻将 package com.lovo; import java.awt.Graphics; import java.awt.Image; /** * 类 : 麻将牌 * @author Abe 属性:花色 点数 图片 */ public class Mahjong { private Suite suite; private int face; private Image image; /** * 构造器 * * @param su

Week12《java程序设计》第12次作业总结

Week12<java程序设计>第12次作业总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何使用流与文件改造你的系统.文件中数据的格式如何? 答:在注册登录模块中,在用户仓库中无法找到的用户,使用对象流和缓冲流查找对应文件是否存在,不存在就进行注册.从文件中读取影虎的登录信息.登录成功后,使用组合过滤流读取用户的书库信息. 2.2 简述系

20145239杜文超 《Java程序设计》第10周学习总结

20145239 <Java程序设计>第10周学习总结 教材学习内容总结 Java的网络编程 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据. 网络概述 1.计算机网络概述 (1)路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控制等,通过光纤.网线等连接将设备连接起来,从而形成了一张巨大的计算机网络. (2)网络最主要的优势在于共享:共享设备和数据,现在共享设备最常见的是打印机. (3)IP地址:为了能够方便的识别网络上的每个设备,网络中的每个设备

20145310 《Java程序设计》第10周学习总结

20145310 <Java程序设计>第10周学习总结 教材学习内容总结 网络概述 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴.在发送和接收数据时,大部分的程序设计语言都设计了专门的API实现这些功能,程序员只需要调用即可. 网络中的每个设备都会有一个唯一的数字标识,这个就是IP地址.在计算机网络中,现在命名IP地址的规定是IPv4协议,该协议规定每个IP地址由4个0-255之间的数

Java程序设计总复习题

 Java程序设计总复习题 1.编写一个Java程序在屏幕上输出"你好!".(p13,例1-1) //programme name Helloworld.java public class Helloworld { public static void main(String args[]) { System.out.print ("你好!" ); } } 2. 编写一个Java程序,用if-else语句判断某年份是否为闰年. // Programme Name L

20155208徐子涵 2016-2017-2 《Java程序设计》第6周学习总结

20155208徐子涵 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 10.1.1 1.Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象. 2.若要将数据从来源中取出,可以使用输入串流:若要将数据写入目的地,可以使用输出串流.在java中,输入串流代表对象为java.in.InputStream的实例:输出串流代表对象为java.io.Outputstream的实例. 3.read()方法每次尝试读取数据,并返回实际读入的,只要不是负一

20155336 2016-2017-2《JAVA程序设计》第一周学习总结

# 20155336  2016-2017-2<JAVA程序设计>第1周学习总结 ## 教材学习内容总结 开学的第一周,带着些许的欣喜和好奇,听完了老师的第一堂课.说心里话学习JAVA仿佛观看一部英文影视作品一样头疼, 因为总会有许许多多相似的名字让你记得晕头转向.JAVA也是一样,什么JVM啊JRE啊JDK啊 (/(ㄒoㄒ)/~~)  等等一系列 的英文缩写,让人心神意乱~~但总体上对JAVA有了一个初步的了解.通过课上老师的介绍以及课下对JAVA书第一章的浏览, 我简单的了解了JAVA艰辛

20155335俞昆《java程序设计》第十周总结

学号 2016-2017-2 <Java程序设计>第十周学习总结 ## 事实上网络编程,我们可以简单的理解为两台计算机相互通讯数据而已,对于程序员而言,掌握一种编程接口并使用一种编程模型相对而言就简单多了,javaSDK提供了一些相对简单的Api来完成12这些工作,Socket就是其中之一,对于java而言,Api的存在和java.net包里面.因此只要导入这个包就可以准备网络编程了. 客户机到服务机的模型就是网络编程的基本模型,简单的说就是引进这两个进程之间的相互通信,其中一个必须提供固定的