小编Dan*_*ira的帖子

计算两点之间的最短路线

过去几周我一直在使用nodejs和玩多人HTML5游戏websockets.

我已经陷入了这个问题一段时间了.想象一下,我有一个用数组实现的tileheet map(如下所示).

1棕色瓷砖 - 路上有障碍物,玩家无法通过它.

0绿色瓷砖 - 是允许玩家移动的自由路径.

通过以下方式访问地图上的任何图块:

 array[x][y]
Run Code Online (Sandbox Code Playgroud)

tilesheet map  - 计算最短路径

我想创建最快的算法,找出地图两点之间的最短路径(如果有的话).你会如何解决这个问题?我知道这是常见的问题.

示例:

位置(1,7)的玩家用一些人工智能发射子弹,该AI会朝向位置(6,0)的敌方玩家.子弹必须计算两个球员之间的最短路线,如果没有,它只会在墙上爆炸.

问题:

如何有效地找到两点之间的最短路线?

javascript algorithm math node.js graph-algorithm

19
推荐指数
1
解决办法
5191
查看次数

C/Linux - 服务器< - >与命名管道的终端通信

我正在为大学开展一个项目,我只能使用命名管道(mkfifo())来建立服​​务器和终端之间的通信(两者都由我创建).

有:

  • 只有1台服务器;
  • 1个或更多终端;

实际上我的应用程序是这样的:

在此输入图像描述

  • 终端通过命名管道(红色)向服务器发送command_t结构.这个命名管道是一个FIFO,它在所有终端之间共享.在发送command_t strucutre之后,终端将尝试从另一个命名管道(蓝色)读取回复,并且它将被阻塞,直到服务器在该管道中写入内容.
  • 服务器从命名管道(红色)读取并按先来先服务的方式处理接收到的命令(command_t结构).有几个线程意味着同时处理多个请求.
  • 处理完命令后,服务器通过另一个命名管道(蓝色)发送reply_t结构.

问题:

如果我只使用一个线程启动服务器,这一切都正常,因为响应(reply_t)按命令到达的顺序发送(command_t)

但是,如果我使用多个线程启动服务器,我无法保证响应以命令到达的相同顺序发送,这将使我得到混合响应(类似于,我将在终端1上收到结果从终端2等命令执行...).

我在考虑制作这样的东西: 在此输入图像描述

在这个解决方案中,我将为连接到服务器的每个终端输出PIPE,而不是在所有终端之间共享一个输出PIPE.但是如何在C中实现可变数量的终端?我甚至无法检测新终端何时打开输入PIPE.

有什么建议?谢谢!

c linux bash multithreading

8
推荐指数
1
解决办法
765
查看次数

记录第二个键盘事件

我有自己的键盘和USB条形码扫描仪,就像第二个键盘一样.

我想使用主键盘来控制计算机(正如您通常那样)和第二个键盘(实际上是条形码扫描仪)将所有输入记录到文件中.

这可能吗?

关键是,我可以在互联网上,单词,excel或其他任何东西.我会使用主键盘写入该进程,而在后台,第二个键盘(条形码扫描器)可以同时写入,但是可以写入日志文件.我现在可以使用的程序永远不会知道第二个键盘输入.

在此输入图像描述

谢谢,非常欢迎所有的建议.

c c++ windows

6
推荐指数
1
解决办法
297
查看次数

使用printf作为重入函数C.

我正在处理多个进程和信号,我昨天刚刚发现printf不是一个可重入的函数,因此将信号处理程序与信号处理程序一起使用存在风险.我能做些什么吗?是否有任何可重入的printf或任何可重入的系统调用可以取代printf?

谢谢!

c printf signals

5
推荐指数
1
解决办法
659
查看次数

Java和Box2D - 应该将哪个主体视为子弹?

我正在使用java和box2D(来自libgdx)创建游戏.

此时我有一个问题,当图像的红色体落下时,有时它不会撞到平台(也就是动态体),因为它以高速度下落并且碰撞检测不连续.

在此输入图像描述

我的问题是,既然两个物体都是动态的,我想确保检测到红体的平台之间的碰撞我应该将两个物体都设置为子弹体吗?只有红色的身体?还是只有平台?

笔记:

  • 红色的身体以非常高的速度下降

  • 平台不会高速移动

谢谢你,祝圣诞快乐!

java box2d game-physics

5
推荐指数
1
解决办法
662
查看次数

Java尝试捕获,直到没有抛出异常

我试图使用扫描仪和无限循环从用户获取一个整数.我知道解决这个问题的解决方案,但我一直想知道为什么我的第一种方法不能正常工作?

Scanner myScanner = new Scanner(System.in);
int x = 0;
while(true){
    try{
        System.out.println("Insert a number: ");
        x = myScanner.nextInt();
        break;
    }catch(InputMismatchException e){
        System.out.println("Invalid, try again.");
        continue;
    }
}
Run Code Online (Sandbox Code Playgroud)

它适用于第一次迭代,但它只是在屏幕上永远打印"无效,再试一次".

java exception

4
推荐指数
1
解决办法
2129
查看次数

C++返回性能

我对性能有疑问.我认为这也适用于其他语言(不仅仅是C++).

想象一下,我有这个功能:

int addNumber(int a, int b){
    int result = a + b;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

如果我像这样编写上面的代码,是否有任何性能提升?

int addNumber(int a, int b){
     return a + b;
}
Run Code Online (Sandbox Code Playgroud)

我有这个问题,因为第二个函数没有声明第三个变量.但是编译器会在第一个代码中检测到这个吗?

c++

3
推荐指数
1
解决办法
121
查看次数

fclose(stdout) 与 close(STDOUT_FILENO) - C

我想将 STDOUT 重定向到磁盘上的文件。重点是让我的程序上的 printf 写入文件而不是控制台。

我在网上看到一些文章,他们使用了:

dup2(fileno(outputFile), STDOUT_FILENO);
Run Code Online (Sandbox Code Playgroud)

或者:

close(STDOUT_FILENO);
dup(fileno(outputFile)); 
Run Code Online (Sandbox Code Playgroud)

在每个教程中他们都使用 close() 并且它确实有效。但我很好奇,我尝试使用 fclose(stdout) 代替,但当我尝试使用 printf 时发生了一些错误:

fclose(STDOUT_FILENO);
dup(fileno(outputFile)); 
Run Code Online (Sandbox Code Playgroud)

错误:

Bad file descriptor
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么 fclose() 不起作用而 close() 起作用?

谢谢。

c

3
推荐指数
1
解决办法
4249
查看次数

两个连接的套接字可以监听不同的端口吗?

想象一下,客户端有一个侦听端口 80 的套接字。这个套接字可以连接到侦听其他不同端口的服务器套接字吗?或者服务器也必须监听端口 80?

我指的是 AF_INET 类型的网络套接字。

c unix sockets

2
推荐指数
1
解决办法
1008
查看次数

开/关原理和多态性

开放/封闭原则指出,软件实体(类,模块等)应为扩展而开放,但为修改而封闭。今天我了解了这一点,我的老师说这个概念与多态性概念有内在联系。我真的看不到这两个概念是如何联系的,有人可以解释吗?

oop

1
推荐指数
1
解决办法
544
查看次数