有兴趣创建一个roguelike RPG(如Nethack,Rogue和ADOM),哪种编程语言最合适,为什么?
使用您选择的语言,请务必列出使其特别适合的语言库或方面.
这是一个玩具问题:
(roguelike)2D地图由方形单元组成,每个单元都有一种材料(岩石或空气).
每个单元具有四个边界(N,S,E和W).每个边界由两个单元共享.
只有当一侧是岩石而另一侧是空气时,边界可以选择性地包含"墙特征".
(墙壁功能可以是杠杆,图片,按钮等)
只有当一边是岩石而另一边是空气时,代数数据类型设计才能有一个存储墙特征的地方?即,数据结构不能代表两个气囊或两个岩石细胞之间的边界上的壁特征.
我尝试过的一种方法是对单元格值进行XORing棋盘图案,反转变化并且不变.
我不断得知自己在细胞之间存在多条等效路线的事实 - SSW与SWS相同(这个问题的1D版本是微不足道的).
(我认识到ADT表示不会特别'可查询'.)
更新失败的尝试:
称东边界E和南边界S.让每个边界为Same
或者Diff Feature
.这种方法的问题在于它允许存在不一致的路由,例如:
E<0,0> Same
S<1,0> Same
S<0,0> Same
E<0,1> Diff
Run Code Online (Sandbox Code Playgroud)
是否有一个数学名称,说不同的路线必须汇总到相同的总数?
您可以说Same为1且Diff为-1,并且任何两个单元格之间的每条路径上的乘积必须相等(1或-1).
好吧,这听起来像是一个疯狂的想法 - 但我有兴趣用纯Java 模仿20世纪80年代风格的roguelike游戏文本界面,即使用Swing或类似的东西.
这大致是它需要做的事情:
任何人都知道一个好的现有解决方案,可以实现这一点 或者我是不是从头开始一起黑客攻击?
ps我想要纯Java的原因是它可以在沙盒applet中运行.所以像jcurses这样的JNI解决方案被遗憾地排除了......
我正在搜索一些库,它实现了在多个游戏中使用的基于组件的实体系统(ECS)框架,并在许多游戏引擎中实现(unity,libgdx等)
我正在scala(ECS roguelike)开始一个小游戏项目,此时我只找到一个名为ashley的java库.
你知道是否存在其他ECS库(在Scala中),或者唯一的方法是在scala(ashley)中使用或重新实现这个库吗?
另一个相关的问题,演员范式和基于组件的实体系统并不是那么遥远,有什么区别?
我有一些现有的C#代码,用于非常非常简单的RogueLike引擎.故意天真,因为我试图尽可能简单地做到最低限度.它所做的只是使用箭头键和System.Console在硬编码的地图上移动@符号:
//define the map
var map = new List<string>{
" ",
" ",
" ",
" ",
" ############################### ",
" # # ",
" # ###### # ",
" # # # # ",
" #### #### # # # ",
" # # # # # # ",
" # # # # # # ",
" #### #### ###### # ",
" # = # ",
" # = # ",
" ############################### ",
" ",
" …
Run Code Online (Sandbox Code Playgroud) 我没有太多的Java经验,但我试图编写一个简单的类似流氓的游戏来熟悉它,我只是想知道我将如何创建这样的界面:
有没有明显的方法可以让你这样做?作为Java新手,我真的不知道最好的方法是什么.
抱歉要模糊!
谢谢
我刚刚完成了本教程,用Python编写了一个Roguelike,我现在非常想知道去哪里以及接下来要做什么.
我的困境在于代码的混乱.我想在某个地方存储元素,例如项目; 生物; 技能; 任何可能存在大量具有众多属性的东西.
目前,所有这些代码都在一个变得非常大的单个文件中,这是最基本的.在一个级别放置项目的功能目前看起来很像:(生成级别时调用此函数)
def place_objects(room):
#Maximum number of items per room
max_items = from_dungeon_level([[1, 1], [2, 4]])
#Chance of each item (by default they have a chance of 0 at level 1, which then goes up)
item_chances = {}
item_chances['heal'] = 35
item_chances['lightning'] = from_dungeon_level([[25, 4]])
item_chances['fireball'] = from_dungeon_level([[25, 6]])
item_chances['confuse'] = from_dungeon_level([[10, 2]])
item_chances['sword'] = from_dungeon_level([[5, 4]])
item_chances['shield'] = from_dungeon_level([[15, 8]])
#Choose a random number of items
num_items = libtcod.random_get_int(0, 0, max_items)
for i …
Run Code Online (Sandbox Code Playgroud) 我目前正在创建一个roguelike游戏,并且已经开始使用C#进行编码,但到目前为止还没有编写太多(<1000行)...
再说一次,我看了一下F#,这个语言看起来很酷......我现在正在考虑使用F#作为游戏引擎,我认为这将是代码行的90%(一个roguelike有一个非常'精益'的ASCII-UI).
你认为,F#比C#更适合编写程序内容生成,复杂AI和游戏逻辑的编码吗?你看到任何陷阱(除此之外,我当然要先掌握这门语言)吗?
如果F#不仅仅是一个研究项目并且将被微软抛弃,还是有声称它现在是一种主要的.NET语言,我有些担忧?
感谢您的输入.
我正在斯卡拉写一个roguelike.我需要能够看到用户何时按下箭头键.我找到的所有解决方案都要求玩家按下回车键.
有没有办法以与C中的getch()类似的方式检测控制台应用程序中的按键?
(不是这样)这里的简短问题.我正在制作一个简单的roguelike,使用Swing作为UI而不是控制台(这使得它更容易在Eclipse中工作,除其他外)但我似乎遇到了障碍.
我遇到的麻烦是,当我进入游戏循环时,UI将无法正常显示.我得到一个丑陋的窗框,在整个过程中给我"单人纸牌"的效果,而在运行它时,它的RAM使用量会迅速增长.
我在这里错过了一些关于Swing的批评吗?我是否必须使用Swing的并发设置来执行此操作?如果是这样,最好的方法是什么?
完整代码如下:
package roguelike;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.LinkedList;
import javax.swing.*;
import javax.swing.text.*;
public class roguelike {
Color c_black = new Color(0x000000);
Color c_white = new Color(0xffffff);
Color c_red = new Color(0xff0000);
Color c_blue = new Color(0x0000ff);
Color c_green = new Color(0x00ff00);
UI ui = null;
Player me = null;
Map gamemap = null;
LinkedList<Character> keyqueue = new LinkedList<Character>();
int charheight = 20;
int charwidth = 80;
public static …
Run Code Online (Sandbox Code Playgroud) 我正在做一个roguelike游戏.我想将地图表示为结构数组,例如在数组中有256个结构.地图是一个16*16的图块网格,每个图块都有属性,例如它上面是否有项目.
所以说我想要一个256个结构的数组tiles
:
struct tiles {
char type; /* e.g. dirt, door, wall, etc... */
char item; /* item on top of it, if any */
char enty; /* entity on top of it, e.g. player, orc if any */
}
Run Code Online (Sandbox Code Playgroud)
然后,我需要访问这样的结构数组:
int main(void)
{
unsigned short int i;
struct tiles[256];
for (i = 1; i <= 256; i++) {
struct tiles[i].type = stuff;
struct tiles[i].item = morestuff;
struct tiles[i].enty = evenmorestuff;
}
}
Run Code Online (Sandbox Code Playgroud)