提交 fd0505a4 编写于 作者: 下唐人's avatar 下唐人

Initial commit

上级 b38d11e6
### IntelliJ IDEA ###
out/
!**/src/main/**/out/
!**/src/test/**/out/
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store
\ No newline at end of file
# Default ignored files
/shelf/
/workspace.xml
<component name="ArtifactManager">
<artifact name="java1:jar">
<output-path>$PROJECT_DIR$/java1_jar</output-path>
<root id="root">
<element id="archive" name="java1.jar">
<element id="module-output" name="java1" />
</element>
</root>
</artifact>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/java1.iml" filepath="$PROJECT_DIR$/java1.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
Manifest-Version: 1.0
Main-Class: Main
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.TimerTask;
public class Main {
public static JFrame myframe;
public static JPanel mainscreen;
public static int[][] allwzq = new int[19][19];
public static String xinxi = "白方下棋";
public static boolean is_black = true;
public static boolean is_finished = false;
public static int max_time = 0;
public static int black_time = 0;
public static int white_time = 0;
public static String black_msg = "无限制";
public static String white_msg = "无限制";
public static void main(String[] args) {
myframe = new MyFrame();
}
}
class MyFrame extends JFrame {
public MyFrame() {
setTitle("五子棋");
setLayout(null);
setSize(700, 550);
setLocation(500, 0);
Main.mainscreen = new MainScreen();
Main.mainscreen.setBounds(0, 0, 700, 550);
add(Main.mainscreen);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class MainScreen extends JPanel implements ActionListener, MouseListener {
JButton btn_start, btn_giveUp, btn_exit, btn_setting, btn_about;
public int msg_num = 9;
public JLabel title_label;
public JLabel[] msg_labels = new JLabel[msg_num];
public JPanel map_panel;
public String[] msg_texts = new String[msg_num];
public MainScreen() {
initial_allwzq();
setLayout(null);
// 绘制棋盘范围:(5, 5, 500, 500)
map_panel = new MapPanel();
map_panel.setBounds(5, 5, 500, 500);
map_panel.setOpaque(true);
map_panel.setBackground(Color.lightGray);
this.add(map_panel);
title_label = new JLabel("五子棋");
title_label.setBounds(530, 80, 130, 30);
title_label.setBackground(Color.LIGHT_GRAY);
title_label.setOpaque(true);
this.add(title_label);
btn_start = new JButton("开始");
btn_start.setBounds(530, 130, 130, 50);
btn_start.setMargin(new Insets(0, 0, 0, 0));
btn_start.addActionListener(this);
this.add(btn_start);
btn_giveUp = new JButton("认输");
btn_giveUp.setBounds(530, 180, 130, 50);
btn_giveUp.setMargin(new Insets(0, 0, 0, 0));
btn_giveUp.addActionListener(this);
this.add(btn_giveUp);
btn_exit = new JButton("退出");
btn_exit.setBounds(530, 230, 130, 50);
btn_exit.setMargin(new Insets(0, 0, 0, 0));
btn_exit.addActionListener(this);
this.add(btn_exit);
btn_setting = new JButton("设置");
btn_setting.setBounds(530, 280, 130, 50);
btn_setting.setMargin(new Insets(0, 0, 0, 0));
btn_setting.addActionListener(this);
this.add(btn_setting);
btn_about = new JButton("关于");
btn_about.setBounds(530, 330, 130, 50);
btn_about.setMargin(new Insets(0, 0, 0, 0));
btn_about.addActionListener(this);
this.add(btn_about);
this.addMouseListener(this);
java.util.Timer timer = new java.util.Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
if(Main.black_time > 0 && Main.is_black && !Main.is_finished) {
Main.black_time -= 1;
Main.black_msg = Main.black_time / 3600 + ":" + (Main.black_time/60 - Main.black_time/3600*60) + ":" + (Main.black_time-Main.black_time/60*60);
Main.mainscreen.repaint();
if(Main.black_time == 0) {
Main.is_finished = true;
JOptionPane.showMessageDialog(Main.mainscreen, "游戏结束,红方胜利!");
}
}
if(Main.white_time > 0 && !Main.is_black && !Main.is_finished) {
Main.white_time -= 1;
Main.white_msg = Main.white_time / 3600 + ":" + (Main.white_time/60 - Main.white_time/3600*60) + ":" + (Main.white_time-Main.white_time/60*60);
Main.mainscreen.repaint();
if(Main.white_time == 0) {
Main.is_finished = true;
JOptionPane.showMessageDialog(Main.mainscreen, "游戏结束,白方胜利!");
}
}
}
}, 1000, 1000);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == btn_start) {
int result = JOptionPane.showConfirmDialog(this, "是否重新开始游戏?");
if(result == 0) {
// 重新开始游戏
// (1)把棋盘清空
// (2)把游戏参数复位到初始值
intial_parameters();
}
}
if(e.getSource() == btn_giveUp) {
int result = JOptionPane.showConfirmDialog(this, "是否确认认输?");
if(result == 0) {
if(Main.is_black) {
JOptionPane.showMessageDialog(this, "白方已经认输,游戏结束!");
} else {
JOptionPane.showMessageDialog(this, "红方已经认输,游戏结束!");
}
// 棋局结束,单击【 开始 】可重新开始游戏
Main.is_finished = true;
}
}
if(e.getSource() == btn_exit) {
int result = JOptionPane.showConfirmDialog(this, "要退出游戏吗?");
if(result == 0) {
System.exit(0);
}
}
if(e.getSource() == btn_setting) {
String input = JOptionPane.showInputDialog(this, "请输入游戏的最大时间(单位:分钟):");
try {
Main.max_time = Integer.parseInt(input) * 60;
// 提示输入每方每次落子的最大时限,0表示无限制
intial_parameters_with_dialog();
} catch (NumberFormatException e2) {
JOptionPane.showMessageDialog(this, "请正确输入时间!");
}
}
if(e.getSource() == btn_about) {
JOptionPane.showMessageDialog(this, "制作者:下唐人\n制作时间:2023年9月");
}
}
public void initial_allwzq() {
for(int i = 0; i < 19; i++) {
for(int j = 0; j < 19; j++) {
Main.allwzq[i][j] = 0;
}
}
}
public void intial_parameters_with_dialog() {
if(Main.max_time < 0) {
JOptionPane.showMessageDialog(this, "时间不允许负数!");
}
if(Main.max_time == 0) {
int r = JOptionPane.showConfirmDialog(this, "设置完成,重新开始游戏!");
if(r == 0) {
initial_allwzq();
Main.xinxi = "白方先行";
Main.is_black = true;
Main.black_time = Main.max_time;
Main.white_time = Main.max_time;
Main.black_msg = "无限制";
Main.white_msg = "无限制";
Main.is_finished = false;
this.repaint();
}
}
if(Main.max_time > 0) {
int r = JOptionPane.showConfirmDialog(this, "设置完成,重新开始游戏!");
if(r == 0) {
initial_allwzq();
Main.xinxi = "白方先行";
Main.is_black = true;
Main.black_time = Main.max_time;
Main.white_time = Main.max_time;
Main.black_msg = Main.max_time / 3600 + ":" + (Main.max_time/60 - Main.max_time/3600*60) + ":" + (Main.max_time-Main.max_time/60*60);
Main.white_msg = Main.max_time / 3600 + ":" + (Main.max_time/60 - Main.max_time/3600*60) + ":" + (Main.max_time-Main.max_time/60*60);
Main.is_finished = false;
this.repaint();
}
}
}
public void intial_parameters() {
if(Main.max_time < 0) {
JOptionPane.showMessageDialog(this, "时间不允许负数!");
}
if(Main.max_time == 0) {
initial_allwzq();
Main.xinxi = "白方先行";
Main.is_black = true;
Main.black_time = Main.max_time;
Main.white_time = Main.max_time;
Main.black_msg = "无限制";
Main.white_msg = "无限制";
Main.is_finished = false;
this.repaint();
}
if(Main.max_time > 0) {
initial_allwzq();
Main.xinxi = "白方先行";
Main.is_black = true;
Main.black_time = Main.max_time;
Main.white_time = Main.max_time;
Main.black_msg = Main.max_time / 3600 + ":" + (Main.max_time/60 - Main.max_time/3600*60) + ":" + (Main.max_time-Main.max_time/60*60);
Main.white_msg = Main.max_time / 3600 + ":" + (Main.max_time/60 - Main.max_time/3600*60) + ":" + (Main.max_time-Main.max_time/60*60);
Main.is_finished = false;
this.repaint();
}
}
@Override
public void mouseClicked(MouseEvent mouseEvent) {
}
@Override
public void mousePressed(MouseEvent e) {
// 如果对局已经结束,则不响应
if(Main.is_finished) {
return;
}
// 获取鼠标点击位置在棋盘上的映射
int x = (e.getX() - 65 + 10) / 20;
int y = (e.getY() - 85 + 10) / 20;
System.out.println(e.getX() + "," + e.getY() + "=(" + x + "," + y + ")");
// 棋盘四方最边上的线不能落子
if(x >= 1 && x <= 17 && y >= 1 && y <= 17) {
if(Main.is_black) {
if (Main.allwzq[x][y] != 0 ) { return; }
// 白方落子
Main.allwzq[x][y] = 1;
// 统计白方是否胜利
boolean flag1 = is_win(1, x, y);
if(flag1) {
Main.is_finished = true;
JOptionPane.showMessageDialog(this, "游戏结束,白方胜利!");
}
} else {
if (Main.allwzq[x][y] != 0 ) { return; }
// 红方落子
Main.allwzq[x][y] = 2;
// 统计红方是否胜利
boolean flag2 = is_win(2, x, y);
if(flag2) {
Main.is_finished = true;
JOptionPane.showMessageDialog(this, "游戏结束,红方胜利!");
}
}
if(Main.is_black) {
Main.is_black = false;
Main.xinxi = "红方落子";
Main.black_time = Main.max_time;
Main.black_msg = Main.max_time / 3600 + ":" + (Main.max_time/60 - Main.max_time/3600*60) + ":" + (Main.max_time-Main.max_time/60*60);
} else {
Main.is_black = true;
Main.xinxi = "白方落子";
Main.white_time = Main.max_time;
Main.white_msg = Main.max_time / 3600 + ":" + (Main.max_time/60 - Main.max_time/3600*60) + ":" + (Main.max_time-Main.max_time/60*60);
}
this.repaint();
}
}
public boolean is_win(int color, int x, int y) {
// 判断横向
int count = 0;
for(int i = 1; i <= 17; i++) {
if(Main.allwzq[i][y] == color) {
count++;
if(count == 5) {
return true;
}
}
if(Main.allwzq[i][y] != color) {
count = 0;
}
}
// 判断纵向
count = 0;
for(int i = 1; i <= 17; i++) {
if(Main.allwzq[x][i] == color) {
count++;
if(count == 5) {
return true;
}
}
if(Main.allwzq[x][i] != color) {
count = 0;
}
}
// 判断左上到右下
count = 0;
int start_x = x, start_y = y;
if(x >= y) {
start_x = x - y + 1;
start_y = 1;
while(start_x <= 17) {
if(Main.allwzq[start_x][start_y] == color) {
count++;
if(count == 5) {
return true;
}
}
if(Main.allwzq[start_x][start_y] != color) {
count = 0;
}
start_x++;
start_y++;
}
}
if(x < y) {
start_x = 1;
start_y = y - x + 1;
while(start_y <= 17) {
if(Main.allwzq[start_x][start_y] == color) {
count++;
if(count == 5) {
return true;
}
}
if(Main.allwzq[start_x][start_y] != color) {
count = 0;
}
start_x++;
start_y++;
}
}
// 判断右上到左下
count = 0;
start_x = x;
start_y = y;
if(x <= 17 - y + 1) {
start_x = x + y - 1;
start_y = 1;
while(start_x >= 1) {
if(Main.allwzq[start_x][start_y] == color) {
count++;
if(count == 5) {
return true;
}
}
if(Main.allwzq[start_x][start_y] != color) {
count = 0;
}
start_x--;
start_y++;
}
}
if(x > 17 - y + 1) {
start_x = 17;
start_y = y - 17 + x;
while(start_y <= 17) {
if(Main.allwzq[start_x][start_y] == color) {
count++;
if(count == 5) {
return true;
}
}
if(Main.allwzq[start_x][start_y] != color) {
count = 0;
}
start_x--;
start_y++;
}
}
return false;
}
@Override
public void mouseReleased(MouseEvent mouseEvent) {
}
@Override
public void mouseEntered(MouseEvent mouseEvent) {
}
@Override
public void mouseExited(MouseEvent mouseEvent) {
}
}
class MapPanel extends JPanel {
public void paint(Graphics g) {
// 双缓冲技术防止屏幕闪烁
BufferedImage bi = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);
Graphics g1 = bi.createGraphics();
// 绘制标题、双方信息
g1.drawString("游戏信息:" + Main.xinxi, 130, 45);
g1.drawString("白方时间:" + Main.black_msg, 80, 480);
g1.drawString("红方时间:" + Main.white_msg, 310, 480);
// 绘制棋盘
for(int i = 0; i < 19; i++) {
g1.drawLine(60, 80+20*i, 420, 80+20*i);
g1.drawLine(60+20*i, 80, 60+20*i, 440);
}
// 标注点位
g1.fillOval(98, 138, 4, 4);
g1.fillOval(98, 258, 4, 4);
g1.fillOval(98, 378, 4, 4);
g1.fillOval(218, 138, 4, 4);
g1.fillOval(218, 258, 4, 4);
g1.fillOval(218, 378, 4, 4);
g1.fillOval(338, 138, 4, 4);
g1.fillOval(338, 258, 4, 4);
g1.fillOval(338, 378, 4, 4);
// 绘制全部棋子
draw_allwzq(g1);
// 将缓冲区的图片显示出来
g.drawImage(bi, 0, 0, this);
}
public void draw_allwzq(Graphics g1) {
for(int i = 0; i < 19; i++) {
for(int j = 0; j < 19; j++) {
if(Main.allwzq[i][j] == 1) {
int tempX = i*20+60;
int tempY = j*20+80;
g1.setColor(Color.WHITE);
g1.fillOval(tempX-7, tempY-7, 14, 14);
}
if(Main.allwzq[i][j] == 2) {
int tempX = i*20+60;
int tempY = j*20+80;
g1.setColor(Color.RED);
g1.fillOval(tempX-7, tempY-7, 14, 14);
g1.setColor(Color.WHITE);
g1.drawOval(tempX-7, tempY-7, 14, 14);
}
}
}
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册