iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java如何实现五子棋游戏
  • 168
分享到

Java如何实现五子棋游戏

2023-06-30 10:06:45 168人浏览 泡泡鱼
摘要

本篇内容介绍了“Java如何实现五子棋游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简介相比之前,做出了以下修改:新增菜单栏,将重新开始

本篇内容介绍了“Java如何实现五子棋游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

简介

相比之前,做出了以下修改:

新增菜单栏,将重新开始和退出的按钮移到了菜单栏;
2.可以实时显示时间(多线程);
3.下棋时可以显示当前是哪一方在下棋;
4.可以更改背景颜色;
5.可以更改先行方(默认黑子)。

结果

Java如何实现五子棋游戏

Java如何实现五子棋游戏

Java如何实现五子棋游戏

完整代码

Frame.java(主界面)

package Gobang;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.awt.image.*;//import java.applet.*;//import java.net.*;//import java.io.*;//import javax.imageio.*;public class Frame  extends JFrame implements MouseListener,ActionListener{//JFrame的扩展类        //ImageIcon image;    //JLayeredPane layeredPane;    //JPanel jp;        private static final long serialVersionUID = 1L;    public JButton AdmitDefeatButton,RegretButton;//两个按钮,各有其功能。    JLabel TimeLabel;//用来显示时间    JLabel jl1,jl2,jl3;//游戏信息    Graphics g;//画笔    BufferedImage buf;        int x;//鼠标的坐标    int y;    int[][] Chess = new int[20][20];   // 保存棋子,1表示黑子,2表示白子    boolean IsBlack = true;   //表示当前要下的是黑子还是白子,true表示黑子,false表示白子    boolean IsFinish = false;   //表示当前游戏是否结束    int xRange;    int yRange;    int[] chessX = new int[400];//用来保存从开始到当前的所有棋子,用于悔棋;    int[] chessY = new int[400];    int countX = 0;    int countY = 0;            //菜单栏    JMenuBar menubar;    JMenu menu;    JMenu setmenu;    JMenuItem RestartItem,ExitItem,IntroItem,BackgroundItem,FirstItem;        //获取屏幕的宽度和高度    Toolkit kit = Toolkit.getDefaultToolkit();    Dimension screenSize = kit.getScreenSize();    int screenWidth = screenSize.width;    int screenHeight = screenSize.height;        public Frame() {                                        //设置标题、大小、排列方式等        this.setTitle("五子棋");        this.setSize(600,600);        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        this.setVisible(true);        this.setLayout(null);        int height = this.getHeight();        int width = this.getWidth();        this.setLocation(screenWidth/2-width/2, screenHeight/2-height/2);                //实时显示时间,用到多线程来实时显示。        jl1 = new JLabel("北京时间");        jl1.setLocation(430, 120);        jl1.setSize(80,20);        this.add(jl1);        TimeLabel = new JLabel();        new Thread(new Time(TimeLabel)).start();//新建一个线程        TimeLabel.setLocation(510, 120);        TimeLabel.setSize(80,20);        this.add(TimeLabel);                //显示游戏信息,当前是谁执子;        jl2 = new JLabel("游戏信息");        jl2.setLocation(430, 150);        jl2.setSize(80,20);        jl3 = new JLabel("黑方先行");        jl3.setLocation(510, 150);        jl3.setSize(80,20);        this.add(jl2);        this.add(jl3);                //设置背景颜色        this.getContentPane().setBackground(new Color(255, 239 ,213));        this.getContentPane().setVisible(true);                //设置菜单栏        menubar = new JMenuBar();//菜单栏        menu = new JMenu("游戏操作");         RestartItem = new JMenuItem("重新开始");        ExitItem = new JMenuItem("退出");        menu.add(RestartItem);        menu.add(ExitItem);        menubar.add(menu);        setmenu = new JMenu("设置");        IntroItem = new JMenuItem("游戏说明");        BackgroundItem = new JMenuItem("背景颜色");        FirstItem = new JMenuItem("先行方");        setmenu.add(IntroItem);        setmenu.add(BackgroundItem);        setmenu.add(FirstItem);        menubar.add(setmenu);        menubar.setBackground(new Color(249,205,173));        menubar.setVisible(true);        this.setJMenuBar(menubar);                //两个按钮,认输和悔棋;        AdmitDefeatButton = new JButton("认输");        AdmitDefeatButton.setSize(80,40);        AdmitDefeatButton.setLocation(120, 480);        RegretButton = new JButton("悔棋" );        RegretButton.setSize(80,40);        RegretButton.setLocation(240, 480);        this.add(AdmitDefeatButton);        this.add(RegretButton);                                        this.repaint();//表示重新绘制画布,可以自动调用paint函数;        //本类作为监听类,包括鼠标监听和按钮动作监听;        this.addMouseListener(this);        IntroItem.addActionListener(this);        BackgroundItem.addActionListener(this);        FirstItem.addActionListener(this);        RestartItem.addActionListener(this);        AdmitDefeatButton.addActionListener(this);        RegretButton.addActionListener(this);        ExitItem.addActionListener(this);    }    //画布绘制    public void paint(Graphics g)    {        if(g == null)//如果第一次绘制,新建一个图片,并且创建画布。        {            buf = new BufferedImage(450, 450, BufferedImage.TYPE_INT_RGB);            g =  buf.createGraphics();        }        if(g != null)//        {            super.paint(g);//表示在原来图像的基础上,再画图            g.setColor(new Color(249,205,173));//画笔颜色调成褐色;            g.fill3DRect(20, 130, 400, 400,true);//用画笔画一个边长为400的正方形;边距为20,130            for(int i = 0; i <= 20; i++)//用画笔横竖各画19条线            {                g.setColor(Color.BLACK);//画笔颜色调为黑色;                g.drawLine(20,130+i*20,420,130+i*20);                g.drawLine(20+i*20,130,20+i*20,530);            }        }         for(int i=0; i<20; i++){                for (int j = 0; j < 20; j++) {                    //画实心黑子,直径16                    if(Chess[i][j] == 1){                            int tempX = i*20+12;                        int tempY = j*20+122;                        g.setColor(Color.BLACK);                        g.fillOval(tempX, tempY, 16, 16);                        g.setColor(Color.BLACK);                        g.drawOval(tempX, tempY, 16, 16);                    }                                        //画实心白子,直径16                    if(Chess[i][j] == 2){                        int tempX = i*20+12;                        int tempY = j*20+122;                        g.setColor(Color.WHITE);                        g.fillOval(tempX, tempY, 16, 16);                        g.setColor(Color.WHITE);                        g.drawOval(tempX, tempY, 16, 16);                    }                }            }        g.drawImage(buf, 0, 0,this);            }            public void mousePressed(MouseEvent e) {        // TODO Auto-generated method stub                if(!IsFinish)    //判断棋局是否结束        {            x = e.getX();    //获取当前鼠标点击位置            y = e.getY();            if(x >= 20 && x < 420 && y >= 130 && y<= 530)//判断鼠标是否在棋局内            {                xRange = (x-20)%20;                if(xRange > 10 && xRange < 20)    //如果在交叉点的边长为10的范围内,就把棋子下在这;                {                    x = (x - 20) / 20 + 1;                }                else                {                    x = (x - 20) / 20;                }                yRange = (y-130)%20;                if(yRange > 10 && yRange < 20)                {                    y = (y - 130) / 20 + 1;                }                else                {                    y = (y - 130) / 20;                }                                if(Chess[x][y] == 0)    //如果该交叉点没有被下过;                {                    chessX[countX++] = x;    //存储当前棋子的位置;                    chessY[countY++] = y;                    if(jl3.getText().equals("黑方先行"))            //如果是黑子                    {                        Chess[x][y] = 1;                        IsBlack = false;                        jl3.setText("白方先行");                    }                    else if(jl3.getText().equals("白方先行"))                    {                        Chess[x][y] = 2;                        IsBlack = true;                        jl3.setText("黑方先行");                    }                    this.repaint();//重新绘制画布                }                                if(this.isWin())//如果下棋之后赢了,弹出对话框                {                    if(Chess[x][y] == 1)                    {                        JOptionPane.showMessageDialog(this, "黑方胜利");                    }                    else                     {                        JOptionPane.showMessageDialog(this, "白方胜利");                    }                    this.IsFinish = true;  //游戏结束                }                            }                    }    }        public boolean isWin(){        boolean flag = false;        int count = 1;         int color = Chess[x][y];          //判断横向是否有5个棋子相连        count = this.checkCount(1,0,color);        if(count >= 5){            flag = true;        }else {            //判断纵向            count = this.checkCount(0,1,color);            if(count >= 5){                flag = true;            }else {                 //判断右上,左下                count = this.checkCount(1,-1,color);                if(count >= 5){                    flag = true;                }else {                    //判断右下,左上                    count = this.checkCount(1,1,color);                    if(count >= 5){                        flag =  true;                    }                }            }        }        return flag;    }     // 检查棋盘中的五子棋是否连成五子,xChange,yChange为相对于当前棋子位置的变化量    public int checkCount(int xChange , int yChange ,int color){        int count = 1;//统计总共有几个连着的棋子;        int tempX = xChange;        int tempy = yChange;          //判断棋子右边有没有相同颜色的棋子;        while(x + xChange >=0 && x+xChange <20  && y+yChange >=0 &&                 y+yChange < 20 && color == Chess[x+xChange][y+yChange])        {            count++;                        //如果有,棋子数加一            if(xChange != 0)                  xChange++;                    //如果横向方向变化,x相对位置加一            if(yChange != 0 )                            {                      if(yChange != 0)                            {                    if(yChange > 0)            //如果纵向方向增加,y相对位置加一                    {                           yChange++;                            }                    else                     //如果纵向方向减小,y相对位置减一                    {                        yChange--;                            }                }            }                    }        xChange = tempX;        yChange = tempy;          //判断棋子左边有没有相同颜色的棋子;        while(x-xChange >=0 && x-xChange <20 && y-yChange >=0 &&                y-yChange <20 && color == Chess[x-xChange][y-yChange])        {                    count++;            if(xChange != 0)            {                xChange++;            }            if(yChange != 0)            {                if (yChange > 0)                 {                    yChange++;                            }                else                 {                    yChange--;                            }            }        }        return count;    }    //监听动作函数    //@SuppressWarnings("deprecation")    public void actionPerfORMed(ActionEvent e) {        // TODO Auto-generated method stub                if(e.getActionCommand()=="重新开始")//如果点击的按钮是RestartButton,清空画板,还原设置        {            if(JOptionPane.showConfirmDialog(this, "是否重新开始游戏?") == 0)            {                for (int i = 0; i < 20; i++)                 {                    for (int j = 0; j < 20; j++)                     {                        Chess[i][j] = 0;  //清空棋盘的棋子                    }                                    }                                //清空下棋棋子坐标的记录                for (int i = 0; i < 400; i++)                {                    chessX[i] = 0;                    chessY[i] = 0;                }                countX =0;                countY =0;                IsBlack = true;                jl3.setText("黑方先行");                IsFinish = false;                this.repaint();            }        }        if(e.getSource() == AdmitDefeatButton)//如果点击的按钮是AdmitDefeatButton,结束游戏,并提示        {            if(!IsFinish)    //判断棋局是否结束            {                if(JOptionPane.showConfirmDialog(this, "是否确定认输?") == 0)                {                    if(IsBlack == true)                    {                        JOptionPane.showMessageDialog(this,"白方获胜");                    }                    else                    {                        JOptionPane.showMessageDialog(this,"黑方获胜");                    }                    IsFinish = true;                }            }        }        if(e.getActionCommand()=="退出")//如果点击的按钮是ExitButton,退出程序        {            if(JOptionPane.showConfirmDialog(this, "是否确定退出?") == 0)            {                System.exit(0);            }        }        if(e.getSource() == RegretButton)///如果点击的按钮是RegretButton,悔棋一步        {            if(!IsFinish)    //判断棋局是否结束            {            if(IsBlack == true)    //如果现在是黑子要下,表示悔棋的是白子            {                if(JOptionPane.showConfirmDialog(this, "白方想要悔棋,是否同意?") == 0)                {                    int tempX = chessX[--countX];    //获取上一步白子下的位置;                    int tempY = chessY[--countY];                    Chess[tempX][tempY] = 0;    //撤回白子                    IsBlack = false;    //当前要下的变为白方                    jl3.setText("白方先行");                }            }            else            {                if(JOptionPane.showConfirmDialog(this, "黑方想要悔棋?") == 0)                {                    int tempX = chessX[--countX];                    int tempY = chessY[--countY];                    Chess[tempX][tempY] = 0;                    IsBlack = true;                    jl3.setText("黑方先行");                }            }            this.repaint();    //重新绘制画布            }        }        if(e.getActionCommand()=="游戏说明")        {            JDialog frame1 = new JDialog();//新建对话框            frame1.setSize(200,200);            int height = frame1.getHeight();            int width = frame1.getWidth();            frame1.setLocation(screenWidth/2-width/2, screenHeight/2-height/2);             JTextArea ta = new JTextArea();//新建文本框             ta.setText("双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。");             ta.setEditable(false);             jscrollPane jsp = new JScrollPane(ta);             frame1.setTitle("规则");             frame1.getContentPane().add(jsp);    //添加文本框             frame1.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);    // 设置模式类型             frame1.setVisible(true);        }        if(e.getActionCommand()=="背景颜色")        {            JDialog frame2 = new JDialog();//新建对话框            frame2.setSize(150,200);            int height = frame2.getHeight();            int width = frame2.getWidth();            frame2.setLocation(screenWidth/2-width/2, screenHeight/2-height/2);            frame2.setLayout(new GridLayout(3,2,10,10));            //三个文本框;            JLabel label1 = new JLabel("Red");            JLabel label2 = new JLabel("Green");            JLabel label3 = new JLabel("Blue");            JTextField tf1 = new JTextField("255");            //tf1.setSize(80, 20);            JTextField tf2 = new JTextField("239");            //tf2.setBounds(10, 40, 80, 20);            JTextField tf3 = new JTextField("213");            //tf3.setBounds(10, 70, 80, 20);            frame2.setTitle("设置背景颜色");            frame2.getContentPane().add(label1);            frame2.getContentPane().add(tf1);    //            frame2.getContentPane().add(label2);            frame2.getContentPane().add(tf2);            frame2.getContentPane().add(label3);            frame2.getContentPane().add(tf3);                                frame2.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);    // 设置模式类型            frame2.setVisible(true);                        //改变背景颜色            int Red =Integer.parseInt(tf1.getText());            int Green =Integer.parseInt(tf2.getText());            int Blue =Integer.parseInt(tf3.getText());            this.getContentPane().setBackground(new Color(Red,Green,Blue));            this.repaint();        }        if(e.getActionCommand() == "先行方") {            new FirstDialog(IsBlack,jl3);//新建对话框,改变先行方                    }    }    public static void main(String[] args) {        new Frame();}    @Override    public void mouseClicked(MouseEvent e) {        // TODO Auto-generated method stub            }    @Override    public void mouseReleased(MouseEvent e) {        // TODO Auto-generated method stub            }    @Override    public void mouseEntered(MouseEvent e) {        // TODO Auto-generated method stub            }    @Override    public void mouseExited(MouseEvent e) {        // TODO Auto-generated method stub            }}//改变先行方class FirstDialog extends JDialog implements ItemListener{        private static final long serialVersionUID = 1L;    Toolkit kit = Toolkit.getDefaultToolkit();    Dimension screenSize = kit.getScreenSize();    int screenWidth = screenSize.width;    int screenHeight = screenSize.height;    Boolean IsBlack;    JLabel jl = new JLabel();    JRadioButton rbWhite,rbBlack;    FirstDialog(Boolean IsBlack,JLabel jl)    {        this.IsBlack = IsBlack;        this.jl = jl;        this.setSize(150,200);        int height = this.getHeight();        int width = this.getWidth();        this.setLocation(screenWidth/2-width/2, screenHeight/2-height/2);        this.setTitle("先行方");                //一个单选组合;        rbWhite = new JRadioButton("白子");        rbBlack = new JRadioButton("黑子");        this.setLayout(new FlowLayout());        this.getContentPane().add(rbWhite);        this.getContentPane().add(rbBlack);    //        ButtonGroup bgroup = new ButtonGroup();        bgroup.add(rbWhite);        bgroup.add(rbBlack);                //本类做监听类        rbWhite.addItemListener(this);        rbBlack.addItemListener(this);        this.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);    // 设置模式类型        this.setVisible(true);    }    public void itemStateChanged(ItemEvent e) {        if(rbWhite.isSelected())//选中白子时,将先行方设为白子;        {            IsBlack = false;            jl.setText("白方先行");        }        else if(rbBlack.isSelected())        {            IsBlack = true;            jl.setText("黑方先行");        }    }    }

Time.java(实时显示时间)

package Gobang;import java.awt.*;import javax.swing.*;import java.util.*;import java.text.*;public class Time implements Runnable{    private JLabel lab = new JLabel();    public Time(JLabel lab) {        this.lab = lab;    }    public void run() {        while(true) {            SimpleDateFormat simpleFormat = new SimpleDateFormat("HH:mm:ss");            Calendar c = Calendar.getInstance();            lab.setText(simpleFormat.format(c.getTime()));            lab.setForeground(Color.RED);            try {                Thread.sleep(1000);            }catch(Exception e)            {                e.printStackTrace();            }        }    }}

“Java如何实现五子棋游戏”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Java如何实现五子棋游戏

本文链接: https://www.lsjlt.com/news/328128.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java如何实现五子棋游戏
    本篇内容介绍了“Java如何实现五子棋游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简介相比之前,做出了以下修改:新增菜单栏,将重新开始...
    99+
    2023-06-30
  • Java实现五子棋游戏
    本文实例为大家分享了Java实现五子棋游戏的具体代码,供大家参考,具体内容如下 一、功能分析 五子棋的实现还是较为简单的,通过下期的流程我们可以知道大概要实现一下功能: 1、格界面 ...
    99+
    2024-04-02
  • Java实现五子棋游戏(2.0)
    本文实例为大家分享了Java实现五子棋游戏的具体代码,供大家参考,具体内容如下 简介 相比之前,做出了以下修改: 1.新增菜单栏,将重新开始和退出的按钮移到了菜单栏;2.可以实时显示...
    99+
    2024-04-02
  • java实现双人五子棋游戏
    本文实例为大家分享了java实现双人五子棋游戏的具体代码,供大家参考,具体内容如下 通过 上下左右 控制棋盘走动  空格落子   (深度优先搜索) packag...
    99+
    2024-04-02
  • java开发实现五子棋游戏
    本文实例为大家分享了java实现五子棋游戏的具体代码,供大家参考,具体内容如下 此游戏具有双人对战功能和人机对战功能 一、游戏界面的实现 一个游戏首先从设计界面开始 1、首先创建一...
    99+
    2024-04-02
  • java如何实现简易的五子棋游戏
    这篇文章给大家分享的是有关java如何实现简易的五子棋游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。本文实例为大家分享了java实现简易五子棋游戏的具体代码,供大家参考,具体内容如下先上效果图一、问题分析1、...
    99+
    2023-06-15
  • flask如何实现五子棋小游戏
    这篇文章主要介绍了flask如何实现五子棋小游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。准备工作**1.**python环境、安装flask**2.**导入需要用到的包...
    99+
    2023-06-15
  • Java实现简易五子棋小游戏
    本文实例为大家分享了Java实现简易五子棋小游戏的具体代码,供大家参考,具体内容如下 五子棋是一个简单小游戏,首先我们先想想五子棋都有什么东西,棋子,棋盘; 首先我们可以定义一个棋子...
    99+
    2024-04-02
  • java实现简单的五子棋游戏
    目录一、主要界面二、功能概况三、代码部分四、部分效果展示本文实例为大家分享了java实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 一、主要界面 1、登录界面;2、游戏选择界...
    99+
    2024-04-02
  • java五子棋小游戏实现代码
    前言 之前学完java基础课程,试着简单做了一下java的一个五子棋小游戏,记录下来。 界面 由于直接用的java库中的一些基本控件写的一个GUI,并没有做过多优化,感觉比较丑 下面...
    99+
    2024-04-02
  • java实现简易的五子棋游戏
    本文实例为大家分享了java实现简易五子棋游戏的具体代码,供大家参考,具体内容如下 先上效果图 一、问题分析 1、五子棋游戏分析: 五子棋作为较为普遍且简易的娱乐游戏,受到众多人的...
    99+
    2024-04-02
  • Java+Swing实现经典五子棋游戏
    目录前言主要需求主要设计功能截图代码实现总结前言 五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,...
    99+
    2024-04-02
  • C++实现五子棋小游戏
    本文实例为大家分享了C++实现五子棋小游戏的具体代码,供大家参考,具体内容如下 思路:先用用system(“color 70”)改变控制台的背景色为灰白色,前...
    99+
    2024-04-02
  • JavaScript+canvas实现五子棋游戏
    本文实例为大家分享了JavaScript+canvas实现五子棋游戏的具体代码,供大家参考,具体内容如下 效果截图: 代码实现: <!DOCTYPE html> &l...
    99+
    2024-04-02
  • Vue实现五子棋小游戏
    本文实例为大家分享了Vue实现五子棋小游戏的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head>   ...
    99+
    2024-04-02
  • Java实现五子棋游戏(控制台版)
    本项目为大家分享了Java实现五子棋游戏的具体代码,供大家参考,具体内容如下 该项目为Java编程语言编写的五子棋游戏(控制台版),用到二维数组、for循环、if语句、while()...
    99+
    2024-04-02
  • java实现简单五子棋小游戏(2)
    本文实例为大家分享了java实现简单五子棋小游戏游戏的具体代码,供大家参考,具体内容如下 讲解 在第一步实现的基础上,添加游戏结束条件。五子棋游戏中的相同棋子如果同时有五个连接成一条...
    99+
    2024-04-02
  • Java实现五子棋游戏单机版(1.0)
    本文实例为大家分享了Java实现五子棋游戏单机版的具体代码,供大家参考,具体内容如下 简介 这个程序实现了单机版五子棋,目前无法联机,只能自己跟自己下。棋盘是20*20的。主要功能:...
    99+
    2024-04-02
  • java实现简单五子棋小游戏(1)
    本文实例为大家分享了java实现简单五子棋小游戏的具体代码,供大家参考,具体内容如下 讲解 五子棋,实际上就是用一个数组来实现的。没有其他很复杂的结构。首先我们制作五子棋,先要有一个...
    99+
    2024-04-02
  • python代码实现五子棋游戏
    本文实例为大家分享了python实现五子棋游戏的具体代码,供大家参考,具体内容如下 先上代码  #调用pygame库 import pygame import sys #调...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作