Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 战斗游戏中标记双方的数据设计问题_Database_Algorithm_Design Patterns_Data Structures_Database Design - Fatal编程技术网

Database 战斗游戏中标记双方的数据设计问题

Database 战斗游戏中标记双方的数据设计问题,database,algorithm,design-patterns,data-structures,database-design,Database,Algorithm,Design Patterns,Data Structures,Database Design,我正在设计一款象棋类游戏,但我相信这个问题可以推广到所有有战斗的游戏 所以我的问题是,我应该如何正确地将一个对象标记为朋友 战斗游戏中的对象还是敌人 以国际象棋为例。如果玩家W使用白色棋子,那么W的对手玩家B使用黑色棋子 对于W,所有白色棋子都是朋友对象,黑色棋子是敌人对象,而玩家B有黑色朋友和白色敌人。所以这里我的标签问题可以通过使用颜色简单地解决。当你试图计算一个棋子的可能移动并决定是否可以取出一个棋子时,你基本上可以检查它们是否有不同的颜色 但是,如果两个玩家有相同的观点呢?例如,一个游戏

我正在设计一款象棋类游戏,但我相信这个问题可以推广到所有有战斗的游戏

所以我的问题是,我应该如何正确地将一个对象标记为
朋友
战斗游戏中的对象还是敌人

以国际象棋为例。如果玩家W使用白色棋子,那么W的对手玩家B使用黑色棋子

对于W,所有白色棋子都是
朋友
对象,黑色棋子是
敌人
对象,而玩家B有黑色
朋友
和白色
敌人
。所以这里我的标签问题可以通过使用颜色简单地解决。当你试图计算一个棋子的可能移动并决定是否可以取出一个棋子时,你基本上可以检查它们是否有不同的颜色

但是,如果两个玩家有相同的观点呢?例如,一个游戏可以将所有
朋友
涂成黑色,而将所有
敌人
涂成白色,玩家在开始游戏时将其棋子全部放在底部。实际上,从这个意义上讲,棋子可以被视为玩家的属性。因此,黑白的颜色取决于一件作品是否有与你相同的所有者id

这里有一个问题:

虽然我可以通过比较ID来决定颜色,但是如果我想要呢 要知道一个
朋友
棋子是否进入
敌人区域

敌区的定义可以是棋盘的上部。由于棋盘不是玩家的一部分(而棋子也可以),所以不可能使用以前的id解决方案

因此,我能想到的一个可能的解决方案是使棋盘成为玩家的属性。然而,有两个玩家,这使数据存储加倍,因为从客观角度来看,我们实际上只有一块板。对一个工件的任何移动和进一步更改都需要在两块板上进行操作,这也很耗时

为了避免翻倍棋盘,我尝试使用另一种策略,即使用横向视图。我的意思是,数据并没有把双方作为参与者。玩家可以从底部查看棋盘,也可以从顶部查看棋盘,这与纵向视图类似,而数据可以从从左到右/从右到左查看,就像公正的裁判所观察的那样。因此,这里的数据变得更加客观。但问题是如何以主观的方式向玩家呈现客观数据?而且还不容易知道是否有碎片进入敌区

因此,我的问题是,我应该如何正确设计数据结构,使其不会将数据加倍、三倍或复制多次,同时也很容易知道公共区域的标签?在我的问题中,公共区域是一个棋盘,所有棋子都应该在这个棋盘上比赛。我称之为公开,因为两个玩家都可以将他们的棋子移动到棋盘上的任何地方,第三方也可以看到棋盘上发生了什么。但作品的标签只是主观属性,个人的私人的想法

我不确定我是否能很好地解释/措辞我的问题,因此我没有寻找类似的问题。对不起,我太懒了。如果有重复的问题,请指导我

---更新---

我想更清楚的问题是,假设我有3*3块板。如果我需要将我的棋子从(1,2)移动到(2,3),那么在我的对手看来,移动不是在同一个位置进行的。恰恰相反。它是从(3,2)到(2,1)。存储此移动的最佳方式是什么?我是否必须选择一侧(主观)来存储它,或者是否有一种中立/客观的方法来存储它

对我来说,主观方式的缺点是,我需要重新计算其他玩家的移动,以符合他/她的观点。使用中立的方式可能是一个救命稻草

如果我需要将我的棋子从(1,2)移动到(2,3),那么在我的对手看来,移动不是在同一个位置进行的。恰恰相反。它是从(3,2)到(2,1)。存储此移动的最佳方式是什么?我是否必须选择一侧(主观)来存储它,或者是否有一种中立/客观的方法来存储它

为电路板选择一个方向。你选哪一个无关紧要。这是一种中立/客观的方式——两种选择都不会给任何一个玩家带来任何优势,而且这种选择也不会对代码产生显著影响。你想象的任何不平衡,比如说最好让(0,0)在你自己的一边,都是虚构的


这不是一个“主观”的选择,而是一个“任意”的选择。

一个没有具体数据库设计的一般答案-有数据,有多个视图。不需要复制数据,只需要对某些数据有多个引用(当然也需要一些内存)。例如。一辆车被一个正方形和一个玩家引用。根据运行时/存储设计决策,可以存储此类引用(集合“敌人”),也可以动态计算此类引用(集合“可达”)。此外,多个玩家只是视图。在游戏移动中,您必须更新所有静态视图,而动态视图则不需要更新


对于对称游戏,有可能不存储对手的视图,而是通过每一步将整个游戏转换为其他玩家的视图来生成它们。这也是你的决定,存储还是动态创建。

你不是想得太多了吗?你有一个游戏模型,其中的棋子可以有一个所有者id,一个棋盘可以有一个所有者id。然后你有一个视图,它是从特定角度对模型的表示。长安