java实现单人版五子棋游戏
作者:lijiao 发布时间:2021-09-03 03:24:20
标签:java,五子棋
本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下
package gyb.exam;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;
public class MainFrame extends JFrame{
private static int BIG=15;
private static final int ONE=25;
private static final int START=10;
private static int X=BIG*START/2;
private static int Y=BIG*START/2;
private int HL=BIG*ONE+START;
private static boolean isBlack;
CanvasFrame canvas=new CanvasFrame();
CanvasFrame can;
Graphics g;
public MainFrame(){
init();
}
private Point point;
private ArrayList<Point> blacklist=new ArrayList<Point>();
private ArrayList<Point> whitelist=new ArrayList<Point>();
private void init() {
JMenuBar bar=new JMenuBar();
setJMenuBar(bar);
setSize(600,600);
setTitle("五子棋");
JMenu menu=new JMenu("game");
bar.add(menu);
JMenuItem start=new JMenuItem("start");
JMenuItem end=new JMenuItem("棋盘大小");
end.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
JMenuItem renew=new JMenuItem("重新开始");
JMenuItem exit=new JMenuItem("退出");
exit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
renew.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
blacklist.clear();
whitelist.clear();
}
});
menu.add(start);
menu.add(renew);
menu.add(end);
menu.add(exit);
setLayout(new BorderLayout());
add(BorderLayout.CENTER,createCenter());
add(BorderLayout.EAST,createEast());
}
private boolean isWin(ArrayList<Point> list){
int x;
int y;
int idx=0;
loop:for (Point p : list) {
x=p.x;
y=p.y;
idx=0;
while(list.contains(new Point(x,y))){
idx++;
x=x-ONE;
if(idx==5)
break loop;
}
x=p.x;
y=p.y;
idx=0;
while(list.contains(new Point(x,y))){
idx++;
y=y-ONE;
if(idx==5)
break loop;
}
x=p.x;
y=p.y;
idx=0;
while(list.contains(new Point(x,y))){
idx++;
x=x-ONE;
y=y-ONE;
if(idx==5)
break loop;
}
x=p.x;
y=p.y;
idx=0;
while(list.contains(new Point(x,y))){
idx++;
x=x-ONE;
y=y+ONE;
if(idx==5)
break loop;
}
}
return idx==5;
}
private JPanel createEast() {
JPanel pane=new JPanel();
BorderLayout border=new BorderLayout();
pane.setLayout(border);
pane.setBorder(new TitledBorder("五子棋"));
Icon image=new ImageIcon(getClass().getResource("mm.png"));
pane.add(BorderLayout.NORTH,new JLabel(image,JLabel.CENTER));
pane.add(BorderLayout.CENTER,ballColor());
pane.add(BorderLayout.SOUTH,button());
return pane;
}
private JPanel ballColor() {
JPanel pane=new JPanel();
pane.setLayout(new BorderLayout());
can=new CanvasFrame(){
public void paint(Graphics g){
g.setColor(Color.PINK);
g.fillRect(1, 1,200,300);
g.setFont(new Font("sans",Font.BOLD,20));
g.setColor(Color.BLACK);
g.fillOval(55, 20,25,30);
g.drawString("黑子", 10, 43);
g.setColor(Color.WHITE);
g.fillOval(55, 60,25,30);
g.drawString("白子", 10, 83);
if(isBlack){
g.setColor(Color.BLACK);
g.drawString("黑方落子", 5, 120);
}else{
g.setColor(Color.WHITE);
g.drawString("白方落子",5,120);
}
can.repaint();
}
};
pane.add(BorderLayout.CENTER,can);
return pane;
}
private JPanel button() {
JPanel pane=new JPanel();
BorderLayout bor=new BorderLayout();
JButton start=new JButton("开始");
JButton end=new JButton("结束");
end.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.exit(0);
}});
pane.setLayout(bor);
bor.setVgap(5);
pane.setBorder(new TitledBorder(""));
pane.add(BorderLayout.NORTH,start);
pane.add(BorderLayout.SOUTH,end);
return pane;
}
private JPanel createCenter() {
JPanel pane=new JPanel();
canvas.setPreferredSize(new Dimension(HL+10,HL+10));
canvas.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e){
loop:if(e.getButton()==MouseEvent.BUTTON1){
X=e.getX();
Y=e.getY();
int x=(X/ONE)*ONE;
int y=(Y/ONE)*ONE;
point=new Point(x,y);
if(!(blacklist.contains(point)||whitelist.contains(point))){
if(isBlack){
blacklist.add(point);
if(isWin(blacklist)){
JOptionPane.showMessageDialog(null, "黑方胜利!");
blacklist.clear();
whitelist.clear();
}
}else{
whitelist.add(point);
if(isWin(whitelist)){
JOptionPane.showMessageDialog(null, "白方胜利!");
blacklist.clear();
whitelist.clear();
}
}
}
else{
JOptionPane.showMessageDialog(null, "这里己有子了,换个地方落子吧!");
break loop;
}
canvas.repaint();
isBlack=!isBlack;
}
}
});
pane.add(canvas);
return pane;
}
public static void main(String[] args) {
MainFrame frame=new MainFrame();
frame.center(frame);
frame.pack();
frame.setVisible(true);
}
public void center(JFrame frame){
//Toolkit 是当前 绘图系统集合工具包
Toolkit toolkit=Toolkit.getDefaultToolkit();
Dimension screen=toolkit.getScreenSize();//屏幕的宽高
int frameWidth=frame.getWidth();
int frameHigh=frame.getHeight();
int x=(screen.width-frameWidth)/2;
int y=(screen.height-frameHigh)/2;
frame.setLocation(x, y);
}
class CanvasFrame extends JPanel {
public void paint(Graphics g){
g.setColor(Color.PINK);
g.fillRect(0, 0, HL+20, HL+20);
g.setColor(Color.BLACK);
for(int i=START;i<=HL;i=i+ONE){
for(int j=START;j<=HL;j=j+ONE){
g.drawLine(i, j, HL, j);
}
}
for(int i=START;i<=HL;i=i+ONE){
for(int j=START;j<=HL;j=j+ONE){
g.drawLine(i, j, i, HL);
}
}
g.setColor(Color.YELLOW);
g.drawRect(START/2, START/2, HL+1, HL+1);
g.setColor(Color.BLACK);
for(Point point : blacklist){
g.fillOval(point.x, point.y, 20, 25);
}
g.setColor(Color.WHITE);
for(Point point : whitelist){
g.fillOval(point.x, point.y, 20, 25);
}
}
}
}
效果图:
以上所述就是本文的全部内容了,希望能够对大家熟练掌握java有所帮助。
0
投稿
猜你喜欢
- 前言我们在日常开发中,经常会用到一个系统需要链接多个数据库来实现业务的需求,比如多个系统之间数据调用、两个数据之间同步等等。今天给大家分享使
- spring-mybatis获取mapper方式汇总项目背景:pojo下面有一个user实体类Dao包下面写了usermapper.xml
- 如何给请求添加header背景:在集成了swagger的项目中,调用后台接口往往会经过一些自定义的 * ,而 * 加了token限制的话,直
- 目录Spring是什么?Spring Boot是什么?Maven依赖项springboot为不同的Spring模块提供了许多启动程序依赖项。
- log4j2支持日志的异步打印,日志异步输出的好处在于,使用单独的进程来执行日志打印的功能,可以提高日志执行效率,减少日志功能对正常业务的影
- 目录为什么要实现调用链跟踪?如何实现?第一步,看图、看场景,用户浏览器的一次请求行为所走的路径是什么样的第二步,实现。不想看代码可直接拉最后
- 前言SpringBoot是我们经常使用的框架,那么你能不能针对SpringBoot实现自动配置做一个详细的介绍。如果可以的话,能不能画一下实
- 本文实例汇总了Java文件操作。分享给大家供大家参考,具体如下:1.创建文件夹//import java.io.*; File myFold
- 在项目中,分页是一个项目中必不可少的,它可以防止我们从数据库中进行大量数据查询时速度变慢,提高我们的查询效率。1、定义分页模型:PageMo
- 大顶堆每个结点的值都大于或等于其左右孩子结点的值小顶堆每个结点的值都小于或等于其左右孩子结点的值对比图实现代码public class He
- 说明:在阅读本篇文章之前建议大家先详细学习一下spring的相关知识,有助于更深刻的理解spirngboot的配置原理。一、什么是sprin
- 注解从java5开始加入这一特性,发展到现在已然是遍地开花,在很多框架中得到了广泛的使用,用来简化程序中的配置。那充满争议的类型注解究竟是什
- 注:图片来源于网络SpringBoot作为业内公认的优秀开源框架,它的 * 是如何实现呢?在这里首先对一些基础组件进行分析;1、事件Appl
- JdbcTypeInterceptor运行时自动添加 jdbcType 属性 * 签名@Intercepts({
- 前言Vector是java.util包中的一个类。 SynchronizedList是java.util.Collections中的一个静态
- 1、说明isInterrupted()可以判断当前线程是否被中断,仅仅是对interrupt()标识的一个判断,并不会影响标识发生任何改变(
- 前言Zookeeper的通过快照日志和事务日志将内存信息保存下来,记录下来每次请求的具体信息。尤其是其事务日志,每次处理事务请求时都需要将其
- 一. 线性表中的顺序表线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见
- 前言CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调、流
- 一、Flutter代码的启动起点我们在多数的业务场景下,使用的都是FlutterActivity、FlutterFragment。在在背后,