Java游戏开发——连连看

游戏介绍:

      “连连看”是一款来源于我国台湾的桌面小游戏,主要考验的是玩家们的眼力,在有限的时间内,只要能把所有能连接的相同图案,两个两个的找出来,每找到一对,它们就会自动消失,只要能把所有的图案全部消完即可获得胜利。所谓能够连接,是指无论横向还是纵向,从一个图案到另一个图案之间的连线拐角不能超过两个(中间的直线不超过三根),其中连线不能从尚未消去的图案上经过。

本次开发的连连看游戏运行效果如下图所示,游戏具有统计消去方块个数、打乱现有方块位置、智能辅助以及重开一局的功能。

使用到的素材文件夹如下:

 

素材及源码链接:https://pan.baidu.com/s/1GEzRACA2PMjFYJZS7hMvTA 提取码: yc21

游戏数据模型:

连连看的游戏界面是一个N*M的网格地图,每个网格显示一张图片;网格地图的信息使用二维数组来存储,每个数组元素存储对应网格地图中的每一个格子里的图片ID,如果图片ID非-1(BLANK_STATE)则绘制图片。

动物方块布局:

游戏地图信息初始化时,由于方块必须成对出现,需要引入一个临时的动态数组list,该list用来存储地图所有的图案ID信息,在这里我们是制作10*10的网格地图,一共10种图案,所以可以先向list里添加10组完全一样的图案ID,每组10个;创建二维数组map存储网格地图信息,初始化map里的每个数组元素为-1(BLANK_STATE),然后遍历map,按遍历顺序依次随机从list中取一个图案ID元素放入map并从list中移出刚才取出来的元素,遍历完成后返回map;代码实现如下:

	public int[][] getMap(){ArrayList<Integer> list = new ArrayList<Integer>();//先将等量图片ID添加到list中for(int i=0;i<n*n/10;i++){			for(int j=0;j<count;j++){//每个图案种类的ID各添加一个,循环10次list.add(j);}			}		for(int i=0;i<n;i++){for(int j=0;j<n;j++){int index = (int) (Math.random()*list.size());//从list中随机取一个图片ID,并将其添加到数组中,再从list中删除掉它map[i][j] = list.get(index);list.remove(index);	}}return map;//返回一个图片随机生成的地图数组}

连通算法:

①直连方式

在直连方式中,要求两个选中的方块在同一行或者同一列(图1-1,图1-2),并且之间没有其他任何图案的方块,实现最简单。

②单拐点连通

相当于通过两个选中的方块划出一个矩形,两个方块是一对矩形的对角顶点,另外两个顶点中的某个顶点如果为BLANK_STATE并且可以同时与这两个方块直连,那就说明可以单拐点连通(图1-3)。

③双拐点连通

这种方式的两个拐点z1,z2必定在两个选中的方块p1,p2所在的水平方向或者垂直方向的直线上(图1-4,图1-5)。

按p1(x1,y1)点向4个方向探测(此处的x1,y1为数组下标),例如向右探测,每次y1+1,判断(x1,y1+1)与p2(x2,y2)点可否形成单拐点连通性,如果可以形成连通,则两个拐点连通;如果超出图形右边界区域,则还需要判断两个拐点在选中方块的右侧,且两个拐点在图案区域之外连通的情况是否存在。这里可以简化为判断p2点(x2,y2)是否可以水平直通到右边界(图1-6)

图1-1图1-2图1-3图1-4图1-5图1-6

 

经过上面的分析,对两个选中的方块是否可以消去算法流程图如下:

该功能属于鼠标点击事件的一部分,代码如下:

	@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubGraphics g = this.getGraphics();int x = e.getX()-leftX;//点击位置x-偏移量xint y = e.getY()-leftY;//点击位置y-偏移量yint i = y/50;//对应数组行数,根据像素坐标转换成数组下标坐标int j = x/50;//对应数组列数if(x<0||y<0)//超出地图范围return ;if(isClick){//第二次点击if(map[i][j]!=BLANK_STATE){if(map[i][j]==clickId){//点击的是相同图片Id,但不是重复点击同一图片if(i==clickX&&j==clickY)return ;if(verticalLink(clickX,clickY,i,j)||horizontalLink(clickX,clickY,i,j)||oneCornerLink(clickX,clickY,i,j)||twoCornerLink(clickX,clickY,i,j)){//如果可以连通,画线连接,然后消去选中图片并重置第一次选中标识						drawSelectedBlock(j*50+leftX,i*50+leftY,g);drawLink(clickX,clickY,i,j);//画线连接isClick = false;	}else{clickId = map[i][j];//重新选中图片并画框clearSelectBlock(clickX,clickY,g);clickX = i;clickY = j;drawSelectedBlock(j*50+leftX,i*50+leftY,g);}}else{clickId = map[i][j];//重新选中图片并画框clearSelectBlock(clickX,clickY,g);clickX = i;clickY = j;drawSelectedBlock(j*50+leftX,i*50+leftY,g);}}}else{//第一次点击if(map[i][j]!=BLANK_STATE){//选中图片并画框clickId = map[i][j];isClick = true;clickX = i;clickY = j;drawSelectedBlock(j*50+leftX,i*50+leftY,g);}}}

其中isClick是用来标识是否第一次选中图案,clickId表示第一次选择图案对应的ID,clickX表示第一次选中图案的行下标,clickY表示第一次选中图案的列下标,如果第二次选中的图案与第一次选中的图案不同,重新选中;如果两次选择的图案相同,但是不连通,重新选中第二次选中的图片。

直连方式分为水平连通和垂直连通两种方式,分别使用horizontalLink()和verticalLink()进行判断:

	//判断是否可以水平相连private boolean horizontalLink(int clickX1, int clickY1, int clickX2, int clickY2) {if(clickY1>clickY2){//保证y1<y2int temp1 = clickX1;int temp2 = clickY1;clickX1 = clickX2;clickY1 = clickY2;clickX2 = temp1;clickY2 = temp2;}if(clickX1==clickX2){//如果两个选中图片的所在行数相同,说明可能可以水平相联for(int i=clickY1+1;i<clickY2;i++){if(map[clickX1][i]!=BLANK_STATE){//如果两图片中间还有其他图片,说明不能直接水平相连return false;}}linkMethod = LINKBYHORIZONTAL;return true;}return false;}//判断是否可以垂直连接private boolean verticalLink(int clickX1, int clickY1, int clickX2, int clickY2) {if(clickX1>clickX2){//保证x1<x2int temp1 = clickX1;int temp2 = clickY1;clickX1 = clickX2;clickY1 = clickY2;clickX2 = temp1;clickY2 = temp2;}if(clickY1==clickY2){//如果两个选中图片的所在列数相同,说明可能可以垂直相联for(int i=clickX1+1;i<clickX2;i++){if(map[i][clickY1]!=BLANK_STATE){//如果两图片中间还有其他图片,说明不能直接垂直相连return false;}}linkMethod = LINKBYVERTICAL;return true;}return false;}

单拐点连通使用oneCornerLink()方法实现判断(z1存储拐点数组下标信息):

//判断是否可以通过一个拐点相连private boolean oneCornerLink(int clickX1, int clickY1, int clickX2, int clickY2) {if(clickY1>clickY2){//保证(x1,y1)是矩形的左上角或者左下角int temp1 = clickX1;int temp2 = clickY1;clickX1 = clickX2;clickY1 = clickY2;clickX2 = temp1;clickY2 = temp2;}if(clickX1<clickX2){//如果(x1,y1)位于矩形左上角//判断右上角是否为空并且可以直接与(x1,y1)和(x2,y2)相连接,(clickX1, clickY2)是右上角拐点下标if(map[clickX1][clickY2]==BLANK_STATE&&horizontalLink(clickX1, clickY1, clickX1, clickY2)&&verticalLink(clickX2,clickY2,clickX1,clickY2)){linkMethod = LINKBYONECORNER;z1 = new Node(clickX1,clickY2);return true;}//判断左下角是否为空并且可以直接与(x1,y1)和(x2,y2)相连接,(clickX2, clickY1)是左下角拐点下标if(map[clickX2][clickY1]==BLANK_STATE&&horizontalLink(clickX2, clickY2, clickX2, clickY1)&&verticalLink(clickX1,clickY1,clickX2, clickY1)){linkMethod = LINKBYONECORNER;z1 = new Node(clickX2,clickY1);return true;}}else{//如果(x1,y1)位于矩形左下角//判断左上角是否为空并且可以直接与(x1,y1)和(x2,y2)相连接,(clickX2, clickY1)是左上角拐点下标			if(map[clickX2][clickY1]==BLANK_STATE&&horizontalLink(clickX2, clickY2, clickX2, clickY1)&&verticalLink(clickX1,clickY1,clickX2, clickY1)){linkMethod = LINKBYONECORNER;z1 = new Node(clickX2,clickY1);return true;				}//判断右下角是否为空并且可以直接与(x1,y1)和(x2,y2)相连接,(clickX1, clickY2)是右下角拐点下标			if(map[clickX1][clickY2]==BLANK_STATE&&horizontalLink(clickX1, clickY1, clickX1, clickY2)&&verticalLink(clickX2,clickY2,clickX1, clickY2)){linkMethod = LINKBYONECORNER;z1 = new Node(clickX1,clickY2);return true;				}}return false;}

双拐点连通使用twoCornerLink()方法实现判断。按p1(clickX1,clickY1)点向4个方向探测新的z1点与p2(clickX2,clickY2)能否行程单拐点连通性(z1,z2存储两个拐点的数组 下标信息):

	//判断是否可以通过两个拐点相连private boolean twoCornerLink(int clickX1, int clickY1, int clickX2, int clickY2) {//向上查找for(int i=clickX1-1;i>=-1;i--){//两个拐点在选中图案的上侧,并且两个拐点在地图区域之外if(i==-1&&throughVerticalLink(clickX2, clickY2, true)){z1 = new Node(-1,clickY1);z2 = new Node(-1,clickY2);linkMethod = LINKBYTWOCORNER;return true;}if(i>=0&&map[i][clickY1]==BLANK_STATE){if(oneCornerLink(i, clickY1, clickX2, clickY2)){linkMethod = LINKBYTWOCORNER;z1 = new Node(i,clickY1);z2 = new Node(i,clickY2);return true;}}else{break;}}//向下查找for(int i=clickX1+1;i<=n;i++){//两个拐点在选中图案的下侧,并且两个拐点在地图区域之外if(i==n&&throughVerticalLink(clickX2, clickY2, false)){z1 = new Node(n,clickY1);z2 = new Node(n,clickY2);linkMethod = LINKBYTWOCORNER;return true;}if(i!=n&&map[i][clickY1]==BLANK_STATE){if(oneCornerLink(i, clickY1, clickX2, clickY2)){linkMethod = LINKBYTWOCORNER;z1 = new Node(i,clickY1);z2 = new Node(i,clickY2);return true;}}else{break;}}//向左查找for(int i=clickY1-1;i>=-1;i--){//两个拐点在选中图案的左侧,并且两个拐点在地图区域之外if(i==-1&&throughHorizontalLink(clickX2, clickY2, true)){linkMethod = LINKBYTWOCORNER;z1 = new Node(clickX1,-1);z2 = new Node(clickX2,-1);return true;} if(i!=-1&&map[clickX1][i]==BLANK_STATE){if(oneCornerLink(clickX1, i, clickX2, clickY2)){linkMethod = LINKBYTWOCORNER;z1 = new Node(clickX1,i);z2 = new Node(clickX2,i);return true;}}else{break;}}//向右查找for(int i=clickY1+1;i<=n;i++){//两个拐点在选中图案的右侧,并且两个拐点在地图区域之外if(i==n&&throughHorizontalLink(clickX2, clickY2, false)){z1 = new Node(clickX1,n);z2 = new Node(clickX2,n);linkMethod = LINKBYTWOCORNER;return true;}if(i!=n&&map[clickX1][i]==BLANK_STATE){if(oneCornerLink(clickX1, i, clickX2, clickY2)){linkMethod = LINKBYTWOCORNER;z1 = new Node(clickX1,i);z2 = new Node(clickX2,i);return true;}}else{break;}			}return false;}

throughHorizontalLink()用于水平方向判断边界的连通性,如flag为true,则从(x,y)点水平向左直到边界,判断是否全部为空块BLANK_STATE;如果flag为false,则从(x,y)点水平向右直到边界,判断是否全部为空块BLANK_STATE。

//根据flag,判断(x1,y1)左右两侧中的一侧是否还有其他图片,如果没有,可以相连private boolean throughHorizontalLink(int clickX, int clickY,boolean flag){if(flag){//向左查找for(int i=clickY-1;i>=0;i--){if(map[clickX][i]!=BLANK_STATE){return false;}}			}else{//向右查找for(int i=clickY+1;i<n;i++){if(map[clickX][i]!=BLANK_STATE){return false;}}}return true;}

throughVerticalLink()用于水平方向判断边界的连通性,如flag为true,则从(x,y)点水平向上直到边界,判断是否全部为空块BLANK_STATE;如果flag为false,则从(x,y)点水平向下直到边界,判断是否全部为空块BLANK_STATE。

//根据flag,判断(x1,y1)上下两侧中的一侧是否还有其他图片,如果没有,可以相连private boolean throughVerticalLink(int clickX,int clickY,boolean flag){if(flag){//向上查找for(int i=clickX-1;i>=0;i--){if(map[i][clickY]!=BLANK_STATE){return false;}}}else{//向下查找for(int i=clickX+1;i<n;i++){if(map[i][clickY]!=BLANK_STATE){return false;}}}return true;}

智能查找功能实现(按D键触发):

首先先判断在此之前玩家有没有选定图案,如果有清空选定。

选择第一个方块:

①从第i行第j列从左向右、从上到下式查找,如果map[i][j]不为空,选定第一个图案并记录选中ID和数组下标。

选择第二个方块:

②从第p行第q列也是从左向右、从上到下式查找(初始p=i,q=j),如果map[i][j]==map[p][q]并且两次选中的图案对应数组下标不是完全相等,判断(p,q)和(i,j)是否可以连通,如果可以连通,对两个方块进行画框并连线。如果两层循环下来没找到可以连通的方块,重新选定第一个方块。

如果四层循环均未找到连通的方块,返回false。

//提示,如果有可以连接的方块就消去并且返回trueprivate boolean find2Block() {if(isClick){//如果之前玩家选中了一个方块,清空该选中框clearSelectBlock(clickX, clickY, this.getGraphics());isClick = false;}for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(map[i][j]==BLANK_STATE){continue;}				for(int p=i;p<n;p++){for(int q=0;q<n;q++){if(map[p][q]!=map[i][j]||(p==i&&q==j)){//如果图案不相等或者重复选择同一个方块continue;}						  if(verticalLink(p,q,i,j)||horizontalLink(p,q,i,j)||oneCornerLink(p,q,i,j)||twoCornerLink(p,q,i,j)){drawSelectedBlock(j*50+leftX, i*50+leftY, this.getGraphics());drawSelectedBlock(q*50+leftX, p*50+leftY, this.getGraphics());drawLink(p, q, i, j);repaint();return true;}}}				}}isWin();return false;}

动物图案的显示:

存储网格地图信息的二维数组map里存储的其实是图片ID,还需要将其转换成对应的图片。在这里使用Image数组pic存放图片,图片资源的获取及显示如下:

//初始化图片数组
private void getPics() {pics = new Image[10];for(int i=0;i<=9;i++){pics[i] = Toolkit.getDefaultToolkit().getImage("D:/Game/LinkGame/pic"+(i+1)+".png");}		}public void paint(Graphics g){g.clearRect(0, 0, 800, 30);for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(map[i][j]!=BLANK_STATE){g.drawImage(pics[map[i][j]],leftX+j*50,leftY+i*50,50,50,this);}else{g.clearRect(leftX+j*50,leftY+i*50,50,50);}}}}

在这里如果图片不是空块,则按照图片ID直接绘制图案,每个方块的宽度和高度是50,leftX是左上角网格地图起始X像素坐标,

leftY是左上角起始Y像素坐标。

 

给选定图案画选中框以及清空选中框:

方块的大小是50*50,在这里对转换后的方块左上角起点(x,y)像素坐标画框,为什么在(x+1,y+1)处画宽度高度为48像素的矩形呢?因为这次使用了局部刷新方法,清除选中框时,clearSelectedBlock()会重画(x,y)处的图案,这样48*48的选中框就可以在重画过程中顺利的被清除了。据说这样做可以消除闪烁。。。

	//画选中框,此处x,y为转换后的像素坐标private void drawSelectedBlock(int x, int y, Graphics g) {Graphics2D g2 = (Graphics2D) g;//生成Graphics对象BasicStroke s = new BasicStroke(1);//宽度为1的画笔g2.setStroke(s);g2.setColor(Color.RED);g.drawRect(x+1, y+1, 48, 48);}public void clearSelectBlock(int i,int j,Graphics g){g.clearRect(j*50+leftX, i*50+leftY, 50, 50);g.drawImage(pics[map[i][j]],leftX+j*50,leftY+i*50,50,50,this);
//		System.out.println("清空选定"+i+","+j);}

画线及延时功能:

首先先将传过来的数组下标进行中心点的转换,例如map[3][2]对应的方块左上角坐标应该是(2*50+leftX,3*50+leftY),它的中心点坐标应该在此基础上增加半个方块长宽,即(2*50+leftX+25,3*50+leftY+25);经过这样的转换,就可以得到两个选中的方块对应的方块中心坐标p1,p2了。

根据连通方式,进行线条的绘画。

①水平连通或者垂直连通:直接连接p1,p2;

②单拐点连通:将z1和p1,z1和p2进行连接;

③双拐点连通:如果p1与拐点z1不在同一行或者同一列,先将z1,z2进行交换。再将z1和p1,z2和p2,z1和z2连接。

延时功能:

使用Thread.currentThread().sleep(500);做到画线后延时500ms再消去方块。

 

	//画线,此处的x1,y1,x2,y2二维数组下标@SuppressWarnings("static-access")private void drawLink(int x1, int y1, int x2, int y2) {Graphics g = this.getGraphics();Point p1 = new Point(y1*50+leftX+25,x1*50+leftY+25);Point p2 = new Point(y2*50+leftX+25,x2*50+leftY+25);if(linkMethod == LINKBYHORIZONTAL || linkMethod == LINKBYVERTICAL){g.drawLine(p1.x, p1.y,p2.x, p2.y);System.out.println("无拐点画线");}else if(linkMethod ==LINKBYONECORNER){Point point_z1 = new Point(z1.y*50+leftX+25,z1.x*50+leftY+25);//将拐点转换成像素坐标g.drawLine(p1.x, p1.y,point_z1.x, point_z1.y);g.drawLine(p2.x, p2.y,point_z1.x, point_z1.y);System.out.println("单拐点画线");			}else{Point point_z1 = new Point(z1.y*50+leftX+25,z1.x*50+leftY+25);Point point_z2 = new Point(z2.y*50+leftX+25,z2.x*50+leftY+25);if(p1.x!=point_z1.x&&p1.y!=point_z1.y){//保证(x1,y1)与拐点z1在同一列或者同一行Point temp;temp = point_z1;point_z1 = point_z2;point_z2 = temp;}g.drawLine(p1.x, p1.y, point_z1.x, point_z1.y);g.drawLine(p2.x, p2.y, point_z2.x, point_z2.y);g.drawLine(point_z1.x,point_z1.y, point_z2.x, point_z2.y);System.out.println("双拐点画线");			}count+=2;//消去的方块数目+2GameClient.textField.setText(count+"");try {Thread.currentThread().sleep(500);//延时500ms} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}repaint();map[x1][y1] = BLANK_STATE;map[x2][y2] = BLANK_STATE;isWin();//判断游戏是否结束}

输赢判断:

使用isWin()实现,如果当前消去的方块是10*10个,则游戏结束。

private void isWin() {if(count==n*n){String msg = "恭喜您通关成功,是否开始新局?";int type = JOptionPane.YES_NO_OPTION;String title = "过关";int choice = 0;choice = JOptionPane.showConfirmDialog(null, msg,title,type);if(choice==1){System.exit(0);}else if(choice == 0){startNewGame();}}}

打乱现有方块顺序(按A键触发):

这个功能跟前面的随机生成网格地图信息的实现过程很类似,就不多解释了。

public int[][] getResetMap(){//获取再次打乱后的地图信息ArrayList<Integer> list = new ArrayList<Integer>();//list用来存储原先的地图信息for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(map[i][j]!=-1)//如果(x,y)处的图片ID不为-1,那么将该图片id添加到listlist.add(map[i][j]);		map[i][j]=-1;}}//将原先地图上剩余的未消去的图片打乱while(!list.isEmpty()){int	index = (int) (Math.random()*list.size());//从list中随机取一个图片ID,并将其添加到数组中,再从list中删除掉它boolean flag = false;while(!flag){int i = (int) (Math.random()*n);//获取随机的地图行列int j = (int) (Math.random()*n);if(map[i][j]==-1){//如果该位置无图片map[i][j] = list.get(index);list.remove(index);flag = true;}	}}return map;}

重开一局:

初始化游戏面板数据,new地图对象,重新绘画即可:

public void startNewGame() {// TODO Auto-generated method stubcount = 0;mapUtil = new Map(10,n);		map = mapUtil.getMap();isClick = false;clickId = -1;clickX = -1;clickY = -1;linkMethod = -1;GameClient.textField.setText(count+"");repaint();}

到这里,连连看游戏开发的核心功能实现已经全部介绍完毕了。

由于本次开发的连连看游戏源代码篇幅过长,所以在这里我就不再贴完整源代码了,有需要的可以在素材链接里下载。

如果大家有什么建议或者对这篇博客还有疑问的话可以在评论处一起讨论,感谢支持~

素材及源码链接:https://pan.baidu.com/s/1GEzRACA2PMjFYJZS7hMvTA 提取码: yc21

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/353097.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

java小游戏超级玛丽:05.第一关的设计

第一关效果图&#xff1a; 目录 判断是否为第一关 绘制第一关的场景 绘制地面&#xff08;for循环&#xff09; 绘制砖块 绘制水管 生成Obstatic列表的getter方法 绘制障碍物 判断是否为第一关 if(sort 1){ } 在上面有定义变量sort 绘制第一关的场景 绘制地面&…

程序员从0到收获心仪offer,我靠训练营实现了180度逆袭!

我相信&#xff0c;在未来的职场中&#xff0c;我也能通过这段时间养成的学习习惯和生活习惯让自己一步步成为更好的自己&#xff0c;以自己为荣 我在大学里主修计算机科学与技术&#xff0c;一个普通的院校&#xff0c;一个算是常见的专业&#xff0c;我知道我的学历和一些其他…

10 【组件编码流程 组件自定义事件 全局事件总线】

1.组件编码流程 组件化编码流程&#xff1a; ​ (1).拆分静态组件&#xff1a;组件要按照功能点拆分&#xff0c;命名不要与html元素冲突。 ​ (2).实现动态组件&#xff1a;考虑好数据的存放位置&#xff0c;数据是一个组件在用&#xff0c;还是一些组件在用&#xff1a; ​ 1…

QQ互联地址 中注册的QQ开发者 在哪里提交审核?

QQ互联地址&#xff1a;https://connect.qq.com 废话不说&#xff0c;直接上图&#xff1a; 有时点击后没反应&#xff0c;耐心 多试几次&#xff01; 然后 就会看到 提交审核的表单了&#xff0c; 有没发现 这个提交审核的 链接藏的有点深&#xff01;&#xff01; 哈哈哈&am…

QQ小程序打开指定QQ群

官方提供了接口&#xff1a; <view class"footer"><button open-type "openGroupProfile" class"footer-tips" group-id"620033746">v1.0 by&#xff1a;IWH <text>加群玩&#xff01;</text></button&g…

打开图片链接直接打开QQ对话框

<a href"tencent://message/?uin7530****&SiteQQ交谈&Menuyes" target"blank"> <img border"0" src"http://wpa.qq.com/pa?p1:7530*****:7" alt"有事Q我吧" width"71" height"2…

QQ的分享

使用的sdk版本&#xff1a; V2.2.2&#xff08;发布日期&#xff1a;2014.3.17&#xff09; 弱弱的提醒下&#xff1a; 1.配置清单等环境搭建&#xff0c;这里就不多说了&#xff0c;可以去看看我的另外一篇博客&#xff0c;QQ的第三方登录&#xff0c;那里有介绍。 2.这里集…

QQ圈子:从哪里来,到哪里去

2019独角兽企业重金招聘Python工程师标准>>> 摆脱顿巴数的魔咒 社 交是人类的一个最基本的需求。但是&#xff0c;自然给我们人类的大脑&#xff0c;只能让我们维系150-200个左右的好友。超出这个范围&#xff0c;就会有好友慢慢地被淡忘。很多社会 群体的平均大小是…

html 打开腾讯qq,qq软件管理器 QQ应用管理器里面的腾讯软件打不开

手机QQ中的消息管理器在哪里 打开的qq软件主界面&#xff0c;点击左下角的“主菜单”按钮。 在打开的qq主菜单中&#xff0c;点击“设置”菜单项。 手机版qq怎么进消息管理器QQ右下角...有一个查找。 查找的左边,有一个小喇叭. 那个就是信息管理器。 腾讯qq上的应用管理器在哪 …

打开qq聊天界面的url

2019独角兽企业重金招聘Python工程师标准>>> 打开qq聊天界面的url 北极熊爱企鹅 10:43:39 NSString *open_URL "mqq://im/chat?chat_typewpa&uin501863587&version1&src_typeweb"; 转载于:https://my.oschina.net/LiuChongYang/blog/51829…

如何创建圈子

首先您需要登录您在CSDN Blog的个人管理后台,点击“圈子”.如图所示: 点击"创建一个新的圈子" 输入名称和标题&#xff08;名称将是URL的一部分&#xff0c;例如experts就是 http://blog.csdn.net/group/experts/的名称&#xff1b;而“CSDN专家群”则是标题&#x…

Numpy---创建多维数组、创建正态分布、创建均匀分布

1. 创建一个随机整数的多维数组 np.random.randint(low, highNone, sizeNone, dtypel) 参数说明: low : 最小值 highNone: 最大值 highNone时&#xff0c;生成的数值在【0, low&#xff09;区间内 如果使用high这个值&#xff0c;则生成的数值在【low, high&#xff09;区…

扩容系统盘【centos-root】

问题描述&#xff1a; 磁盘空间有42G&#xff0c;但是系统盘只有6G。 问题抛出&#xff1a;&#xff08;P2原本只有7G&#xff0c;其中有30G错误分配到nvmeOn1p2了&#xff09;p2的30G空间怎么合理分配给系统盘? &#xff08;执行&#xff1a; sudo growpart /dev/nvme0n1 …

华为od机试题目回顾

今天去做了华为机试&#xff0c;两道一星题&#xff0c;一道二星题。 一星题 1&#xff1a; 题目主要大意&#xff1a; 输入一串字符串&#xff0c;里面可能包含有(x,y)的坐标。 0<x<1000&#xff0c;0<y<1000&#xff0c;类似(01,1)、(1,01)、(0,100)的都是非法坐…

小米耳机怎么连接手机(实用方法)

今天来教教大家一个手机实用小技巧。就是手机怎么与小米蓝牙耳机配对连接。大家可以了解一下。 首先打开手机。进入设置。点击蓝牙进入。打开蓝牙开关。拿出蓝牙耳机。在蓝牙耳机的开关键上长按10秒左右。让耳机处于配对状态。点击进行小米蓝牙耳机连接。允许蓝牙耳机访问通讯…

【HTML-5】小米耳机产品模块

1. 以下为效果图 2.以下为源代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"…

入手评测 小米降噪耳机 Pro怎么样

小米智能生活 官微宣布&#xff0c;年度旗舰小米降噪耳机 Pro 将于 5 月 13 日发布。小米降噪耳机 Pro怎么样这些点很重要看过你就懂了http://www.adiannao.cn/1 官方称&#xff0c;小米降噪耳机 Pro 采用了蕴涵“生命感”的弧线设计&#xff0c;每个角度都打磨得恰到好处&…

什么牌子的耳机好?国产TWS耳机推荐

随着越来越多的手机取消3.8mm耳机接口&#xff0c;TWS耳机便成为了更多用户的选择。现如今&#xff0c;随处可见的都是TWS耳机&#xff0c;在这多样化的蓝牙耳机市场&#xff0c;选择更多、更困难。下面&#xff0c;我来推荐几款好用的国产TWS耳机&#xff0c;一起来看看吧。 …

小米手机用什么蓝牙耳机好?高颜值游戏专属蓝牙耳机推荐

蓝牙耳机发展到现在&#xff0c;无论是从外观还是内置上&#xff0c;都有了很大的优化。人们对于耳机的要求也不单是为了听&#xff0c;更多的是注重耳机的外观&#xff0c;以及从自身的需求出发寻注重耳机的配置。当然&#xff0c;一副高颜值的耳机外观更能引人注目&#xff0…