java drawboard_java五子棋代如何实现点击棋盘显示出棋子的事件

展开全部

以下的code只是使用了很简单的Graphic2D, 加入背景, 用棋子图片代替62616964757a686964616fe59b9ee7ad9431333264623837黑色和白色的圈, 再加入胜利判定应该就是个很完整的五子棋游戏了.

左上角的菜单可以清空棋盘/退出程序.

修改以下的值可以调整棋盘有几行,几列,以及每个方格的边长.

private final static int ROWS = 20;

private final static int COLUMNS = 30;

private final static int SIDE = 32;

希望有帮助.

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import javax.swing.JFrame;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

@SuppressWarnings("serial")

public class GomokuBlackWhite extends JPanel

implements ActionListener, MouseListener {

private enum Pieces {

WHITE,

BLACK,

NOT_USED;

}

private final static int ROWS = 20;

private final static int COLUMNS = 30;

private final static int SIDE = 32;

private boolean isBlack;

private Graphics2D g2d;

private Pieces[][] pieces;

private static JFrame frame;

private static JMenuBar menuBar;

public GomokuBlackWhite () {

isBlack = true;

pieces = new Pieces[COLUMNS - 1][ROWS - 1];

frame = new JFrame();

menuBar = new JMenuBar();

JMenu menu = new JMenu("Game");

JMenuItem resetAction = new JMenuItem("Reset");

JMenuItem exitAction = new JMenuItem("Exit");

resetAction.addActionListener(this);

exitAction.addActionListener(this);

menu.add(resetAction);

menu.add(exitAction);

menuBar.add(menu);

resetBoard();

setPreferredSize(new Dimension(COLUMNS * SIDE, ROWS * SIDE));

addMouseListener(this);

}

@Override

public void paintComponent(Graphics g) {

super.paintComponent(g);

g2d = (Graphics2D) g;

drawBoard(g2d);

drawPieces(g2d);

}

@Override

public void actionPerformed(ActionEvent e) {

if (e.getActionCommand().equals("Reset")) {

resetBoard();

this.repaint();

}

else

frame.dispose();

}

@Override

public void mouseClicked(MouseEvent e) {

updateBoard(e.getX(), e.getY());

this.repaint();

}

@Override

public void mouseEntered(MouseEvent e) {

}

@Override

public void mouseExited(MouseEvent e) {

}

@Override

public void mousePressed(MouseEvent e) {

}

@Override

public void mouseReleased(MouseEvent e) {

}

private void drawBoard(Graphics2D g) {

g.drawLine(0, 0, COLUMNS * SIDE, 0);

g.drawLine(0, ROWS * SIDE, COLUMNS * SIDE, ROWS * SIDE);

g.drawLine(0, 0, 0, ROWS * SIDE);

g.drawLine(COLUMNS * SIDE, 0 * SIDE, COLUMNS * SIDE, ROWS * SIDE);

for (int i = 1; i < ROWS; i++) {

g.drawLine(0, SIDE * i, SIDE / 2, SIDE * i);

g.drawLine(COLUMNS * SIDE - (SIDE / 2), SIDE * i,

COLUMNS * SIDE, SIDE * i);

}

for (int j = 1; j < COLUMNS; j++) {

g.drawLine(SIDE * j, 0, SIDE * j, SIDE / 2);

g.drawLine(SIDE * j, SIDE * ROWS - (SIDE / 2),

j * SIDE, ROWS * SIDE);

}

for (int i = 0; i < COLUMNS - 1; i++) {

for (int j = 0; j < ROWS - 1; j++) {

if (pieces[i][j] == Pieces.NOT_USED) {

g.drawLine((SIDE / 2) + (i * SIDE),

(j + 1) * SIDE,

((SIDE / 2) + ((i + 1) * SIDE)),

(j + 1) * SIDE);

g.drawLine((i + 1) * SIDE,

(SIDE / 2) + (j * SIDE),

(i + 1) * SIDE,

(SIDE / 2) + ((j + 1) * SIDE));

}

}

}

}

private void drawPieces(Graphics2D g) {

for (int i = 0; i < COLUMNS - 1; i++) {

for (int j = 0; j < ROWS - 1; j++) {

if (pieces[i][j] != Pieces.NOT_USED) {

int x = i * SIDE;

int y = j * SIDE;

if (pieces[i][j] == Pieces.BLACK) {

g.fillOval(x + (SIDE / 2), y + (SIDE / 2), SIDE, SIDE);

}

if (pieces[i][j] == Pieces.WHITE) {

g.drawOval(x + (SIDE / 2), y + (SIDE / 2), SIDE, SIDE);

}

}

}

}

}

private void updateBoard(int x, int y) {

int centreX, centreY;

if (x % SIDE <= SIDE / 2) {

centreX = x / SIDE - 1;

}

else {

centreX = x / SIDE;

}

if (y % SIDE <= SIDE / 2) {

centreY = y / SIDE - 1;

}

else {

centreY = y / SIDE;

}

if (centreX < 0 || centreY < 0 || centreX > (COLUMNS - 2)

|| centreY > (ROWS - 2)) {

JOptionPane.showMessageDialog(null,

"You cannot place a piece here.");

}

else {

if (pieces[centreX][centreY] != Pieces.NOT_USED) {

JOptionPane.showMessageDialog(null,

"You cannot place a piece above another one.");

}

else {

pieces[centreX][centreY] =

(isBlack) ? Pieces.BLACK : Pieces.WHITE;

isBlack = !isBlack;

this.repaint();

}

}

}

private void resetBoard() {

for (int i = 0; i < COLUMNS - 1; i++) {

for (int j = 0; j < ROWS - 1; j++) {

pieces[i][j] = Pieces.NOT_USED;

}

}

}

private static void createAndShowGUI() {

JPanel panel = new GomokuBlackWhite();

frame.setTitle("Connect Five");

frame.setJMenuBar(menuBar);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(panel);

frame.pack();

frame.setResizable(false);

frame.setVisible(true);

}

public static void main(String[] args) {

javax.swing.SwingUtilities.invokeLater(new Runnable() {

public void run() {

createAndShowGUI();

}

});

}

}

本回答由提问者推荐

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是五子棋绘制棋盘和有颜色棋子的C语言码示例: ``` #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> #define BOARD_SIZE 15 // 棋盘大小 #define BLACK 'X' // 黑色棋子 #define WHITE 'O' // 白色棋子 void DrawBoard(char board[][BOARD_SIZE]); void PutChess(char board[][BOARD_SIZE], int x, int y, char player); int main() { char board[BOARD_SIZE][BOARD_SIZE] = {0}; // 棋盘初始化 DrawBoard(board); // 绘制棋盘 PutChess(board, 7, 7, BLACK); // 在(7,7)处放置一颗黑色棋子 PutChess(board, 6, 6, WHITE); // 在(6,6)处放置一颗白色棋子 DrawBoard(board); // 重新绘制棋盘显示棋子 return 0; } // 绘制棋盘 void DrawBoard(char board[][BOARD_SIZE]) { system("cls"); // 清屏 // 绘制列号 printf(" "); for (int i = 0; i < BOARD_SIZE; i++) { printf("%2d", i + 1); } printf("\n"); // 绘制横线和行号及棋子 for (int i = 0; i < BOARD_SIZE; i++) { printf("%2d", i + 1); for (int j = 0; j < BOARD_SIZE; j++) { if (board[i][j] == BLACK) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED); printf(" %c", board[i][j]); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); } else if (board[i][j] == WHITE) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN); printf(" %c", board[i][j]); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); } else { printf(" +"); } } printf("\n"); } } // 放置棋子 void PutChess(char board[][BOARD_SIZE], int x, int y, char player) { if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE) { printf("无效的位置\n"); return; } if (board[x][y] == BLACK || board[x][y] == WHITE) { printf("此处已有棋子\n"); return; } board[x][y] = player; } ``` 注意:此码只是演示如何绘制棋盘和放置棋子,并未实现完整的五子棋游戏逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值