DataRecord

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using System;

public class DataRecord : MonoBehaviour {
    
    public  static  DataRecord self;
    private static Hashtable table;
	// Use this for initialization
    void Awake()
    {
        self = this;
    }
	public static int AddPet(PetXmlData data)
    {

        Hashtable tmp = new Hashtable();
        tmp.Add("id", data.id);
        tmp.Add("name", data.name);
        tmp.Add("level", data.level);
        tmp.Add("hp", data.hp);
        tmp.Add("attack", data.attack);
        tmp.Add("catchcost", data.catchcost);
        tmp.Add("worth", data.worth);
        tmp.Add("probability", data.probability);
        tmp.Add("headImage", data.headImage);
        tmp.Add("curHp", data.hp); //当前血量
        tmp.Add("isFight", 0); //是否出战
        int index = 0;
        foreach (DictionaryEntry var in table)
        {
            if (var.Key.ToString().Contains("FightId") || var.Key.ToString().Contains("secret key"))
                continue;
            if(index < int.Parse(var.Key.ToString()))
                index = int.Parse(var.Key.ToString());
        }
        table.Add((index+1).ToString(), tmp);
        Save();
        return (index + 1);
        
    }

    public static Hashtable GetPet(int id)//人物宠物表table索引id(不同于xml中宠物唯一id)
    {
        Hashtable tmp = table[id.ToString()] as Hashtable;

        return tmp;
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="id">索引</param>
    /// <returns></returns>
    public static bool DelPet(int id)
    {                        //索引id
        if (table.Contains(id.ToString()))
        {
            table.Remove(id.ToString());
            return true;
        }
        else
            return false;
    }
   
   
    public static bool SetFight(int id, int index, bool Fight = true)
    {                       //(拥有所有宠物列表中索引id,出战队伍索引位置index,是否出战Fight)
        Hashtable tmp = table[id.ToString()] as Hashtable;
        //if (int.Parse(tmp["isFight"].ToString()) == 1)//去掉后,即使选中已出战的宠物,也可继续(位置和你确认队伍一致)
        //{
        //    Debug.Log(id + "已出战");
        //    return false;
        //}
        tmp["isFight"] = Fight ? 1 : 0;
        table[id.ToString()] = tmp;
        if (!table.ContainsKey("FightId" + index))
            table.Add("FightId" + index, id);
        else
            table["FightId" + index] = id;
        Save();
        return true;
    }
    public static Hashtable GetFightData(int index)//位置
    {
        if(table.ContainsKey("FightId" + index))
        {
            int i = int.Parse(table["FightId" + index].ToString());
            return GetPet(i);
       }
        else
            return null;
    }

    public static int GetRecordIdByPos(int index)
    {
        if(table.ContainsKey("FightId" + index))
        {
            return int.Parse(table["FightId" + index].ToString());
        }
        return 0;
    }
    public static Hashtable GetPetList()
    {
        Hashtable tmp = new Hashtable();
        foreach(DictionaryEntry var in table)
        {
            if (var.Key.ToString().Contains("FightId") || var.Key.ToString().Contains("secret key"))
                continue;
            Hashtable temp = var.Value as Hashtable;
            tmp.Add(var.Key,temp);
        }
        return tmp;
    }
    public static bool GetFight(int id)
    {
        Hashtable tmp = table[id.ToString()] as Hashtable;
        return  int.Parse(tmp["isFight"].ToString()) == 1 ;

        
    }

    public static void AddPetHp(int id,int add)//索引为id 的宠物数据中 Hp变化
    {
        Hashtable tmp = table[id.ToString()] as Hashtable;
        int hp =  int.Parse(tmp["curHp"].ToString());
        hp += add;
        if (hp < 0) { hp = 0; }//hp小于0,置为0
        tmp["curHp"] = hp;
        table[id.ToString()] = tmp;
        Save();
    }
    public static PetXmlData TranslateData(Hashtable data)
    {
        PetXmlData tmp = new PetXmlData();
        tmp.id = int.Parse(data["id"].ToString());
        tmp.hp = int.Parse(data["curHp"].ToString());
        tmp.level = int.Parse(data["level"].ToString());
        tmp.name = data["name"].ToString();
        tmp.headImage = data["headImage"].ToString();
        tmp.attack = int.Parse(data["attack"].ToString());
        return tmp;
    }
    public static bool IsHavePet(int petID)//该宠物角色是否拥有
    {
        foreach(Hashtable tmp in table)
        {
            if(tmp.ContainsKey("id") && tmp["id"].ToString() == petID.ToString())
            {
                return true;
            }
        }
        return false;
    }

    

    public static int GetPetHp(int id)
    {
        Hashtable tmp = table[id.ToString()] as Hashtable;
        if(tmp !=null)
            return int.Parse(tmp["curHp"].ToString());
        return 0;
    }
    public static void Load()
    {
        if (PlayerPrefs.HasKey("data"))
        {
            string json = Decrypt(PlayerPrefs.GetString("data"));

            if (!string.IsNullOrEmpty(json))
            {

                table = json.hashtableFromJson();
#if UNITY_ANDROID
                string identity = SystemInfo.deviceUniqueIdentifier;
                if (string.IsNullOrEmpty(identity))
                {
                    identity = "datadata";
                }

                Debug.Log("device uniqueIdentifier = " + identity);

                if (table.ContainsKey("secret key"))
                {
                    if ((string)table["secret key"] != identity)
                    {
                        ClearData();
                    }
                }
                else
                {
                    table.Add("secret key", identity);
                }
#endif
                return;
            }

            PlayerPrefs.DeleteKey("data");
        }

        table = new Hashtable();
    }
    public static void Save()
    {
        string json = table.toJson();

        //Debug.Log("save data = " + json );

        string encryptJson = Encrypt(json);

        PlayerPrefs.SetString("data", encryptJson);
        PlayerPrefs.Save();
    }

    public static void ClearData()
    {
        table.Clear();

        Save();
    }
    private static string Encrypt(string toE)
    {
        //											  Monodevelop9Unity1File8Edit2View
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes("Monodevelop9Unity1File8Edit2View");
        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = keyArray;
        rDel.Mode = CipherMode.ECB;
        rDel.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = rDel.CreateEncryptor();

        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toE);
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }

    private static string Decrypt(string toD)
    {
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes("Monodevelop9Unity1File8Edit2View");

        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = keyArray;
        rDel.Mode = CipherMode.ECB;
        rDel.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = rDel.CreateDecryptor();

        byte[] toEncryptArray = Convert.FromBase64String(toD);

        try
        {
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            return UTF8Encoding.UTF8.GetString(resultArray);

        }
        catch (Exception ex)
        {

            Debug.Log("Decrypt data failed, reset data. " + ex.Message);

            return null;
        }

    }
}

### 数据记录的概念与实现 在编程领域中,数据记录(Data Record)通常指一组具有特定结构的数据集合。它由多个字段组成,每个字段表示一种属性或特征。这种概念广泛应用于数据库管理、文件处理以及内存计算系统等领域。 #### 数据记录的核心定义 数据记录可以被看作是一个对象或者结构体,在程序设计中用于存储和操作一系列相关联的信息。例如,在关系型数据库中,一条记录对应表中的某一行;而在面向对象的语言中,则可能表现为类的一个实例[^1]。 ```python class DataRecord: def __init__(self, id, name, value): self.id = id self.name = name self.value = value def display(self): print(f"ID: {self.id}, Name: {self.name}, Value: {self.value}") record = DataRecord(1, "Example", 42) record.display() ``` 上述代码展示了如何通过 Python 定义一个简单的 `DataRecord` 类来封装三个字段:`id`, `name`, 和 `value`。这体现了数据记录的一种常见实现形式。 #### 实现细节与优化策略 为了提高性能并适应不同场景需求,开发者需考虑多种因素来进行数据记录的设计与实现: - **内存效率**:减少不必要的冗余信息有助于降低资源消耗。对于大规模数据分析任务而言尤为重要。 - **访问速度**:采用合适的数据结构能够显著提升检索效率。比如哈希表就常用来快速查找键值对映射关系。 - **并发控制**:当多线程环境下的共享变量存在竞争条件时,必须引入同步机制防止数据损坏。 这些原则同样适用于构建高效的事件驱动架构下微服务之间的通信模型[^2]。其中消息队列扮演着至关重要的角色,因为它允许生产者异步发送通知给消费者而无需等待响应确认。 #### 技术选型考量 选择恰当的技术栈取决于具体应用场景的要求。如果目标是开发实时性强的应用程序,则建议优先选用支持发布/订阅模式的消息中间件产品如RabbitMQ 或 Kafka 。它们不仅提供了灵活的消息传递功能而且还具备良好的扩展性和可靠性保障措施。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值