自己测试10多遍一次都没通过,老是存在问题,但是日期要截止了,现在来求一个代码。



下午好🌅🌅🌅
本答案参考ChatGPT-3.5
首先,针对五子棋游戏题目,我们可以考虑以下解决方案:
1.设计游戏界面与游戏逻辑:通过界面设计和游戏规则实现游戏的展示和运行, 需要注意在界面的设计中要将地图、棋子的显示以及落子等操作考虑进去 。
2.编写游戏逻辑代码:编写五子棋游戏的逻辑,包括棋子的移动、胜利判断等, 需要注意边界的判断 。
3.实现人机对战:实现人机对战的代码,比如 AI 算法等, 应该要注意难度设置、能否落子等问题 。
4.实现联网对战:实现联网对战的代码,包括多种方式,比如聊天、棋盘更新以及棋子落点的同步等。
以下是一份可用五子棋游戏代码示例:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.*;
public class Gobang{
// 棋盘大小
private int broadSize = 15;
// 棋子大小
private int chessSize = 30;
// 棋盘起始坐标
private int broadStart = 50;
// 棋盘间隔距离
private int broadGap = 35;
// 当前选中的点
private Point point = null;
// 当前棋子颜色
private int nowPlayerColor = 1;
// 游戏是否结束
private boolean isOver = false;
// 游戏记录
private int[][] record = new int[broadSize][broadSize];
// 记录全部可交互点
private ArrayList<Point> broadPoint = new ArrayList<>();
public void clear(){
// 初始化棋盘
nowPlayerColor = 1;
isOver = false;
point = null;
for(int i = 0; i < broadSize; i++){
for(int j = 0; j < broadSize; j++){
record[i][j] = 0;
}
}
}
private void initBroad(Graphics g){
// 绘制棋盘
g.setColor(Color.LIGHT_GRAY);
// 绘制横向线
for(int i = 0; i < broadSize; i++){
g.drawLine(broadStart, broadStart + i * broadGap, broadStart + (broadSize - 1) * broadGap, broadStart + i * broadGap);
}
// 绘制竖向线
for(int j = 0; j < broadSize; j++){
g.drawLine(broadStart + j * broadGap, broadStart, broadStart + j * broadGap, broadStart + (broadSize - 1) * broadGap);
}
// 初始化记录的可交互点
for(int i = 0; i < broadSize; i++){
for(int j = 0; j < broadSize; j++){
Point p = new Point(i, j);
broadPoint.add(p);
}
}
}
private void drawChess(Graphics g, Point p, int color){
// 绘制棋子
int x = broadStart + p.x * broadGap - chessSize / 2;
int y = broadStart + p.y * broadGap - chessSize / 2;
if(color == 1){
g.setColor(Color.BLACK);
}
else{
g.setColor(Color.WHITE);
}
g.fillOval(x, y, chessSize, chessSize);
}
private void playChess(Graphics g){
// 状态检测
if(isOver){
return;
}
// 未选中时,返回
if(point == null){
return;
}
// 当前位置上已经有棋子了,返回
if(record[point.x][point.y] != 0){
return;
}
// 更新棋盘信息
record[point.x][point.y] = nowPlayerColor;
drawChess(g, point, nowPlayerColor);
// 棋子颜色切换
if(nowPlayerColor == 1){
nowPlayerColor = 2;
}
else{
nowPlayerColor = 1;
}
}
private boolean isWin(){
// 判断是否有一方获胜
int result = 0;
// 横向
for(int i = 0; i <= broadSize - 5; i++){
for(int j = 0; j < broadSize; j++){
result = record[i][j] + record[i + 1][j] + record[i + 2][j] + record[i + 3][j] + record[i + 4][j];
if(result == 5 || result == 10){
return true;
}
}
}
// 竖向
for(int i = 0; i < broadSize; i++){
for(int j = 0; j <= broadSize - 5; j++){
result = record[i][j] + record[i][j + 1] + record[i][j + 2] + record[i][j + 3] + record[i][j + 4];
if(result == 5 || result == 10){
return true;
}
}
}
// 对角线
for(int i = 0; i <= broadSize - 5; i++){
for(int j = 0; j <= broadSize - 5; j++){
result = record[i][j] + record[i + 1][j + 1] + record[i + 2][j + 2] + record[i + 3][j + 3] + record[i + 4][j + 4];
if(result == 5 || result == 10){
return true;
}
}
}
for(int i = 0; i <= broadSize - 5; i++){
for(int j = broadSize - 1; j >= 4 ; j--){
result = record[i][j] + record[i + 1][j - 1] + record[i + 2][j - 2] + record[i + 3][j - 3] + record[i + 4][j - 4];
if(result == 5 || result == 10){
return true;
}
}
}
return false;
}
public void go(){
JFrame mainFrame = new JFrame("五子棋游戏");
mainFrame.setSize(650, 650);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(null);
mainFrame.add(mainPanel);
mainFrame.setVisible(true);
BufferedImage image = new BufferedImage(650, 650, BufferedImage.TYPE_INT_BGR);
Graphics g = image.getGraphics();
clear();
initBroad(g);
isOver = false;
// 绘制logo
try {
BufferedImage img = ImageIO.read(new File("logo.jpg"));
g.drawImage(img, broadStart + broadGap * 5 - img.getWidth() / 2, broadStart + broadGap * 6 - img.getHeight() / 2 , null);
} catch (IOException e) {
e.printStackTrace();
}
JPanel showPanel = new JPanel(){
public void paint(Graphics g){
g.drawImage(image, 0, 0, null);
}
};
showPanel.setBounds(0, 0, 650, 650);
showPanel.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e){
// 将点击位置转换成棋子的位置
int x = e.getX();
int y = e.getY();
// 判断点击的位置是否在棋盘内
if(x >= broadStart - chessSize && x < broadStart + broadGap * (broadSize - 1) + chessSize && y >= broadStart - chessSize && y < broadStart + broadGap * (broadSize - 1) + chessSize){
// 选择最近的交点
int i = Math.round((float)(x - broadStart) / broadGap);
int j = Math.round((float)(y - broadStart) / broadGap);
if(i >= 0 && i <= broadSize && j >= 0 && j <= broadSize){
for(Point p: broadPoint){
if(p.x == i && p.y == j)
point = p;
}
}
}
// 执行落子逻辑
playChess(g);
// 获胜判断
if(isWin()){
JOptionPane.showMessageDialog(null, "玩家" + nowPlayerColor + "获胜");
isOver = true;
}
}
});
mainPanel.add(showPanel);
JMenuBar menuBar = new JMenuBar();
mainPanel.add(menuBar);
JMenu gameMenu = new JMenu("游戏");
menuBar.add(gameMenu);
JMenuItem clearItem = new JMenuItem("重新开始");
clearItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 需要重新绘制棋盘
clear();
g.clearRect(0, 0, 650, 650);
initBroad(g);
isOver = false;
showPanel.repaint();
}
});
gameMenu.add(clearItem);
JMenuItem exitItem = new JMenuItem("退出");
exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
gameMenu.add(exitItem);
JLabel nowPlayer = new JLabel("当前玩家:黑棋");
nowPlayer.setBounds(500, 20, 100, 30);
mainPanel.add(nowPlayer);
mainFrame.setVisible(true);
// 启动时显示状态
showPanel.repaint();
nowPlayer.setText("当前玩家:黑棋");
}
public static void main(String[] args){
new Gobang().go();
}
}