有关五子棋人人对战的代码,以及其他一些我想说的话请参考

Java小程序 —— 简单五子棋_如切如磋,如琢如磨-CSDN博客_java小程序

由于某些原因,这里我给出的AI算法算是比较简单的,所以导致了电脑其实并没有很强,甚至你玩的多了还可以发现电脑的“致命缺点”,由于我只是借助这个项目来做一个java的入门练习,且我还在读研,所以本人并不准备对AI的算法进行改进。

五子棋游戏接口:

public interface WZQConfig {/** 起始位置X*/public static final int START_X = 60;/** 起始位置Y*/public static final int START_Y = 60;/** 五子棋盘线条数*/public static final int H_LINE = 15;/** 五子棋盘竖线条数*/public static final int V_LINE = 15;/** 五子棋盘格子大小*/public static final int SIZE = 60;/** 储存棋子的x位置信息*/public static final int[][] bx = new int[17][17];public static final int[][] bx_lastStep = new int[17][17];public static final int[][] weightArray = new int [17][17];}

界面类:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
/** 五子棋的界面类,该类继承JFrame,然后实现WZQConfig接口*/
import javax.swing.JPanel;public class WZQFrame extends JPanel implements WZQConfig {public void WZQFrame() {// WZQFrame ui = new WZQFrame();JFrame jf = new javax.swing.JFrame();jf.setTitle("五子棋");jf.setDefaultCloseOperation(3);jf.setSize(1246, 1080);jf.setLocationRelativeTo(null);jf.setResizable(false);jf.setLayout(new FlowLayout());this.setLayout(new FlowLayout());this.setPreferredSize(new Dimension(1030, 1080));// this.setBackground(Color.CYAN);// 把面板对象添加到窗体上jf.add(this);JPanel jp1 = new JPanel();jp1.setPreferredSize(new Dimension(200, 1080));jp1.setLayout(new FlowLayout());jf.add(jp1);LoginListener ll = new LoginListener();String[] str = { "悔棋", "重新开始" };for (int i = 0; i < str.length; i++) {JButton jbu1 = new JButton(str[i]);jbu1.setPreferredSize(new Dimension(150, 80));jbu1.setFont(new Font("楷体", Font.BOLD,20));//设置字体jp1.add(jbu1);jbu1.addActionListener(ll);}jf.setVisible(true);Graphics g = this.getGraphics();this.addMouseListener(ll);ll.setG(g);ll.setU(this);}/** 重写窗体绘制容器的方法*/public void paint(Graphics g) {super.paint(g);ImageIcon im2 = new ImageIcon(this.getClass().getResource("2.jpg"));g.drawImage(im2.getImage(), 0, 0, 1030, 1080, null);for (int i = 1; i < 17; i++) {Graphics2D g2 = (Graphics2D) g;g2.setStroke(new BasicStroke(4));g2.drawLine(START_X, START_Y * i, START_X + SIZE * V_LINE, START_Y* i);// 横线g2.drawLine(START_X * i, START_Y, START_X * i, START_Y + SIZE* V_LINE);// 竖线g2.setStroke(new BasicStroke(8));// 画边框g2.drawLine(35, 35, 990, 35);g2.drawLine(35, 990, 990, 990);g2.drawLine(35, 35, 35, 990);g2.drawLine(990, 35, 990, 990);}for (int k = 0; k < 17; k++) {for (int k1 = 0; k1 < 17; k1++) {if (bx[k][k1] == 1) {g.setColor(Color.BLACK);g.fillOval(Math.abs(k * SIZE - 25),Math.abs(k1 * SIZE - 25), 50, 50);} else if (bx[k][k1] == 2) {g.setColor(Color.WHITE);g.fillOval(Math.abs(k * SIZE - 25),Math.abs(k1 * SIZE - 25), 50, 50);}}}}public static void main(String[] args) {WZQFrame l = new WZQFrame();l.WZQFrame();}}

控制器/监听类:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.HashMap;
import java.util.Random;import javax.swing.JButton;
import javax.swing.JOptionPane;public class LoginListener implements MouseListener, WZQConfig, ActionListener {private int x, y;// 鼠标点击的位置private int x1, y1, xx, yy, x2, y2;// 鼠标点击附近格子交点的坐标private Graphics g;private int a = 0, i = 0, j = 0, count1 = 0;// count统计当前下的棋子数private String Str;// 定义全局变量获取按钮上的字符串private JButton jbu1, jbu2;private int GetX[] = new int[256];private int GetY[] = new int[256];WZQFrame ui;HashMap<String,Integer> map = new HashMap<String,Integer>();public LoginListener(){// 活一连map.put("010", 20);map.put("020", 20);map.put("01", 20);map.put("02", 20);map.put("10", 20);map.put("20", 20);// 活二连map.put("0110", 100);map.put("0220", 100);map.put("011", 100);map.put("110", 100);map.put("022", 100);map.put("220", 100);// 活三连map.put("01110", 500);map.put("02220", 500);map.put("1110", 500);map.put("0111", 500);map.put("2220", 500);map.put("0222", 500);// 活四连map.put("011110", 10000);map.put("022220", 10000);map.put("01111", 10000);map.put("11110", 10000);map.put("02222", 10000);map.put("22220", 10000);// 死一连map.put("012", 10);map.put("021", 10);map.put("120", 10);map.put("210", 10);// 死二连map.put("0112", 70);map.put("0221", 70);map.put("2110", 70);map.put("1220", 70);// 死三连map.put("01112", 200);map.put("02221", 200);map.put("21110", 200);map.put("12220", 200);// 死四连map.put("011112", 10000);map.put("022221", 10000);map.put("211110", 10000);map.put("122220", 10000);}public void setG(Graphics g) {this.g = g;}public void setT(JButton b) {jbu1 = b;}public void setU(WZQFrame u) {ui = u;}public void mouseClicked(MouseEvent e) {}public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {x = e.getX();y = e.getY();x1 = Math.abs(x - START_X);y1 = Math.abs(y - START_Y);xx = x1 % SIZE;if (xx >= SIZE / 2) {x1 = (x1 / SIZE) + 2;} else {x1 = (x1 / SIZE) + 1;}yy = y1 % SIZE;// 判断横坐标是否超过格子长度的一半(防止玩家点偏)if (yy >= SIZE / 2) {y1 = (y1 / SIZE) + 2;} else {y1 = (y1 / SIZE) + 1;}g.setColor(Color.BLACK);if (bx[x1][y1] == 0) {bx[x1][y1] = 1;// 表示黑棋g.fillOval(Math.abs(x1 * SIZE - 25), Math.abs(y1 * SIZE - 25), 50,50);count1++;// 所下棋子数加一GetX[count1] = x1;// 记录第count1步的棋子x值GetY[count1] = y1;// 记录第count1步的棋子y值if (CheckRow(x1, y1) >= 5) {JOptionPane.showMessageDialog(null, "BLACK   WIN!!");}if (CheckList(x1, y1) >= 5) {JOptionPane.showMessageDialog(null, "BLACK   WIN!!");}if (UpperRight(x1, y1) >= 5) {JOptionPane.showMessageDialog(null, "BLACK   WIN!!");}if (UpperLeft(x1, y1) >= 5) {JOptionPane.showMessageDialog(null, "BLACK   WIN!!");}}g.setColor(Color.WHITE);WZQAI();// 遍历棋盘AIcount();// 电脑计算应该下棋的坐标if (bx[x1][y1] == 0) {bx[x1][y1] = 2;// 表示白棋if(x1==0){g.fillOval(Math.abs((x1+1)* SIZE - 25), Math.abs((y1+1) * SIZE - 25), 50,50);}else{g.fillOval(Math.abs(x1* SIZE - 25), Math.abs(y1 * SIZE - 25), 50,50);}count1++;// 所下棋子数加一GetX[count1] = x1;// 记录第count1步的棋子x值GetY[count1] = y1;// 记录第count1步的棋子y值if (CheckRow(x1, y1) >= 5) {JOptionPane.showMessageDialog(null, "WHITE   WIN!!");}if (CheckList(x1, y1) >= 5) {JOptionPane.showMessageDialog(null, "WHITE   WIN!!");}if (UpperRight(x1, y1) >= 5) {JOptionPane.showMessageDialog(null, "WHITE   WIN!!");}if (UpperLeft(x1, y1) >= 5) {JOptionPane.showMessageDialog(null, "WHITE   WIN!!");}}// 清空权值数组for (int r = 0; r < weightArray.length; r++) {for (int c = 0; c < weightArray.length; c++) {weightArray[r][c] = 0;}}}public void actionPerformed(ActionEvent e) {setT(jbu1);Str = e.getActionCommand();// 读取点击按钮上的字符串if ("悔棋".equals(Str)) {if (g.getColor() == Color.BLACK) {g.setColor(Color.WHITE);}if (g.getColor() == Color.WHITE) {g.setColor(Color.BLACK);}Regret();ui.repaint();} else if ("重新开始".equals(Str)) {Restart();ui.repaint();}}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public int CheckRow(int x, int y)// 横着五子连成一条直线{int count = 0;for (int i = x + 1; i < bx.length; i++)// 向右判断是否棋子一样{if (bx[i][y] == bx[x][y])count++;elsebreak;}for (int i = x; i >= 0; i--)// 向右判断是否棋子一样{if (bx[i][y] == bx[x][y])count++;elsebreak;}return count;}public int CheckList(int x, int y)// 竖着五子连成一条直线{int count = 0;for (int i = y + 1; i < bx.length; i++)// 向下判断是否棋子一样{if (bx[x][i] == bx[x][y])count++;elsebreak;}for (int i = y; i >= 0; i--)// 向上判断是否棋子一样{if (bx[x][i] == bx[x][y])count++;elsebreak;}return count;}public int UpperRight(int x, int y)// 右上到左下五子连成一条直线{int count = 0;for (int i = x + 1, j = y - 1; i < bx.length && j >= 0; i++, j--)// 向下判断是否棋子一样{if (bx[i][j] == bx[x][y])count++;elsebreak;}for (int i = x, j = y; i >= 0 && j < bx.length; i--, j++)// 向上判断是否棋子一样{if (bx[i][j] == bx[x][y])count++;elsebreak;}return count;}public int UpperLeft(int x, int y)// 左上到右下五子连成一条直线{int count = 0;for (int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--)// 向下判断是否棋子一样{if (bx[i][j] == bx[x][y])count++;elsebreak;}for (int i = x, j = y; i < bx.length && j < bx.length; i++, j++)// 向上判断是否棋子一样{if (bx[i][j] == bx[x][y])count++;elsebreak;}return count;}public void Regret() {// 悔棋assert count1 >= 2;bx[GetX[count1]][GetY[count1]] = 0;bx[GetX[count1-1]][GetY[count1-1]] = 0;if (count1 > 0) {count1 = count1 - 2;}}public void Restart() {// 重新开始{for (int k = 0; k <= count1; k++) {bx[GetX[k]][GetY[k]] = 0;}}count1 = 0;for (int i1 = 0; i1 < bx.length; i1++) {for (int j1 = 0; j1 < bx.length; j1++) {bx[i][j] = 0;}}}public void WZQAI() {// 这两个循环遍历整个存储棋子的数组for (int r = 0; r < bx.length; r++) {for (int c = 0; c < bx[r].length; c++) {if (bx[r][c] == 0) {// 判断是否是空位int ch = 0;// 存储第一次出现棋子的变量String chessCode = "0";// 存储统计棋子相连情况的变量/** 横向向左 左面的棋子在chessCode为左方, 右面的棋子在chessCode为右方*/for (int c1 = c - 1; c1 >= 0; c1--) {if (bx[r][c1] == 0) {// 判断是否是空位if (c1 + 1 == c) {// 判断是否是相邻的break;} else {// 判断是否不是相邻的chessCode = bx[r][c1] + chessCode;// 记录棋子相连的情况break;}} else {// 判断是否是棋子if (ch == 0) {// 判断是否是第一次出现棋子chessCode = bx[r][c1] + chessCode;// 记录棋子相连的情况ch = bx[r][c1];// 存储第一次的棋子} else if (ch == bx[r][c1]) {// 判断是否是一样颜色的棋子chessCode = bx[r][c1] + chessCode;// 记录棋子相连的情况} else {chessCode = bx[r][c1] + chessCode;// 记录棋子相连的情况break;}}}// 根据棋子相连的情况,获取HashMap中存储的权值Integer weight = map.get(chessCode);if(null==weight){System.out.println(" get one null.....");}else{int a;a=weight.intValue();// 存储入到权值数组中weightArray[r][c] += a;}ch = 0;// 重置到初始状态chessCode = "0";// 重置到初始状态/** 横向向右 左面的棋子在chessCode为左方, 右面的棋子在chessCode为右方*/for (int c2 = c + 1; c2 <= 15; c2++) {// 判断是是空位if (bx[r][c2] == 0) {// 判断空位相邻的if (c2 - 1 == c) {break;} else {// 判断空位是不相邻的chessCode = chessCode + bx[r][c2];// 记录棋子相连的情况}}// 判断是棋子else {// 判断是第一次出现棋子if (ch == 0) {chessCode = chessCode + bx[r][c2];// 记录棋子相连的情况ch = bx[r][c2];// 储存第一次出现的棋子} else if (ch == bx[r][c2])// 判断棋子的颜色一样{chessCode = chessCode + bx[r][c2];}// 记录棋子的连接情况else {// 相邻棋子颜色不一样chessCode = chessCode + bx[r][c2];break;}}weight = map.get(chessCode);if(null==weight){System.out.println(" get one null.....");}else{int a;a=weight.intValue();// 存储入到权值数组中weightArray[r][c] += a;}ch = 0;// 重置到初始状态chessCode = "0";// 重置到初始状态}/** 竖向向上 上面的棋子在chessCode为左方, 下面的棋子在chessCode为右方*/for (int r1 = r - 1; r1 >= 0; r1--) {if (bx[r1][c] == 0) {// 判断是否是空位if (r1 + 1 == r) {// 判断是否是相邻的break;} else {// 判断是否不是相邻的chessCode = bx[r1][c] + chessCode;// 记录棋子相连的情况break;}} else {// 判断是否是棋子if (ch == 0) {// 判断是否是第一次出现棋子chessCode = bx[r1][c] + chessCode;// 记录棋子相连的情况ch = bx[r1][c];// 存储第一次的棋子} else if (ch == bx[r1][c]) {// 判断是否是一样颜色的棋子chessCode = bx[r1][c] + chessCode;// 记录棋子相连的情况} else {chessCode = bx[r1][c] + chessCode;// 记录棋子相连的情况break;}}}// 根据棋子相连的情况,获取HashMap中存储的权值weight = map.get(chessCode);if(null==weight){System.out.println(" get one null.....");}else{int a;a=weight.intValue();// 存储入到权值数组中weightArray[r][c] += a;}ch = 0;// 重置到初始状态chessCode = "0";// 重置到初始状态/** 竖向向下 上面的棋子在chessCode为左方, 下面的棋子在chessCode为右方*/for (int r2 = r + 1; r2 <= 15; r2++) {// 判断是是空位if (bx[r2][c] == 0) {// 判断空位相邻的if (r2 - 1 == r) {break;} else {// 判断空位是不相邻的chessCode = chessCode + bx[r2][c];// 记录棋子相连的情况}}// 判断是棋子else {// 判断是第一次出现棋子if (ch == 0) {chessCode = chessCode + bx[r][c];// 记录棋子相连的情况ch = bx[r2][c];// 储存第一次出现的棋子} else if (ch == bx[r2][c])// 判断棋子的颜色一样{chessCode = chessCode + bx[r2][c];}// 记录棋子的连接情况else {// 相邻棋子颜色不一样chessCode = chessCode + bx[r2][c];break;}}weight = map.get(chessCode);if(null==weight){System.out.println(" get one null.....");}else{int a;a=weight.intValue();// 存储入到权值数组中weightArray[r][c] += a;}ch = 0;// 重置到初始状态chessCode = "0";// 重置到初始状态}/** 左斜向上 左上面的棋子在chessCode为左方, 右下面的棋子在chessCode为右方*/for (int r1 = r - 1, c1 = c - 1; c1 >= 0 && r1 >= 0; c1--, r1--) {if (bx[r1][c1] == 0) {// 判断是否是空位if (c1 + 1 == c && r1 + 1 == c) {// 判断是否是相邻的break;} else {// 判断是否不是相邻的chessCode = bx[r1][c1] + chessCode;// 记录棋子相连的情况break;}} else {// 判断是否是棋子if (ch == 0) {// 判断是否是第一次出现棋子chessCode = bx[r1][c1] + chessCode;// 记录棋子相连的情况ch = bx[r1][c1];// 存储第一次的棋子} else if (ch == bx[r1][c1]) {// 判断是否是一样颜色的棋子chessCode = bx[r1][c1] + chessCode;// 记录棋子相连的情况} else {chessCode = bx[r1][c1] + chessCode;// 记录棋子相连的情况break;}}}// 根据棋子相连的情况,获取HashMap中存储的权值weight = map.get(chessCode);if(null==weight){System.out.println(" get one null.....");}else{int a;a=weight.intValue();// 存储入到权值数组中weightArray[r][c] += a;}ch = 0;// 重置到初始状态chessCode = "0";// 重置到初始状态/** 左斜向下 左上面的棋子在chessCode为左方, 右下面的棋子在chessCode为右方*/for (int r1 = r + 1, c1 = c + 1; c1 <= 15 && r1 <= 15; c1++, r1++) {if (bx[r1][c1] == 0) {// 判断是否是空位if (c1 - 1 == c && r1 - 1 == c) {// 判断是否是相邻的break;} else {// 判断是否不是相邻的chessCode = chessCode + bx[r1][c1];// 记录棋子相连的情况break;}} else {// 判断是否是棋子if (ch == 0) {// 判断是否是第一次出现棋子chessCode = chessCode + bx[r1][c1];// 记录棋子相连的情况ch = bx[r1][c1];// 存储第一次的棋子} else if (ch == bx[r1][c1]) {// 判断是否是一样颜色的棋子chessCode = chessCode + bx[r1][c1];// 记录棋子相连的情况} else {chessCode = chessCode + bx[r1][c1];// 记录棋子相连的情况break;}}}/** 右斜向上 左下面的棋子在chessCode为左方, 右上面的棋子在chessCode为右方*/for (int r1 = r - 1, c1 = c + 1; c1 <= 15 && r1 >= 0; c1++, r1--) // 行r,列c{if (bx[r1][c1] == 0) {// 判断是否是空位if (c1 - 1 == c && r1 + 1 == c) {// 判断是否是相邻的break;} else {// 判断是否不是相邻的chessCode = chessCode + bx[r1][c1];// 记录棋子相连的情况break;}} else {// 判断是否是棋子if (ch == 0) {// 判断是否是第一次出现棋子chessCode = chessCode + bx[r1][c1];// 记录棋子相连的情况ch = bx[r1][c1];// 存储第一次的棋子} else if (ch == bx[r1][c1]) {// 判断是否是一样颜色的棋子chessCode = chessCode + bx[r1][c1];// 记录棋子相连的情况} else {chessCode = chessCode + bx[r1][c1];// 记录棋子相连的情况break;}}weight = map.get(chessCode);if(null==weight){System.out.println(" get one null.....");}else{int a;a=weight.intValue();// 存储入到权值数组中weightArray[r][c] += a;}ch = 0;// 重置到初始状态chessCode = "0";// 重置到初始状态}/** 右斜向下 左下面的棋子在chessCode为左方, 右上面的棋子在chessCode为右方*/for (int r1 = r + 1, c1 = c - 1; c1 >= 0 && r1 <= 15; c1--, r1++) // 行r,列c{if (bx[r1][c1] == 0) {// 判断是否是空位if (c1 + 1 == c && r1 - 1 == c) {// 判断是否是相邻的break;} else {// 判断是否不是相邻的chessCode = bx[r1][c1] + chessCode;// 记录棋子相连的情况break;}} else {// 判断是否是棋子if (ch == 0) {// 判断是否是第一次出现棋子chessCode = bx[r1][c1] + chessCode;// 记录棋子相连的情况ch = bx[r1][c1];// 存储第一次的棋子} else if (ch == bx[r1][c1]) {// 判断是否是一样颜色的棋子chessCode = bx[r1][c1] + chessCode;// 记录棋子相连的情况} else {chessCode = bx[r1][c1] + chessCode;// 记录棋子相连的情况break;}}}// 根据棋子相连的情况,获取HashMap中存储的权值weight = map.get(chessCode);if(null==weight){System.out.println(" get one null.....");}else{int a;a=weight.intValue();// 存储入到权值数组中weightArray[r][c] += a;}ch = 0;// 重置到初始状态chessCode = "0";// 重置到初始状态}}}}public void AIcount() {// 电脑统计应该下棋的坐标int max = -1;// 储存权值的最大值int rx = 0;// 储存最大值处的行坐标int cx = 0;// 储存最大值处的列坐标int k = 0;// 最大值的坐标为x1,y1for (int r = 0; r < weightArray.length; r++) {for (int c = 0; c < weightArray.length; c++) {if (weightArray[r][c] > max) {System.out.println("weightArray=" + weightArray[r][c]);max = weightArray[r][c];rx = r;cx = c;} else {continue;}}}x1 = rx;y1 = cx;x2 = rx * SIZE - 25;y2 = cx * SIZE - 25;}}

Java小程序——简单五子棋(人机对战)相关推荐

  1. Java小程序 —— 简单五子棋

    看到好多后台留言问背景图片的问题,在这里统一补充一下:所有的图片都是读取的本地图片文件,图片文件可以去网上下载,有一大堆(记得调好长宽),代码中的路径只是当时我的电脑的图片路径,你们运行的时候记得修改 ...

  2. JAVA小程序简单学籍系统参考代码,登陆小程序,Jtree //Jtree,JDBC,Jframe

    JAVA小程序简单学籍系统//Jtree,JDBC,Jframe 我们可以先在JAVA写一个类打开数据库获取连接 package sql; import java.sql.Connection; im ...

  3. 基于微信小程序的五子棋小程序(含简单人机)

    基于微信小程序的五子棋小程序(含简单人机) 运行截图 项目结构目录 基本思路 实现过程 棋盘的生成 落子 判断胜负 悔棋 人机对战的实现 权值表 机器人落子逻辑 改进胜负判断方法 更多功能 结语 运行 ...

  4. java五子棋人机对战_实现简单的人机对战五子棋(实践)

    五子棋人机对战实践项目 总的任务和目标 完成一个人机对战的五子棋项目,基本效果如下: 第一部分 Java绘图原理 1.   基本概念 像素,坐标 2.   组件自定义绘图原理 3.   Graphic ...

  5. 五子棋人机对战_10.带人机对战的五子棋程序

    今天我们带来一个带人机对战功能的五子棋程序.程序基于前面文章中的框架搭建,新增人机对战的策略.程序基于规则进行决策,不考虑禁手,玩家执黑子先行.棋盘规模采用15乘15,棋盘规模容易扩展,程序棋力中等, ...

  6. 小程序源码:王者战力查询,游戏扫码登录,王者巅峰信息查询等等支持流量主收益和CPS收益-多玩法安装简单

    这是一款特别强大的一款微信小程序源码 初步算了一下,该款小程序目前包含了几十个功能 具体功能如以下: 游戏扫码登录 王者战力查询 改名生成(多种生成方式) 头像框制作(N款模板) 王者巅峰数据查询 王 ...

  7. 简单Java小程序----有界面ATM机

    继<简单Java小程序---无界面ATM机>以后,尝试对有界面ATM机改写,对面向对象的了解又深了一层! 桌面的创建过程       由于使用的NetBean软件没有提供专用的控件拖拽使用 ...

  8. 做一个简单的java小游戏--单机版五子棋

    做一个简单的java小游戏–单机版五子棋 学了java有一段时间了,今天就来搞一个简单的单机版五子棋游戏. 实现功能:那必须能进行基础的输赢判断.还有重新开始的功能,悔棋的功能,先手设置的功能和退出的 ...

  9. 小程序源码:游戏助手微信小程序源码王者荣耀战力查询,游戏扫码登录器-多玩法安装简单

    这是一款游戏助手小程序源码,UI方面的话还是挺简单,小编个人看着挺舒服的 小程序内支持多种热门游戏扫码登录,也就是说是一个游戏登录器 比如英雄联盟,王者荣耀,和平精英等等热门游戏都支持 另外还有王者战 ...

最新文章

  1. vue项目刷新当前页面的三种方法
  2. Nginx安装、默认虚拟主机、Nginx用户认证、Nginx域名重定向
  3. Java 技术篇 - java同时连接多种数据库执行sql语句的兼容性验证,数据库类型包括:oracle、sqlserver、DB2、人大金仓、达梦、PG、瀚高、polardb
  4. 苹果公布WWDC20大会安排、Snapchat上线小程序功能、QUIC和HTTP/3 将定稿|Decode the Week...
  5. Zeppelin-源码编译
  6. mysql快照过久_Oracle 快照(snapshot) 管理
  7. Jeecg-P3 1.0.1版本发布,轻量级微服务框架
  8. 个人推动团队项目进展_推动者和关守者对开发团队的价值
  9. 那个linux系统自带应用商店,如何在荣耀笔记本(Linux版)中拥有deepin应用商店?...
  10. The name Foxit Software sounds familiar
  11. CnBlogs博文demo演示技巧比较:jsfiddle完胜
  12. Mac OS怎么删除虚拟机声卡
  13. 将16进制的字符串转换为对应的字符
  14. jmeter性能测试~Beanshell
  15. matlab 最舒适的背景配色
  16. java毕业生设计房屋租售网站计算机源码+系统+mysql+调试部署+lw
  17. 用户输入一个列表和两个整数作为下标,然后使用切片获取并输出列表中结余两个下标之间的元素组成的子列表。例如,用户输入 [1,2,3,4,5,6]和2,5,程序输出[3,4,5]。
  18. html4和html5的区别
  19. IT职场求生法则(3)- 部门经理及副总适用法则
  20. 白帽子讲web安全之 浏览器安全

热门文章

  1. 云服务器哪家服务好、性价比高、比较稳定?
  2. 有时候狗比人更有人性
  3. Windows下卸载软件时提示 等待先前的卸载完成? 终止 dllhost.exe 进程
  4. Html实现歌曲歌词同步
  5. QGIS保存图层样式
  6. cdh集群搭建(6.3)
  7. python 计算平均值、中位数、标准差
  8. 用计算机如何修改wif密码,怎么改家里的wifi密码?
  9. 搭建一个直播平台源码,可以选择的流媒体服务器
  10. Python8-10行代码生成任意形状的文字云图