package com.company;

import java.awt.;
import javax.swing.
;
import java.awt.event.;
import java.util.ArrayList;
public class Gobang
{ //五子棋
public static void main(String[] args)
{
new chesspad(); //19
19棋盘 棋盘jpanel大小440*440 每格间距20
}
}
class 悔棋记录类 //数组队列的长度是动态的,不受限制,可以存储任意多的对象,但是只能存储对象,不能存储原生数据类型例如int。
{
public int x1,y1;
悔棋记录类 () //因为棋子信息是二维数组,创建一个类才能存入arraylist
{ //无参构造是方便后面调用

}
悔棋记录类(int x1,int y1)       //有参构造是为了方便存储
{this.x1=x1;this.y1=y1;
}

}
class chesspad extends JFrame implements MouseListener,ActionListener
{
int turn=1,count1=0,count2=0,count3=0,count4=0;
int 列=0;
int 行=0;
boolean canplay = true;//判断是否能下棋的
String name[]=new String[]{“重新游戏”,“悔棋”,“认输”};//直接静态创建数组
JButton jb[]=new JButton[3];
int qizi[][]=new int[19][19]; //存放棋子所在位置
ArrayList<悔棋记录类> houhui=new ArrayList<悔棋记录类>(); //动态数组结构,随机访问优于LinkedList,为了棋子信息存储,自创类型数组存储二位数字qizi[][]
chesspad() //ArrayList obj = new ArrayList(Arrays.asList(Object o1, Object o2, Object o3, …so on));
{
addMouseListener(this);
setTitle(“五子棋”);
setSize(600,450); //Frame的大小600*450
setResizable(false);
setLocationRelativeTo(null);//居中
this.setLayout(new BorderLayout());

    JTextArea text = new JTextArea("大植制作");this.add(text);text.setBounds(500,380,70,25);text.setBorder(BorderFactory.createLineBorder(Color.RED,2));text.setOpaque(false);//透明JPanel jp1=new JPanel();      //俩面板容器加入jframe 左部棋盘 450*450this.add(jp1,BorderLayout.CENTER);//Dimension类封装了单个对象中组件的宽度和高度(精确到整数)jp1.setPreferredSize(new Dimension(450,450));     //如果该组件受布局管理器管理(使用默认的也算),需要使用setPreferredSize()设置尺寸,setSize()无效。jp1.setBackground(Color.blue);JPanel jp2=new JPanel();      //右部控件的区域 150*450this.add(jp2,BorderLayout.EAST);jp2.setPreferredSize(new Dimension(150,450));jp2.setBackground(Color.gray);jp2.setLayout(new FlowLayout());   //右部控件布局为流式for(int i=0;i<3;i++){jb[i]=new JButton(name[i]);jb[i].setPreferredSize(new Dimension(140,50));jp2.add(jb[i]);jb[i].setFont(new Font("华文行楷",1,20));//button .setFont(new java.awt.Font("华文行楷"{字体},1{风格},15{字号}))//风格:三个常量  STYLE_BOLD——粗体 lSTYLE_ITALIC——斜体 lSTYLE_PLAIN——普通ljb[i].setBackground(Color.orange);    //button.setBackground(Color.green);jb[i].addActionListener(this);//this表示当前类的对象,在一个类里,你不需要new他的实例就直接可以用this调用它的方法和属性}String[] ren={"双人游戏","人机对战"};     //复选框,没什么用,只能双人,不能人机JComboBox combobox=new JComboBox(ren);combobox.addItem("其他");              //addItem(Object anObject)为项列表添加项。jp2.add(combobox);combobox.setPreferredSize(new Dimension(100,50));setVisible(true);setDefaultCloseOperation(3);//EXIT_ON_CLOSE
}
public void paint(Graphics g)
{super.paint(g);g.setColor(Color.black);for(int i=40;i<=400;i=i+20)//棋盘线g.drawLine(40,i,400,i);for(int j=40;j<=400;j=j+20)g.drawLine(j,40,j,400);g.fillOval(97,97,6,6);//棋盘上的五个点g.fillOval(337,97,6,6);g.fillOval(97,337,6,6);g.fillOval(337,337,6,6);g.fillOval(217,217,6,6);for(int i=0;i<19;i++)for(int j=0;j<19;j++)//落子的行列{if(qizi[i][j]==1){int countx=i*20+40;int county=j*20+40;g.setColor(Color.black);g.fillOval(countx-10, county-10,20,20);}else if(qizi[i][j]==2){int countx=i*20+40;int county=j*20+40;g.setColor(Color.white);g.fillOval(countx-10, county-10,20,20);}}
}
public void mouseClicked(MouseEvent e)//鼠标单击(按下并松开)时用的方法
{}
public void mousePressed(MouseEvent e)
{if(canplay==true){int x=e.getX();// getX()获取点击事件距离控件左边的距离,即视图坐标int y=e.getY();if(x>=40&&x<=400&&y>=40&&y<=400)//是否点在棋盘上{//通过取余判断使棋子准确落在我希望落的地方if((x-40)%20>=10)  列=(x-40)/20+1;else 列=(x-40)/20;if((y-40)%20>=10)  行=(y-40)/20+1;else 行=(y-40)/20;if(qizi[列][行]!=0)System.out.println("此处已经有棋子了,请下在其它地方");else{houhui.add(new 悔棋记录类(列,行));   //每次下一个棋子,存入悔棋记录类中的两个参数中,用new直接创建对象if(turn==1){qizi[列][行]=1;this.repaint();panduan1();turn++;}else if(turn==2){qizi[列][行]=2;this.repaint();panduan2();turn--;}}}elseJOptionPane.showMessageDialog(null, "下棋盘里");}elseJOptionPane.showMessageDialog(null, "都输了还点个锤子,赶紧重新开始");
}
public void mouseReleased(MouseEvent e)
{}
public void mouseEntered(MouseEvent e)
{}
public void mouseExited(MouseEvent e)
{}
public void actionPerformed(ActionEvent e)   //按钮监听
{Object source=e.getSource();if(source==jb[0])      //开始游戏按钮{int n = JOptionPane.showConfirmDialog(null, "就是你要重新开始嘛?", "标题",JOptionPane.YES_NO_OPTION);if(n==0){  //1.清空棋盘for(int i = 0;i < 19;i++)for(int j = 0; j < 19;j++)qizi[i][j] = 0;}else{}turn=1;canplay = true;this.repaint();}if(source==jb[2])             //认输按钮{int result = JOptionPane.showConfirmDialog(this, "是否确认认输");if(result == 0){JOptionPane.showMessageDialog(this, "是在下败了,游戏结束");canplay = false;for(int i = 0;i < 19;i++)for(int j = 0; j < 19;j++)qizi[i][j] = 0;turn=1;canplay = true;this.repaint();}}if(source==jb[1])             //悔棋按钮{if(houhui.size()>0)    //下了哪怕一个子没有{悔棋记录类 huiqi=new  悔棋记录类();//悔棋记录类 类的默认空构造器需显式进行定义,因为你定义了一个带参的构造器覆盖了默认的,// 而此时你再使用默认的构造器就会导致异常。huiqi=houhui.remove(houhui.size()-1) ;  //删除最后一个数据qizi[huiqi.x1][huiqi.y1]=0;  //让棋子数组中对应的这个最后一个点归零,实现悔棋操作this.repaint();}else{JOptionPane.showMessageDialog(null, "不能悔棋!");}}
}
public void panduan1()   //黑棋
{int count1=0,count2=0,count3=0,count4=0;int xmin=列-4,ymin=行-4,xmax=列+4,ymax=行+4;if(xmin<0) xmin=0;if(ymin<0) ymin=0;if(xmax>18) xmax=18;if(ymax>18) ymax=18;for(int i=xmin;i<=xmax;i++)   //横向{if(qizi[i][行]==1) count1++;else if(qizi[i][行]==2) count1=0;}for(int j=ymin;j<=ymax;j++)   //纵向{if(qizi[列][j]==1) count2++;else if(qizi[列][j]==2) count2=0;}for(int i=-4;i<=4;i++)if((列+i)>=0&&(行+i)>=0&&(列+i)<=18&&(行+i)<=18){if(qizi[列+i][行+i]==1) count3++;else if(qizi[列+i][行+i]==2) count3=0;}for(int i=-4;i<=4;i++)if((列+i)>=0&&(行-i)>=0&&(列+i)<=18&&(行-i)<=18){if(qizi[列+i][行-i]==1) count4++;else if(qizi[列+i][行-i]==2) count4=0;}if(count1>=5) {JOptionPane.showMessageDialog(null, "黑棋胜出1");   canplay=false;}if(count2>=5)   {JOptionPane.showMessageDialog(null, "黑棋胜出2"); canplay=false;}if(count3>=5)   {JOptionPane.showMessageDialog(null, "黑棋胜出3"); canplay=false;}if(count4>=5)   {JOptionPane.showMessageDialog(null, "黑棋胜出4"); canplay=false;}
}//panduan1 黑棋
public void panduan2()
{int count1=0,count2=0,count3=0,count4=0;int xmin=列-4,ymin=行-4,xmax=列+4,ymax=行+4;if(xmin<0) xmin=0;if(ymin<0) ymin=0;if(xmax>18) xmax=18;if(ymax>18) ymax=18;for(int i=xmin;i<=xmax;i++)   //横向{if(qizi[i][行]==2) count1++;else if(qizi[i][行]==1) count1=0;}for(int j=ymin;j<=ymax;j++)   //纵向{if(qizi[列][j]==2) count2++;else if(qizi[列][j]==1) count2=0;}for(int i=-4;i<=4;i++)if((列+i)>=0&&(行+i)>=0&&(列+i)<=18&&(行+i)<=18){if(qizi[列+i][行+i]==2) count3++;else if(qizi[列+i][行+i]==1) count3=0;}for(int i=-4;i<=4;i++)if((列+i)>=0&&(行-i)>=0&&(列+i)<=18&&(行-i)<=18){if(qizi[列+i][行-i]==2) count4++;else if(qizi[列+i][行-i]==1) count4=0;}if(count1>=5) {JOptionPane.showMessageDialog(null, "白棋胜出"); canplay=false;}if(count2>=5)   {JOptionPane.showMessageDialog(null, "白棋胜出"); canplay=false;}if(count3>=5)   {JOptionPane.showMessageDialog(null, "白棋胜出"); canplay=false;}if(count4>=5)   {JOptionPane.showMessageDialog(null, "白棋胜出"); canplay=false;}}//panduan2 白棋

}//类结束

IDEA单机,双人五子棋相关推荐

  1. 双人五子棋对战(需要EasyX图像库)

    实训要做项目呐.天天坐在电脑面前累死了.最近题刷的少.大多数都挺水.就不挨个编辑发上来了.发发白天写的项目吧.可能好几天更一下.实训结束恢复正常. 这个游戏需要EasyX的图像库.有兴趣的可以下一个图 ...

  2. C语言实践——双人五子棋(简易版)

    双人五子棋 前言 一.五子棋的元素 二.五子棋规则(简单) 三.主要功能的设计 1.头文件和宏定义 2.初始化棋盘 3.打印棋盘 4.判断输赢 5.辅助函数 6.主函数 四.程序结果展示 前言 五子棋 ...

  3. c++ 双人五子棋(可直接复制)

    今天,我给大家带来一个五子棋的代码,希望大家喜欢. 下面是代码: #include <iostream> #include <conio.h> using namespace ...

  4. python编程做联机游戏大全单机_如何将一款单机双人的游戏做成联机版?

    看情况啦.没玩过题主说的游戏不过目测:单机双人 双人分别用同一键盘不同键位输入? 无鼠标输入? 题主又提到有源码,随意想了想,依据源码质量和抽象程度有以下几种可能方案:搭建信道传输键盘输入及窗口图像( ...

  5. Win32 双人五子棋

    Win32 双人五子棋思路 一.实现要求: 绘制一个14乘14的棋盘格,然后黑白两种棋子依次下棋,会判断谁先连成5子. 二.运行环境: Visual C++6.0 基于Windows应用程序的基本框架 ...

  6. C++实现图形界面双人五子棋游戏

    C++实现图形界面双人五子棋游戏 设计思路 定义一个Chess类,用16*16的二维数组的来表示一方棋手在棋局上的落子状态. 通过控制键盘←↑→↓来选择落点,getch()函数可获得用户的键盘输入,用 ...

  7. C语言实践——双人五子棋(进阶版)

    双人五子棋 前言 一.棋盘的美化 二.棋子的美化 三.棋盘的打印 四.控制台修改颜色 五.五子棋源代码 前言  上一篇文章讲了如何用C语言写一个简易的双人五子棋小游戏,但是存在一些缺陷,比如棋盘太&q ...

  8. 基于opencv与MFC实现的双人五子棋

    之所以给他取名双人五子棋,是因为这个程序实现的功能并不具备AI(人机对弈)功能,只能由两个玩家自己操作,棋盘显示部分是基于opencv实现的. 其实只是一个很简单的程序,如果说有些难度的话,就是在棋盘 ...

  9. Unity 简单联网游戏(双人五子棋)开发(二)

    前言:之前我们尝试开发了一个两个比拼分数的不像游戏的超简单的弱数据联网游戏,主要是想让一些没开发过联网游戏的人了解一下最基础的流程:不过有人仍然有人私信我表示看不懂,所以这次我们再开发一个类似的游戏, ...

  10. 用python做双人五子棋_基于python的socket实现单机五子棋到双人对战

    基于python的socket实现单机五子棋到双人对战,供大家参考,具体内容如下 本次实验使用python语言.通过socket进行不同机器见的通信,具体可以分为以下四步:1.创建ServerSock ...

最新文章

  1. win运行pycharm找不到要加载的model.pkl文件是workingspace设置路径与文件路径位置不对应
  2. Android Studio 添加 Genymotion插件
  3. 轻松处理高于平常10倍的视频需求,还能节省60%的IT成本,蓝墨做对了什么?
  4. WebApi和MVC的区别
  5. imagereader java_java中ImageReader和BufferedImage获取图片尺寸实例
  6. php 中抽象类的作用,解释PHP中的抽象类。
  7. mysql 数据脱敏
  8. Nacos视频教程分享
  9. 绿色到黄色到红色的颜色渐变实现
  10. 初一作文写作技巧,中学写作文的七大技巧
  11. 计算机毕业设计(附源码)python银行服务评价系统
  12. python模拟登陆遇到重定向_Python requests jira登录302重定向
  13. Linux下lsof命令详解
  14. 2021灾难频发,人类将来或面临8种灭绝方式,希望是第6种
  15. 教育系统APP(一)
  16. __str__()方法
  17. manifest引用build中的变量
  18. 2022年度回忆录我在 CSDN 的这一年
  19. 查看mysql表结构
  20. 超级记忆/图像数字记忆 110位数字图像转换表 91-00

热门文章

  1. echarts 中国地图+穿透
  2. 结合百度搜索引擎SEO优化指南揭密百度SEO建议
  3. 汉庭季琦:我用IT精神打造传统产业
  4. 【中南林业科技大学】【陈】第十周作业sqi成绩管理系统
  5. 如何介绍自己的项目经验?
  6. android组件化管理单例,Pigeon——支持增量编译和组件化开发的路由框架
  7. XP系统清理优化工具箱
  8. 某一个网站打不开,其它网站都能正常打开
  9. 【verbs】IBV_WR API(3) Libibverbs Programmer’s Manual
  10. 【中文分词】最大熵马尔可夫模型MEMM