我对编程完全陌生。这是我的第一个“适当的”项目,将被其他人使用。
程序询问各种问题,然后将新的商店条目写入文件。对于一个空文件,我有大部分工作,但成品需要在现有文件中的特定点插入条目。
2个问题令我感到困惑:
如何在“Back:”之前将新商店条目插入到文件中,以及每次添加条目时如何将“InventoryLocation:”增加1
要追加的文件具有以下结构:
# shop 1
SuperSpaceSquids:
RewardType: playercommand
PriceType: free
Reward:
- ewarp Shop-SuperSpaceSquids
MenuItem:
- type:SKULL_ITEM
- playerhead:MHF_Squid
- durability:3
- amount:1
- name:&5SuperSpaceSquids
- 'lore:&6&o"Squid Shop From Space!"'
Message: ''
InventoryLocation: 38
ExtraPermission: ''
# shop 2
HadesKitty:
RewardType: playercommand
PriceType: free
Reward:
- ewarp Shop-HadesKitty
MenuItem:
- type:SKULL_ITEM
- playerhead:Turtle_Em
- durability:3
- amount:1
- name:&5HadesKitty
- 'lore:&6&o"our prices are fair!..."'
Message: ''
InventoryLocation: 39 # This value needs to be incremented by 1 each time
ExtraPermission: ''
>> insert new shops here <<
Back:
RewardType: shop
PriceType: free
Reward: Shop_Menu
MenuItem:
- type:REDSTONE
- amount:1
- name:&cBack
- lore:&8Back to Shop Menu
InventoryLocation: 54
这是写入文件的功能:
def write(shop, id, data, desc, skull):
f = open('file.yml', 'w')
f.write(" %s:" % shop)
f.write("\n RewardType: playercommand")
f.write("\n PriceType: free")
f.write("\n Reward:")
f.write("\n - ewarp shop-%s" % shop)
f.write("\n MenuItem:")
if skull:
f.write("\n - Type:SKULL_ITEM")
f.write("\n - playerhead:%s" % skull)
f.write("\n - durability:3")
if not skull:
f.write("\n - id:%s" % id)
if data:
f.write("\n - durability:%s" % data)
f.write("\n - amount:1")
f.write("\n - name:&5%s" % shop)
f.write("\n - 'lore:&6&o\"%s\"'" % desc)
f.write("\n Message:")
f.write("\n InventoryLocation:")
f.write("\n ExtraPermission: ''")
f.flush()
print "\nAll done."
print "\nHit Return to quit or 1 to add more shops."
while True:
choice = raw_input(prompt)
if choice == "":
print "\nGoodbye!"
f.close()
time.sleep(2)
exit(0)
elif choice == "1":
os.system('cls' if os.name == 'nt' else 'clear')
input()
else:
print "I dont understand that."
答案 0 :(得分:1)
这是一个很好的问题。我为你写了两个函数:
insert_before_back(列表,列表)
void Update()
{
#if UNITY_ANDROID || UNITY_IPHONE
if (Input.touchCount > 0)
{
Touch touch = Input.touches[0];
switch (touch.phase)
{
case TouchPhase.Began:
startPos = touch.position;
StartCoroutine(Jump());
break;
case TouchPhase.Moved:
isSwipe = true;
float swipeDistHorizontal = (new Vector3(touch.position.x, 0, 0) - new Vector3(startPos.x, 0, 0)).magnitude;
float swipeDistVertical = (new Vector3(0, touch.position.y, 0) - new Vector3(0, startPos.y, 0)).magnitude;
if (swipeDistHorizontal > minSwipeDistX)
{
float swipeValue = Mathf.Sign(touch.position.x - startPos.x);
if (swipeValue > 0 && !isTouch)//to right swipe
{
isTouch = true;
StartCoroutine(Right());
}
else if (swipeValue < 0 && !isTouch)//to left swipe
{
isTouch = true;
StartCoroutine(Left());
}
}
//add swipe to up
if(swipeDistVertical > minSwipeDistY)
{
float swipeValue = Mathf.Sign(touch.position.y - startPos.y);
if(swipeValue > 0 && !isTouch)
{
isTouch = true;
StartCoroutine(Jump2());
}
}
break;
case TouchPhase.Ended:
isSwipe = false;
isTouch = false;
break;
}
}
#endif
}
IEnumerator Jump2()
{
yield return new WaitForSeconds(0.05f);
if(playerVelocity <= 0.2f)
{
Debug.Log("Swipe Up");
}
}
IEnumerator Jump()
{
if (!isSwipe)
{
yield return new WaitForSeconds(0.05f);
if (!isSwipe && playerVelocity <= 0.2f)
{
Debug.Log("Tap");
}
else
{
yield break;
}
}
else
{
yield break;
}
}
IEnumerator Right()
{
Debug.Log("Right");
}
IEnumerator Left()
{
Debug.Log("Left");
}
接收文件行列表以及要在insert_before_back
之前添加的所有行的列表,然后返回一个列表,并在正确的索引中添加项目
add_inventory(list,string)
Back:
会获取文件行的列表以及您希望增加其库存的商店名称。然后它经过并将该数字加1,并将列表中的值重置为新增加的值。它返回一个新行的列表。
您可以使用这些来修改您读入的行列表,然后只需浏览列表中所有新修改的项目,并将每个项目写入具有相同名称的文件。
以下是我使用这两个函数的一个例子:
add_inventory
答案 1 :(得分:1)
这是一个有趣的问题,heinst提供了一个很好的解决方案。我对这个架构有一些保留意见。以下是我看到的问题,如果这是一个非常小的项目并且预计会在有限的时间内使用,则可以忽略这些问题。
并发和并行问题: 如果多个用户同时尝试阅读和更新库存,我们需要一个不同的解决方案。数据库可以轻松支持库存中的多个同时事务,而不是将文件系统作为持久存储。
可伸缩性问题: 随着事务与时间的增加,文件大小增加并且读取整个文件并更新它将无法很好地扩展。必须使用某种方案在多个文件之间拆分事务。
答案 2 :(得分:-1)
据我所知,我们无法修改文件的中间位置。
您只有两个选择:
将所有文件作为列表读入内存,然后修改列表,然后将所有列表写入文件。
(推荐)使用xml文件保存信息,但不保存普通文件。因此,您可以使用大量工具来编写或阅读它。