java AWT 五子棋
来源:互联网 发布:苹果下软件赚钱的软件 编辑:程序博客网 时间:2024/06/06 19:19
Frame来绘图更新时会有闪烁,JFrame做为窗口,JPanel实现画图区可以避闪烁。
package javaAWT;import java.awt.CheckboxMenuItem;import java.awt.Dimension;import java.awt.Graphics;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionListener;import java.awt.image.BufferedImage;import java.io.File;import javax.imageio.ImageIO;import javax.swing.JFrame;import javax.swing.JPanel;public class Gobang { // 定义代表棋盘,黑子,白子 位图 BufferedImage table; BufferedImage black; BufferedImage white; //当鼠标移动时的选择框 BufferedImage selected; // 棋盘大小,每行列棋子个数 private static int BOARD_SIZE = 15; private final int TABLE_WIDTH = 535; private final int TABLE_HEIGHT = 536; // 定义棋盘坐标的像素值和棋盘数组之间的比率 private final int RATE = TABLE_WIDTH / BOARD_SIZE; // 定义棋盘坐标的像素值和棋盘数组之间的偏移距离 private final int X_OFFSET = 5; private final int Y_OFFSET = 6; // 定义一个二维数组来充当棋盘 private String[][] board = new String[BOARD_SIZE][BOARD_SIZE]; // 游戏窗口 JFrame frame = new JFrame("Gobang"); // 棋盘对应的Canvase组件 ChessBoard chessBoard = new ChessBoard(); //当前选中点的坐标 private int selectedX = -1; private int selectedY = -1; public void init() throws Exception{ table = ImageIO.read(new File("image/board.jpg")); black = ImageIO.read(new File("image/black.gif")); white = ImageIO.read(new File("image/white.gif")); selected = ImageIO.read(new File("image/selected.gif")); // 把每个元素赋值为“+”,代表没有棋子 for(int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { board[i][j] = "+"; } } chessBoard.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT)); chessBoard.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub super.mouseClicked(e); // 将用户鼠标事件的坐标转换成棋子数组的坐标 int xPos = (int)((e.getX() - X_OFFSET) / RATE); int yPos = (int)((e.getY() - Y_OFFSET) / RATE); board[xPos][yPos] = "o"; /* * 电脑随机生成两个整数,作为电脑下棋的坐标, * 1.如果下棋的点已经有棋子,不能重复下棋 * 2.每次下棋后,需要扫描谁赢了 * */ chessBoard.repaint(); } // 当鼠标退出棋盘区后,复位选中点的坐标 @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub super.mouseExited(e); selectedX = -1; selectedY = -1; } }); chessBoard.addMouseMotionListener(new MouseMotionListener() { @Override public void mouseMoved(MouseEvent e) { // TODO Auto-generated method stub // 当鼠标移动时,改变选中点的坐标 selectedX = (e.getX() - X_OFFSET) / RATE; selectedY = (e.getY() - Y_OFFSET) / RATE; chessBoard.repaint(); } @Override public void mouseDragged(MouseEvent e) { // TODO Auto-generated method stub } }); frame.add(chessBoard); frame.pack(); frame.setVisible(true); } class ChessBoard extends JPanel { //重写JPanel的paint方法,实现绘图 @Override public void paint(Graphics g) { // TODO Auto-generated method stub super.paint(g); // 绘制棋盘 g.drawImage(table, 0, 0, null); // 绘制选中点的红框 if (selectedX >= 0 && selectedY >= 0) { g.drawImage(selected, selectedX * RATE + X_OFFSET, selectedY * RATE + Y_OFFSET, null); } // 遍历数组,绘制棋子 for (int i = 0; i < BOARD_SIZE; i++) { for(int j = 0; j < BOARD_SIZE; j++) { // 绘制黑棋 if (board[i][j].equals("o")) { g.drawImage(black, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null); } // 绘制白棋 if (board[i][j].equals("O")) { g.drawImage(white, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null); } } } } } public static void main(String[] args) throws Exception { Gobang gobang = new Gobang(); gobang.init(); }}
阅读全文
0 0
- java AWT 五子棋
- java.awt
- java.awt
- java awt
- java-awt
- Java AWT
- java awt
- java五子棋
- JAVA五子棋
- java 五子棋
- Java五子棋
- java 五子棋
- java 五子棋
- 五子棋JAVA
- Java五子棋
- Java五子棋
- java五子棋
- java 五子棋
- 线段树入门&lazy思想
- 采用eclipse作为IDLE,python或anaconda作为编译器 的配置方法
- [LeetCode] 递归求解二叉树路径之和是否等于给定值(2)
- UVA-11600-Masud Rana
- mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by
- java AWT 五子棋
- Http+servlet
- Redis学习(一)-----初识redis
- 基本数据类型参数的传值
- python3.6.1环境配置出现Requirement already up-to-date: pip in c:\python36\lib\site-packages决解方案
- 51Nod 1499 图(最小割+边在割的一边有收益建图)
- <设计模式可复用面向对象软件的基础> [2.4]、装饰者模式(C#)
- 输入Scanner的用法
- Rhyme/Linux 权限管理 特殊文件权限SetUID的解析、使用与注意事项