From 50a20b01e997e01e89e66b975b2be41b7964c6d9 Mon Sep 17 00:00:00 2001 From: muqing <1966944300@qq.com> Date: Mon, 17 Feb 2025 20:26:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=A4=9A=E4=B8=AA=E7=B1=BB?= =?UTF-8?q?=E5=B9=B6=E9=87=8D=E6=9E=84=E7=8E=B0=E6=9C=89=E7=B1=BB=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B4=BB=E5=8A=A8=E7=AE=A1=E7=90=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=9B=E6=B7=BB=E5=8A=A0=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=92=8C=E8=87=AA=E5=8A=A8=E5=8C=96=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=96=B0=E9=A1=B9=E7=9B=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 17 +++-- .vscode/tasks.json | 27 ++++--- App.config | 6 ++ Chouka.cs | 27 ++++--- Debug.csproj | 3 +- Debug.dtd | 11 +++ MODS/Activity.cs | 29 ++++++++ ModeSwitch.cs => MODS/ModeSwitch.cs | 4 +- MODS/Title.cs | 15 ++++ MODS/Tutke | 0 MODS/TypeHelper.cs | 106 ++++++++++++++++++++++++++++ MinLong/Main.cs | 3 +- ModelingMusic/Music.cs | 8 ++- Program.cs | 76 +++++++++----------- ProxySettingsHelper.cs | 6 +- README.md | 96 ++++++++++++++----------- SearchFile.cs | 6 +- Tanchishe/Main.cs | 3 +- image.png | Bin 0 -> 5169 bytes zidonghua.cs | 90 +++++++++++++++++++++++ 20 files changed, 413 insertions(+), 120 deletions(-) create mode 100644 App.config create mode 100644 Debug.dtd create mode 100644 MODS/Activity.cs rename ModeSwitch.cs => MODS/ModeSwitch.cs (99%) create mode 100644 MODS/Title.cs create mode 100644 MODS/Tutke create mode 100644 MODS/TypeHelper.cs create mode 100644 image.png create mode 100644 zidonghua.cs diff --git a/.vscode/launch.json b/.vscode/launch.json index f980ab9..51f9cfb 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,7 +1,16 @@ { - // 使用 IntelliSense 了解相关属性。 - // 悬停以查看现有属性的描述。 - // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", - "configurations": [] + "configurations": [ + { + "name": ".NET Core Launch", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + "program": "${workspaceFolder}/bin/Debug/net8.0/Debug.dll", + "args": [], + "cwd": "${workspaceFolder}", + "stopAtEntry": false, + "console": "externalTerminal" + } + ] } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 7f159e7..d05a36d 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,16 +1,15 @@ { - "version": "2.0.0", - "tasks": [ - { - "type": "dotnet", - "task": "build D:\\Debug\\Debug.csproj", - "file": "D:\\Debug\\Debug.csproj", - "group": { - "kind": "test", - "isDefault": true - }, - "problemMatcher": [], - "label": "dotnet: build D:\\Debug\\Debug.csproj" - } - ] + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}" + ], + "problemMatcher": "$msCompile" + } + ] } \ No newline at end of file diff --git a/App.config b/App.config new file mode 100644 index 0000000..193aecc --- /dev/null +++ b/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Chouka.cs b/Chouka.cs index 4758483..d8fa646 100644 --- a/Chouka.cs +++ b/Chouka.cs @@ -1,7 +1,13 @@  +using Debug.MODS; + namespace Debug; -public class ChouKa +#pragma warning disable 0414 // 关闭未使用变量的警告 +#pragma warning disable CS0414 +public class ChouKa : Activity { + public const string Title = "抽卡"; + public const int Priority = 0; // 10 20 30 50 60 70 80 90 int currentsize = 0; int baodinum = 70; //第一次保底80 往后就用随机数80 ~ 90 @@ -10,7 +16,6 @@ public class ChouKa string[] waile = ["薄荷", "铁锈会员10天"];// 设置歪的物品 string baozan = "name";//设置本次UP池 精品 只能有一个 - //普通物品抽中数量 int putongsize = 0; //精品物品抽中数量 @@ -19,10 +24,8 @@ public class ChouKa int waisize_A = 0, waisize_B = 0; //创建随机数生成器 private readonly Random random = new(); - string message = $"普通抽卡概率:{70}%\n精品抽卡概率:{30}%\n歪概率:{10}%\n" + - - "保底 80~90"; - + readonly string message = string.Empty; + // = $"普通抽卡概率:{70}%\n精品抽卡概率:{30}%\n歪概率:{10}%\n" +"保底 80~90"; public ChouKa() { // 清除控制台屏幕 @@ -30,7 +33,7 @@ public class ChouKa Console.Clear(); while (Program.IsWhile) { - ModeSwitch.New("抽卡系统", ["返回首页", "普通抽卡*1", "普通抽卡*10"], (a) => + _ = new ModeSwitch("抽卡系统", ["返回首页", "普通抽卡*1", "普通抽卡*10"], (a) => { switch (a) { @@ -47,11 +50,17 @@ public class ChouKa } break; } - }, message + "\n" + "当前保底:" + baodinum + "\n当前歪概率:" + waisize + "\n当前普通概率:" + (100 - baodinum) + - $"\n普通物品:{putongsize} 精品物品:{baozansize} 歪物品:薄荷{waisize_A} 铁锈会员10天{waisize_B}\n"); + }, GetDegree("保底概率", baodinum) + + "\n" + GetDegree("歪概率", waisize) + + "\n" + GetDegree("UP概率", 100 - baodinum) + + $"\n垃圾:{putongsize} && Up:{baozansize} && 歪物品:薄荷糖:{waisize_A} 橘子{waisize_B}\n"); } _ = new Program(); } + string GetDegree(string message, int num) + { + return message + ":" + num + "%"; + } public void Start() { diff --git a/Debug.csproj b/Debug.csproj index 7f65e79..7a9d213 100644 --- a/Debug.csproj +++ b/Debug.csproj @@ -1,5 +1,4 @@  - Exe net8.0 @@ -9,5 +8,7 @@ + \ No newline at end of file diff --git a/Debug.dtd b/Debug.dtd new file mode 100644 index 0000000..29cb1db --- /dev/null +++ b/Debug.dtd @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/MODS/Activity.cs b/MODS/Activity.cs new file mode 100644 index 0000000..30df31c --- /dev/null +++ b/MODS/Activity.cs @@ -0,0 +1,29 @@ + + +using System.Reflection; + +#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型。 +public class Activity +{ + public Activity() + { + // 获取当前类的类型 + Type activityType = this.GetType(); + // Console.WriteLine($"当前对象的类型是:{activityType.Name}"); + string Title; + // 获取静态字段 Title + FieldInfo titleSField = activityType.GetField("Title", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy + | BindingFlags.NonPublic); + if (titleSField != null) + { + // 获取静态字段的值 + Title = (string)titleSField.GetValue(null); // 静态字段传 null + } + else + { + Title = activityType.Name; + } + // Console.WriteLine($"当前对象的标题是:{Title}"); + Console.Title = Title ?? "null"; + } +} \ No newline at end of file diff --git a/ModeSwitch.cs b/MODS/ModeSwitch.cs similarity index 99% rename from ModeSwitch.cs rename to MODS/ModeSwitch.cs index 9c16ab8..b2b366e 100644 --- a/ModeSwitch.cs +++ b/MODS/ModeSwitch.cs @@ -1,9 +1,9 @@ using System.Text; -namespace Debug; +namespace Debug.MODS; public class ModeSwitch { - private object? class_; + private readonly object? class_; public event Action? Enter; private readonly string[] str = ["退出"]; private int mode = 0; diff --git a/MODS/Title.cs b/MODS/Title.cs new file mode 100644 index 0000000..b57a56d --- /dev/null +++ b/MODS/Title.cs @@ -0,0 +1,15 @@ + + +using System.Reflection; + +namespace Debug.MODS; +public class Title +{ + public string title; + public int Priority; + public Title(string title, int priority) + { + this.title = title; + this.Priority = priority; + } +} \ No newline at end of file diff --git a/MODS/Tutke b/MODS/Tutke new file mode 100644 index 0000000..e69de29 diff --git a/MODS/TypeHelper.cs b/MODS/TypeHelper.cs new file mode 100644 index 0000000..c6a37e0 --- /dev/null +++ b/MODS/TypeHelper.cs @@ -0,0 +1,106 @@ + +using System.Reflection; + +namespace Debug.MODS; +public class TypeHelper +{ + public readonly List result = []; + readonly string Title = "Title"; + readonly string Priority = "Priority"; + public TypeHelper() + { + Run(); + } + public TypeHelper(string title, string Priority) + { + this.Title = title; + this.Priority = Priority; + Run(); + } + + private void Run() + { + GetTypesInheritingFrom(); + } + + public void showUI() + { + + } + + /// + /// 获取所有继承自指定基类的类型 + /// + /// 基类 + /// 继承自基类的类型列表 + public List GetTypesInheritingFrom() + { + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + try + { + foreach (var type in assembly.GetTypes()) + { + if (typeof(TBase).IsAssignableFrom(type) && type != typeof(TBase)) + { + result.Add(type); + } + } + } + catch (ReflectionTypeLoadException ex) + { + foreach (var type in ex.Types.Where(t => t != null)) + { + if (typeof(TBase).IsAssignableFrom(type) && type != typeof(TBase)) + { + result.Add(type); + } + } + } + } + // GetTitles(); + // 按 `Priority` 常量值排序 + result.Sort((a, b) => GetPriority(a).CompareTo(GetPriority(b))); + return result; + } + + private int GetPriority(Type type) + { + // 获取 `Priority` 常量字段 + var field = type.GetField(Priority, BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy + | BindingFlags.NonPublic); + + // 确保字段存在且是 `int` + if (field != null && field.FieldType == typeof(int)) + { + // Console.WriteLine((int)field.GetValue(null)!); + return (int)field.GetValue(null)!; // 获取静态字段的值 + } + return int.MaxValue; // 如果没有 `Priority`,默认放到最后 + } + +#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型。 + public string[] GetTitles() + { + List list = []; + foreach (var type in result) + { + string Title; + // 获取静态字段 Title + FieldInfo titleSField = type.GetField("Title", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy + | BindingFlags.NonPublic); + if (titleSField != null) + { + // 获取静态字段的值 + Title = (string)titleSField.GetValue(null); // 静态字段传 null + } + else + { + Title = type.Name; + } + // Console.WriteLine("正在搜索:" + Title); + list.Add(Title ?? "null"); + } + return [.. list]; + } +} \ No newline at end of file diff --git a/MinLong/Main.cs b/MinLong/Main.cs index 74c62c8..f854031 100644 --- a/MinLong/Main.cs +++ b/MinLong/Main.cs @@ -5,8 +5,9 @@ namespace Debug.MinLong; #pragma warning disable CA1822 // 将成员标记为 static #pragma warning disable IDE0051 // 删除未使用的私有成员 #pragma warning disable IDE1006 // 命名样式 -public class Main +public class Main : Activity { + const string Title = "小龙快跑"; public Main() { diff --git a/ModelingMusic/Music.cs b/ModelingMusic/Music.cs index e21d50c..58d70b6 100644 --- a/ModelingMusic/Music.cs +++ b/ModelingMusic/Music.cs @@ -1,18 +1,20 @@ using System.Diagnostics; using System.Text; +using Debug.MODS; namespace Debug.ModelingMusic; -public class Music +public class Music : Activity { - public static string title = "模拟音游 1.5 by"; + public const string Title = "模拟音游 1.5 by"; //选择的模式 + private const int Priority = 0; private static int mode = 0; public Music() { Console.Clear(); string[] str = ["返回首页", "启动", "手动测试", "自动测试", "字符串测试", "字符串随机测试"]; - ModeSwitch.New(title, str, (a) => + _ = new ModeSwitch(Title, str, (a) => { mode = a; Console.CursorVisible = false; // 隐藏光标 diff --git a/Program.cs b/Program.cs index d9eabd4..4790a16 100644 --- a/Program.cs +++ b/Program.cs @@ -1,63 +1,57 @@ -using System.Text; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Text; using Debug.ModelingMusic; +using Debug.MODS; namespace Debug; /// /// 主程序入口 参考 https://blog.csdn.net/oscar999/article/details/141370223 /// 在VS Code的终端中,使用dotnet build命令来编译项目。这将在项目目录中生成一个bin文件夹,其中包含编译后的程序集。 /// 使用dotnet run命令来运行项目。这将编译项目(如果尚未编译)并运行编译后的程序。 /// + +#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型。 public class Program { + [DllImport("user32.dll")] + static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags); + + [DllImport("user32.dll")] + static extern IntPtr ActivateKeyboardLayout(IntPtr hkl, uint Flags); + const string ENGLISH_KEYBOARD_LAYOUT = "00000409"; // 美国英语布局 + // 获取所有继承自 Activity 的类 public static void Main(string[] args) { + // Console.WriteLine("Hello World!"); + _ = new Program(); + } + //Y,X + public static readonly Point[,] chars = new Point[10, 50]; + public static bool IsWhile = true; + public const char ShowChar = ' '; + public static Random random = new(); + public Program() + { + Console.Clear(); Console.Title = "Tools";//设置窗口标题 // 设置控制台输出编码,以支持复杂字符 Console.OutputEncoding = Encoding.UTF8; Console.CursorVisible = false; - // new MusicFrom(); - _ = new Program(); - } - - //Y,X - public static readonly Point[,] chars = new Point[10, 50]; - public static bool IsWhile = true; - - public const char ShowChar = ' '; - public static Random random = new(); - - public Program() - { - Console.Clear(); + var ActivityType = new TypeHelper(); // ResetChars(); - string[] str = ["抽卡", "搜索引擎", Music.title, "小龙快跑", "贪吃蛇", "铁锈助手(联机模块)[未开发]", "服务器代理"]; - var modeSwitch = new ModeSwitch("请选择你要执行的操作", str, (a) => + var modeSwitch = new ModeSwitch("请选择你要执行的操作", ActivityType.GetTitles(), (a) => { - switch (a) + object[] objects = [this]; + Type[] paramTypes = Array.ConvertAll(objects, p => p.GetType()); + ConstructorInfo constructor = ActivityType.result[a].GetConstructor(paramTypes); + if (constructor != null) { - case 0: - _ = new ChouKa();//抽卡 - break; - case 1: - _ = new Mod(); - break; - case 2: - _ = new Music(); - // _ = new MusicFrom(); - break; - case 3: - _ = new MinLong.Main(); - break; - case 4: - _ = new Tanchishe.Main(); - break; - case 5: - // _ = new Tanchishe.Main(); - _ = new Program(); - break; - case 6: - _ = new ProxySettingsHelper(this); - break; + Activator.CreateInstance(ActivityType.result[a], objects); + } + else + { + Activator.CreateInstance(ActivityType.result[a]); } }, "作者:MuQing\n使用语言:C#\n使用IDE:VS Code\n使用框架:.NET 8.0 \n测试运行平台:Windows11\n项目地址:https://git.coldmint.top/muqing/ModelingMusicForm.git"); } diff --git a/ProxySettingsHelper.cs b/ProxySettingsHelper.cs index c009d86..69a197a 100644 --- a/ProxySettingsHelper.cs +++ b/ProxySettingsHelper.cs @@ -1,10 +1,12 @@ +using Debug.MODS; using Microsoft.Win32; using System.Runtime.InteropServices; namespace Debug; #pragma warning disable CA1416 // 验证平台兼容性 #pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型。 -public class ProxySettingsHelper +public class ProxySettingsHelper : Activity { + public const string Title = "服务器代理"; // 引入WinINet API函数 [DllImport("wininet.dll", SetLastError = true)] private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength); @@ -28,7 +30,7 @@ public class ProxySettingsHelper SetProxy(true, proxy); break; } - _ = new ProxySettingsHelper(this); + _ = new ProxySettingsHelper(class_); }, $"代理已{(enableProxy ? "开启" : "关闭")},地址: {proxy}"); } diff --git a/README.md b/README.md index 99dc725..2344951 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,41 @@ # ModelingDebug ### C#-Net控制台程序 -## 功能 -1. 抽卡模拟器 -2. 文件/文件夹搜索 -3. 下落字符调试 -4. 小龙快跑 简易游戏 - -## 集成和使用 +## 模块继承 +如果一个类继承了Activity那么使用GetTypesInheritingFrom把他们全部获取 +如果继承了请在里面加入一些可被识别的变量类型 +```csharp +public static Title = "模块选择器"; +public const Title = "模块选择器"; +``` +string Title 是模块的标题 +int Priority 是优先级,数字越小越靠前展示 +## 规范使用 +继承了Activity的类的方法并且同时使用了模块选择器的 类 里面要有 +Title Priority +## 选择器 +``` +string[] str = ["模块", "模块", "模块", "模块"]; +var modeSwitch = new ModeSwitch("请选择你要执行的操作:", str, (a) => +{ + switch (a) + { + case 0: + //需要执行的方法模块 + break; + case 1: + break; + default: + printfLine("还没有这个功能"); + break; + } +}); +``` +## 模块选择器 +正确的说是加载所有Activity的一个选择器 +显示到页面中(如图) +![alt text](image.png) +## 选择器的使用 内置选择模式 可自由添加模块 PgUp/W 上选择 @@ -15,41 +43,29 @@ 1···9快捷数字选择 Enter(回车) 确定执行 Esc 选择退出 Enter(回车) 返回选择器 -### 使用 + 如果选择器被传入了一个类型,则选择器会返回这一个类 + public ModeSwitch(object class_, string title, string[] a, Action Enter, string message) +### 打包和运行 Visual Studio Code Visual Studio 2022 其他能运行C# Net8.0的程序 ### 方法 - var 变量 = new ModeSwitch("string", string[], (a) => - { - //在这里处理选择逻辑 - },"message"); +1. 模块选择器
+public ModeSwitch(object class_, string title, string[] a, Action Enter, string message) +可选的是class_,message +class_是标记我可以用Esc返回这个类 +message是底部的提示信息你可以在这里标注每个功能的使用方法 +2. Activity
+自动获取被他继承子类的Title方法 +3. TypeHelper
+获取所有被这个父类继承的子类 +var ActivityType = new TypeHelper<类>(); -### 例子 - string[] str = ["模块", "模块", "模块", "模块"]; - var modeSwitch = new ModeSwitch("请选择你要执行的操作:", str, (a) => - { - switch (a) - { - case 0: - //需要执行的方法模块 - break; - case 1: - //需要执行的方法模块 - break; - case 2: - //需要执行的方法模块 - break; - case 3: - //需要执行的方法模块 - break; - case 4: - //需要执行的方法模块 - break; - default: - printfLine("还没有这个功能"); - break; - } - }); -### 新增底部注意提醒词 -public ModeSwitch(string title, string[] a, Action Enter, string message) \ No newline at end of file +自定义 获取子类的静态标题和优先级的变量定义 +public TypeHelper(string title, string Priority) + +GetTitles()获取所有子类的标题 + +GetTypesInheritingFrom() 获取所有子类 这个默认在创建的时候就执行了 + +如果你要获取被获取的类的列表可以使用ActivityType.result这个就是列表 diff --git a/SearchFile.cs b/SearchFile.cs index 2995efc..3468458 100644 --- a/SearchFile.cs +++ b/SearchFile.cs @@ -1,11 +1,13 @@ using Debug; +using Debug.MODS; /// /// 文件夹文件搜索引擎操作 /// namespace Debug; -public class Mod +public class Mod : Activity { + const string Title = "文件搜索"; private static DateTime time; /// /// 结束时间 @@ -40,7 +42,7 @@ public class Mod public Mod() { Console.Clear(); - ModeSwitch.New("搜索模式", ["返回主页", "文件", "文件夹"], MODE); + _ = new ModeSwitch("搜索模式", ["返回主页", "文件", "文件夹"], MODE); } public void MODE(int a) { diff --git a/Tanchishe/Main.cs b/Tanchishe/Main.cs index b95eeb4..1366d92 100644 --- a/Tanchishe/Main.cs +++ b/Tanchishe/Main.cs @@ -3,8 +3,9 @@ /// /// 贪吃蛇主入口 /// -public class Main +public class Main : Activity { + const string Title = "贪吃蛇"; readonly int MaxY; readonly int MaxX; public Main() diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..699c348906420a6b9bd0b98eaf6d331ed2c6b235 GIT binary patch literal 5169 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