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;
}
}

JAVA程序设计(12.3)---- 监听器0基础应用:五子棋的更多相关文章

  1. JAVA程序设计(11)-----面对对象0基础设计 麻将 创建麻将牌 然后洗牌 发牌~ 恩 就这样

    zzzzZZZZ 1.開始还想贴图的 实在太懒了-- 这是一张麻将 package com.lovo; import java.awt.Graphics; import java.awt.Image; ...

  2. Java 入门课程视频实战-0基础 上线了,猜拳游戏,ATM实战,欢迎围观

    Java 入门课程视频实战-0基础 已经上传完了.欢迎小伙伴们过来围观 直接进入: http://edu.csdn.net/course/detail/196 课程文件夹例如以下: 1 初识Java  ...

  3. 《Java程序设计》第三章-基础语法

    20145221<Java程序设计>第三章-基础语法 总结 教材学习内容总结 类型.变量与运算符 类型 Java可区分为基本类型(Primitive Type)和类类型(Class Typ ...

  4. Java程序设计的DOS命令基础

    Java程序设计的DOS命令基础 用户使用操作系统和软件有两种方式:命令行界面(Command Line Interface,CLI)和图形界面(Graphical User Interface,GU ...

  5. 20155304 2016-2017-2 《Java程序设计》第三周学习总结

    20155304 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 第四章 类与对象 定义: 对象(Object):存在的具体实体,具有明确的状态和行为. 类( ...

  6. 20145221 《Java程序设计》第二周学习总结

    20145221 <Java程序设计>第二周学习总结 教材学习内容总结 第二周内容已在假期完成,详见博客: <Java程序设计>第三章-基础语法 代码调试中的问题和解决过程 第 ...

  7. 【转】WF4.0 (基础篇)

    转自:http://www.cnblogs.com/foundation/category/215023.html 作者:WXWinter  ——  兰竹菊梅★春夏秋冬☆ —— wxwinter@16 ...

  8. 20145219 《Java程序设计》实验四 Android开发基础设计实验报告

    20145219 <Java程序设计>实验四 Android开发基础设计实验报告 实验内容 安装Andriod Studio并配置软件 使用Andriod Studio软件实现Hello ...

  9. 201521123082 《Java程序设计》第12周学习总结

    201521123082 <Java程序设计>第12周学习总结 标签(空格分隔): java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. An ...

随机推荐

  1. JavaScript正则表达式-反向引用

    使用括号“()”进行分组,使子表达式(子模式)可以作为整体独立被修饰,子表达式所匹配的结果会被记录下来并可以单独被访问. /(a(b(cd){2})+)EF/ 则各引用分别对应: \1  对应(a(b ...

  2. HUD--2553 N皇后问题

    Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N, ...

  3. HTTP/1.1协议支持的8种请求方法

    方法 说明 GET 获取资源 POST 传输实体主体 PUT 传输文件 DELETE 删除文件 HEAD 获得报文首部 OPTIONS 询问支持的方法 TRACE 追踪路径 CONNECT 要求用隧道 ...

  4. Leetcode 331.验证二叉树的前序序列化

    验证二叉树的前序序列化 序列化二叉树的一种方法是使用前序遍历.当我们遇到一个非空节点时,我们可以记录下这个节点的值.如果它是一个空节点,我们可以使用一个标记值记录,例如#. 例如,上面的二叉树可以被序 ...

  5. [android篇]声明权限

    要实施您自己的权限,必须先使用一个或多个 <permission> 元素在 AndroidManifest.xml 中声明它们. 实际上,在开发过程中,当我们使用了某些系统特性的功能,且此 ...

  6. [luoguP2221] [HAOI2012]高速公路(线段树)

    传送门 考虑每一段对答案的贡献 用每一段的左端点来表示当前这一段,那么区间就变成了[1,n-1] 如果询问区间[l,r],其中一个点的位置为x,则它对答案的贡献为(x-l)*(r-x)*s[x](s[ ...

  7. cf21D Traveling Graph

    You are given undirected weighted graph. Find the length of the shortest cycle which starts from the ...

  8. asp.net 错误 类型"xxxxx"同时存在于"xxx.dll"和"xxxx.dll" 中

    http://walttoney.blog.163.com/blog/static/127685797201051112839328/错误 类型“System.Web.UI.ScriptManager ...

  9. ElasticSearch分词器

    什么是分词器? 分词器,是将用户输入的一段文本,分析成符合逻辑的一种工具.到目前为止呢,分词器没有办法做到完全的符合人们的要求.和我们有关的分词器有英文的和中文的.英文的分词器过程:输入文本-关键词切 ...

  10. hdu 1717

    小数化分数2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...