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的一个选择器
+显示到页面中(如图)
+
+## 选择器的使用
内置选择模式
可自由添加模块
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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