Windows
Windows 编程

谷歌浏览器离线游戏辅助编写

以离线模式访问谷歌浏览器,会出现一个小鳄鱼的游戏,其玩法就是通过跳动躲避障碍物来得分。


微信截图_20181023134458.png


写了一个小的辅助软件。原理如下:


20181023113557.png


通过判断屏幕坐标点的颜色值来得到是否是有障碍物,如果存在障碍物则像谷歌浏览器发送跳动事件,让其自动跳起。


红色:物体从右往左滑入可视区域可判断的点。

蓝色:判断的位置。


代码:

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal Scan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Dim lngTmp As Long
Private Sub Form_Load()
    Timer1.Interval = 100
End Sub
Private Sub Timer1_Timer()
    lngTmp = GetDC(0)
    If GetPixel(lngTmp, 280, 316) = 5460819 Or GetPixel(lngTmp, 289, 313) = 5460819 Or GetPixel(lngTmp, 296, 314) = 5460819 Or GetPixel(lngTmp, 292, 314) = 5460819 Then
        Call keybd_event(&H26, 0, 0, 0)
        Call keybd_event(&H26, 0, &H2, 0)
    End If
End Sub


优化:由于这个小游戏的障碍物有高有低,还有在顶端的障碍物,宽窄更不一样。所以判断的点可以选取多个。


效果:

1540273893204199.gif

一款小游戏的算法

屏幕快照 2018-10-17 下午10.45.55.png


上述是一个小游戏的界面,也是我最近玩的游戏。玩的久了就寻思它怎么实现的。


效果:每次手势移动,自身圆圈就会逐个随着移动改变位置。


界面:


屏幕快照 2018-10-17 下午10.41.30.png


上述界面是用Visual Basic 建的一个简单样式。实际每个圆圈对应数组的一个节点,所有的圆圈形成一个竖状的移动标识,也就是玩家自己。每次移动手势,从顶部自上而下逐个会产生移动,如果手势移动的过快,上次的手势不会清除,也就是说每次移动都会产生动画,直到所有的手势移动完毕。


思路:保存进数组结构或其它链式结构中。每次移动产生的位置信息存储入结构,另外一个死循环的线程不断的去查询这个数组,然后进行所有的界面移动。这里可以添加一些延迟。如果是用cocos2dx引擎来做,那可以添加一些特效。


源码:


Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
    Dim point as integer
    ReDim preserve point(1 To 1)
    point(UBound(point)) = 1
    ReDim preserve point (1 To UBound(point) + 1)
    point(UBound(point)) = 2
    While 1 '注意这个循环建议放在线程中进行操作。
        Dim l
        If IsArray(point) Then
            goto nextMark
        End If
        l = point(LBound(point))
        For i = 0 To Command1.UBound
            Command1.move(l)
        Next
        delArray point ,LBound(point)
    nextMark:
    Wend
Function IsArray(ByRef arr() as integer) as bool
    Dim pMyarr as long
    CopyMemory pMyarr, ByVal VarPtrArray(arr), 4
    If pMyarr = 0 Then
        IsArray = True
    Else
        IsArray = False
    End If
End Function
Function delArray(byref arr() As Integer, index As Integer)
    For i = index To UBound(arr) - 1
        arr(i) = arr(i + 1)
    Next i
    ReDim Preserve arr(UBound(arr) - 1)
End Function



地图滚动可以参考我以前写的一个游戏:http://www.iwonmo.com/letitfall.apk


删除JavaScript调试函数

此代码为Java语言编写,如果错误还望指出。

import org.omg.CORBA.INTERNAL;
public class Main {
    public static   boolean isJo(int i){
        if(i % 2 == 0){
            return true;
        }else{
            return false;
        }
    }
   public static int[] getConsolePoint(String con) {
        int[] p = new int[]{0, 0};
        try {
            String orignal = new String(con.getBytes(), "UTF-8");
            p[0] = con.toLowerCase().indexOf("console.log");
            int s = 0, e = 0,st=0,ov=0;
            for (int i = p[0]; i < orignal.length(); i++) {
                char ch = orignal.charAt(i);
                if(String.valueOf(ch).equals("\"") || String.valueOf(ch).equals("'")){
                    st++;
                }
                if (String.valueOf(ch).equals("(") && isJo(st)){ s++;}
                if (String.valueOf(ch).equals(")") && isJo(st)){ e++;}
                if (s == e && s != 0 && e != 0 && ov==0) {
                    ov=-1; //匹配完毕
                    p[1] = i;
                    continue;
                }
                if(String.valueOf(ch).equals(",") || String.valueOf(ch).equals(";")){
                    if(ov==-1){
                        p[1]=i;
                        return p;
                    }
                }else if(ov==-1){
                    return p;
                }
            }
        } catch (Exception error) {
        }
        return p;
    }
    public static void main(String[] args) {
        String codeText = "123console.log('((22222我');456"+"\n"+"123Console.log('123')456";
        String[] stringList = codeText.split("\n");
        for (int i = 0; i < stringList.length; i++) {
            if (stringList[i].toLowerCase().indexOf("console.log") > -1) {
                int[] p= getConsolePoint(stringList[i]);
                System.out.println("s:"+String.valueOf(p[0])+"\n"+"e:"+String.valueOf(p[1])+"\n"+"str:"+stringList[i].substring(0,p[0])+stringList[i].substring(p[1]+1,stringList[i].length()));
            }
        }
    }
}


结果:

s:3

e:26

str:123456

s:3

e:20

str:123456


Process finished with exit code 0


PhpStorm 插件开发

Phpstorm 的内核其实是:IntelliJ IDEA。隶属于同一个软件公司,所以要开发Phpstorm插件的话,还是得需要IntelliJ IDEA。其实jetbrains开发的ide都可以用IntelliJ IDEA来开发插件。


IntelliJ IDEA:http://www.jetbrains.com/idea/download/

开发文档:http://www.jetbrains.org/intellij/sdk/docs/welcome.html

官网步骤:http://www.jetbrains.org/intellij/sdk/docs/phpstorm/setting_up_environment.html



创建工程的时候选择:intellij platform plugin ,在project sdk的时候选择 intellij idea iu 具体的版本号可以按你电脑里安装的为准。


屏幕快照 2018-09-03 下午9.50.20.png


Next后会出现一个空的工程结构界面,并且会帮你打开plugin.xml描述文件。


屏幕快照 2018-09-03 下午9.52.45.png


<idea-plugin>
  <id>com.your.company.unique.plugin.id</id>
  <name>Plugin display name here</name>
  <version>1.0</version>
  <vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>
  <description><![CDATA[
      Enter short description for your plugin here.<br>
      <em>most HTML tags may be used</em>
    ]]></description>
  <change-notes><![CDATA[
      Add change notes here.<br>
      <em>most HTML tags may be used</em>
    ]]>
  </change-notes>
  <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
  <idea-version since-build="173.0"/>
  <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
       on how to target different products -->
  <!-- uncomment to enable plugin in all products
  <depends>com.intellij.modules.lang</depends>
  -->
  <extensions defaultExtensionNs="com.intellij">
    <!-- Add your extensions here -->
  </extensions>
  <actions>
    <!-- Add your actions here -->
  </actions>
</idea-plugin>


在上面补充如下代码:

<depends>com.jetbrains.php</depends>
<depends>com.intellij.modules.platform</depends>


注意第二行的id。这里面要填写你的实际包名。如果这个填不对的话,插件是不被ide识别的。其余的可以参考节点名来编写。


点击文件(File)-> Project Structure ->libraries  点击+号,然后选择 java  这里要添加两个文件,这两个文件在phpstorm的安装目录下的plugins里的php目录然后lib目录里。从这个目录结构也可以看出,你编写的插件也可以这样放:plugins/xxx(这个名字你自己取)/lib/目录下。


言归正传,打开plugins/php/lib你会看到几个jar。选择:php.jar 和 php-openapi.jar。这两个就好了。


屏幕快照 2018-09-03 下午10.02.50.png


再次打开Modules-dependencies。然后将compile改为provided。


屏幕快照 2018-09-03 下午10.04.09.png


在你的工程目录下的src右键选择创建一个包


屏幕快照 2018-09-03 下午10.05.08.png

还记得上面提到的id吗?那个id就填写这个包名。这个包名建议格式:com.xxx。例如 com.myplug。这样的话,你的plugin.xml的描述文件里的第二行id也要填写这个。


下面我们来创建一个action。


屏幕快照 2018-09-03 下午10.07.58.png


如下填写


屏幕快照 2018-09-03 下午10.10.32.png


第一个是你的id或者说你的包名

第二个是你的实现类名

第三个是你右键的提示文本

第四个是你的描述文本


由于groups选择的事editorpopupmenu 所以只会在代码编辑区域右键才会弹出这个菜单。下面的keyboard shortcuts是快捷键。可设置可不设置。


下面是编辑器帮你初始化的一个类,包含了一个魔术函数actionPerformed:


package com.myplug;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
public class delline extends AnAction {
    @Override
    public void actionPerformed(AnActionEvent e) {
        // TODO: insert action logic here
    }
}


actionPerformed 这个方法调用的事件是:弹出右键菜单,单击后才会调用。


下面这个例子是我写的一个删除空行的例子,仅供参考:



package com.x;
import com.intellij.codeInsight.editorActions.PasteHandler;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.IdeActions;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.*;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.intellij.openapi.editor.actionSystem.EditorActionManager;
import com.intellij.openapi.editor.actionSystem.TypedActionHandler;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.messages.MessagesService;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.rpc.CommandProcessor;
import java.util.List;
import java.awt.*;
import java.util.ArrayList;
public class delBlankLine extends AnAction {
    @Override
    public void actionPerformed(AnActionEvent e) {
        // TODO: insert action logic here
        final Editor editor = e.getRequiredData(CommonDataKeys.EDITOR);
        CaretModel caretModel = editor.getCaretModel();
        SelectionModel selectionModel = editor.getSelectionModel();
        Document document = editor.getDocument();
        LogicalPosition logicalPosition = caretModel.getLogicalPosition(); //不带自动换行
        VisualPosition visualPosition = caretModel.getVisualPosition(); //带自动换行产生的行
        String codeText = document.getText().toString();
        String[] stringList = codeText.split("\n");
//      +"\n"+String.valueOf(logicalPosition.column)+"\n"+String.valueOf(logicalPosition.line)
        String lineText = stringList[logicalPosition.line];
        String lineTexts = lineText.replaceAll(" ", "");
        if (lineTexts.equals("")) {
             selectionModel.selectLineAtCaret(); //设置当前行选中
//            EditorActionManager actionManager = EditorActionManager.getInstance();
//            //Insert one more caret below the active caret
//            EditorActionHandler actionHandler = actionManager.getActionHandler(IdeActions.ACTION_EDITOR_DELETE_LINE);
//            actionHandler.execute(editor, caretModel.getCurrentCaret(), e.getDataContext());
            String[] d_arr = delete(logicalPosition.line, stringList);
            final Project project = e.getRequiredData(CommonDataKeys.PROJECT);
            //Access document, caret, and selection
            final int start = selectionModel.getSelectionStart();
            final int end = selectionModel.getSelectionEnd();
            //New instance of Runnable to make a replacement
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    document.setText(arrToString(d_arr).toString());
                }
            };
            WriteCommandAction.runWriteCommandAction(project, runnable);
            selectionModel.removeSelection();
//            Messages.showMessageDialog(arrToString(stringList).toString(), "info", Messages.getInformationIcon());
        }
//        Messages.showMessageDialog(stringList[logicalPosition.line].toString(), "info", Messages.getInformationIcon());
    }
    public String[] delete(int index, String array[]) {
        List<String> list = new ArrayList<String>();
        for (int i = 0; i < array.length; i++) {
            list.add(array[i]);
        }
        list.remove(index);
        String[] newStr = list.toArray(new String[1]); //返回一个包含所有对象的指定类型的数组
        return newStr;
    }
    public String arrToString(String array[]) {
        StringBuffer s_b = new StringBuffer();
        for (int i = 0; i < array.length; i++) {
            s_b.append(array[i].toString() + "\n");
        }
        return s_b.toString();
//        return  StringUtils.join(array, "\n");
    }
}



屏幕快照 2018-09-03 下午10.18.28.png




visual basic测试JavaScript 代码随机数重复

VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   8625
   ClientLeft      =   120
   ClientTop       =   465
   ClientWidth     =   14880
   LinkTopic       =   "Form1"
   ScaleHeight     =   8625
   ScaleWidth      =   14880
   StartUpPosition =   3  '窗口缺省
   Begin VB.CommandButton Command2 
      Caption         =   "Command2"
      Height          =   495
      Left            =   1920
      TabIndex        =   7
      Top             =   4320
      Width           =   1935
   End
   Begin VB.TextBox Text3 
      Height          =   495
      Left            =   720
      TabIndex        =   6
      Text            =   "100"
      Top             =   4440
      Width           =   1095
   End
   Begin VB.CommandButton Command1 
      Caption         =   "Command1"
      Height          =   495
      Left            =   1920
      TabIndex        =   3
      Top             =   3600
      Width           =   1935
   End
   Begin VB.TextBox Text2 
      Height          =   7575
      Left            =   4800
      MultiLine       =   -1  'True
      ScrollBars      =   2  'Vertical
      TabIndex        =   1
      Top             =   480
      Width           =   9375
   End
   Begin VB.TextBox Text1 
      Height          =   2655
      Left            =   360
      MultiLine       =   -1  'True
      ScrollBars      =   2  'Vertical
      TabIndex        =   0
      Text            =   "Form1.frx":0000
      Top             =   360
      Width           =   4215
   End
   Begin VB.Label Label2 
      Caption         =   "Label3"
      BeginProperty Font 
         Name            =   "宋体"
         Size            =   14.25
         Charset         =   134
         Weight          =   700
         Underline       =   0   'False
         Italic          =   0   'False
         Strikethrough   =   0   'False
      EndProperty
      Height          =   735
      Left            =   120
      TabIndex        =   5
      Top             =   6120
      Width           =   1815
   End
   Begin VB.Label Label3 
      Caption         =   "Label3"
      BeginProperty Font 
         Name            =   "宋体"
         Size            =   14.25
         Charset         =   134
         Weight          =   700
         Underline       =   0   'False
         Italic          =   0   'False
         Strikethrough   =   0   'False
      EndProperty
      ForeColor       =   &H008080FF&
      Height          =   735
      Left            =   2400
      TabIndex        =   4
      Top             =   6120
      Width           =   1815
   End
   Begin VB.Label Label1 
      Caption         =   "Label1"
      BeginProperty Font 
         Name            =   "微软雅黑"
         Size            =   15.75
         Charset         =   134
         Weight          =   700
         Underline       =   0   'False
         Italic          =   0   'False
         Strikethrough   =   0   'False
      EndProperty
      Height          =   1095
      Left            =   1080
      TabIndex        =   2
      Top             =   7320
      Width           =   2775
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Function Script(code As String) As String
    Dim obj As Object
    Set obj = CreateObject("MSScriptControl.ScriptControl")
    obj.AllowUI = True
    obj.Language = "JavaScript"
    Script = obj.Eval(code)
End Function
Private Sub Command1_Click()
    Label1.Caption = ""
    Label2.Caption = "拟定:" + Text3.Text
    Text2.Text = 2
    Dim i As Long, b As String, s As String
    For i = 1 To Val(Text3.Text)
        b = Script(Text1.Text)
        If InStr(s, b) > 0 Then
            Label1.Caption = "重复"
            Exit For
        Else
            s = s + b + vbCrLf
        End If
        
    Next
    Label1.Caption = "不重复"
    DoEvents '交出时间片
    Text2.Text = s
    Label3.Caption = "真实:" + CStr(UBound(Split(s, vbCrLf)))
End Sub
Private Sub Command2_Click()
    Label1.Caption = ""
    Label2.Caption = ""
    Label3.Caption = ""
End Sub



实际那种语言都能测,只不过这里是用了vb。