- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些现有的 C# 代码,用于一个非常非常简单的 RogueLike 引擎。故意天真,因为我试图尽可能简单地做最少的事情。它所做的只是使用箭头键和 System.Console 在硬编码 map 周围移动 @ 符号:
//define the map
var map = new List<string>{
" ",
" ",
" ",
" ",
" ############################### ",
" # # ",
" # ###### # ",
" # # # # ",
" #### #### # # # ",
" # # # # # # ",
" # # # # # # ",
" #### #### ###### # ",
" # = # ",
" # = # ",
" ############################### ",
" ",
" ",
" ",
" ",
" "
};
//set initial player position on the map
var playerX = 8;
var playerY = 6;
//clear the console
Console.Clear();
//send each row of the map to the Console
map.ForEach( Console.WriteLine );
//create an empty ConsoleKeyInfo for storing the last key pressed
var keyInfo = new ConsoleKeyInfo( );
//keep processing key presses until the player wants to quit
while ( keyInfo.Key != ConsoleKey.Q ) {
//store the player's current location
var oldX = playerX;
var oldY = playerY;
//change the player's location if they pressed an arrow key
switch ( keyInfo.Key ) {
case ConsoleKey.UpArrow:
playerY--;
break;
case ConsoleKey.DownArrow:
playerY++;
break;
case ConsoleKey.LeftArrow:
playerX--;
break;
case ConsoleKey.RightArrow:
playerX++;
break;
}
//check if the square that the player is trying to move to is empty
if( map[ playerY ][ playerX ] == ' ' ) {
//ok it was empty, clear the square they were standing on before
Console.SetCursorPosition( oldX, oldY );
Console.Write( ' ' );
//now draw them at the new square
Console.SetCursorPosition( playerX, playerY );
Console.Write( '@' );
} else {
//they can't move there, change their location back to the old location
playerX = oldX;
playerY = oldY;
}
//wait for them to press a key and store it in keyInfo
keyInfo = Console.ReadKey( true );
}
open System
//define the map
let map = [ " ";
" ";
" ";
" ";
" ############################### ";
" # # ";
" # ###### # ";
" # # # # ";
" #### #### # # # ";
" # # # # # # ";
" # # # # # # ";
" #### #### ###### # ";
" # = # ";
" # = # ";
" ############################### ";
" ";
" ";
" ";
" ";
" " ]
//set initial player position on the map
let mutable playerX = 8
let mutable playerY = 6
//clear the console
Console.Clear()
//send each row of the map to the Console
map |> Seq.iter (printfn "%s")
//create an empty ConsoleKeyInfo for storing the last key pressed
let mutable keyInfo = ConsoleKeyInfo()
//keep processing key presses until the player wants to quit
while not ( keyInfo.Key = ConsoleKey.Q ) do
//store the player's current location
let mutable oldX = playerX
let mutable oldY = playerY
//change the player's location if they pressed an arrow key
if keyInfo.Key = ConsoleKey.UpArrow then
playerY <- playerY - 1
else if keyInfo.Key = ConsoleKey.DownArrow then
playerY <- playerY + 1
else if keyInfo.Key = ConsoleKey.LeftArrow then
playerX <- playerX - 1
else if keyInfo.Key = ConsoleKey.RightArrow then
playerX <- playerX + 1
//check if the square that the player is trying to move to is empty
if map.Item( playerY ).Chars( playerX ) = ' ' then
//ok it was empty, clear the square they were standing on
Console.SetCursorPosition( oldX, oldY )
Console.Write( ' ' )
//now draw them at the new square
Console.SetCursorPosition( playerX, playerY )
Console.Write( '@' )
else
//they can't move there, change their location back to the old location
playerX <- oldX
playerY <- oldY
//wait for them to press a key and store it in keyInfo
keyInfo <- Console.ReadKey( true )
最佳答案
一般而言,游戏编程将测试您管理复杂性的能力。我发现函数式编程鼓励您将解决的问题分解成更小的部分。
您要做的第一件事是通过分离所有不同的关注点,将您的脚本变成一堆函数。我知道这听起来很愚蠢,但这样做的行为将使代码更具功能性(双关语)。您主要关注的是状态管理。我用一个记录来管理位置状态,用一个元组来管理运行状态。随着您的代码变得更高级,您将需要对象来干净地管理状态。
尝试在此游戏中添加更多内容,并随着功能的增长不断分解这些功能。最终,您将需要对象来管理所有功能。
在游戏编程笔记上,不要将状态更改为其他内容,如果未通过某些测试,则将其更改回来。你想要最小的状态变化。因此,例如下面我计算了 newPosition
然后只更改 playerPosition
如果这个 future 的职位过去了。
open System
// use a third party vector class for 2D and 3D positions
// or write your own for pratice
type Pos = {x: int; y: int}
with
static member (+) (a, b) =
{x = a.x + b.x; y = a.y + b.y}
let drawBoard map =
//clear the console
Console.Clear()
//send each row of the map to the Console
map |> List.iter (printfn "%s")
let movePlayer (keyInfo : ConsoleKeyInfo) =
match keyInfo.Key with
| ConsoleKey.UpArrow -> {x = 0; y = -1}
| ConsoleKey.DownArrow -> {x = 0; y = 1}
| ConsoleKey.LeftArrow -> {x = -1; y = 0}
| ConsoleKey.RightArrow -> {x = 1; y = 0}
| _ -> {x = 0; y = 0}
let validPosition (map:string list) position =
map.Item(position.y).Chars(position.x) = ' '
//clear the square player was standing on
let clearPlayer position =
Console.SetCursorPosition(position.x, position.y)
Console.Write( ' ' )
//draw the square player is standing on
let drawPlayer position =
Console.SetCursorPosition(position.x, position.y)
Console.Write( '@' )
let takeTurn map playerPosition =
let keyInfo = Console.ReadKey true
// check to see if player wants to keep playing
let keepPlaying = keyInfo.Key <> ConsoleKey.Q
// get player movement from user input
let movement = movePlayer keyInfo
// calculate the players new position
let newPosition = playerPosition + movement
// check for valid move
let validMove = newPosition |> validPosition map
// update drawing if move was valid
if validMove then
clearPlayer playerPosition
drawPlayer newPosition
// return state
if validMove then
keepPlaying, newPosition
else
keepPlaying, playerPosition
// main game loop
let rec gameRun map playerPosition =
let keepPlaying, newPosition = playerPosition |> takeTurn map
if keepPlaying then
gameRun map newPosition
// setup game
let startGame map playerPosition =
drawBoard map
drawPlayer playerPosition
gameRun map playerPosition
//define the map
let map = [ " ";
" ";
" ";
" ";
" ############################### ";
" # # ";
" # ###### # ";
" # # # # ";
" #### #### # # # ";
" # # # # # # ";
" # # # # # # ";
" #### #### ###### # ";
" # = # ";
" # = # ";
" ############################### ";
" ";
" ";
" ";
" ";
" " ]
//initial player position on the map
let playerPosition = {x = 8; y = 6}
startGame map playerPosition
关于f# - 在 F# 中非常简单的 RogueLike,使它更 "functional",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4495993/
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我正在制作一款 roguelike 游戏,我正在尝试将“快速而肮脏”的 FOV 技术应用到我的游戏中,但我遇到了一些问题。我几乎可以肯定它在我的函数中完成了线计算,其中我有一个 x 和 y 变量沿着
我正在为一款基于 ascii 字符的 roguelike 游戏编写绘图系统(类似于矮人要塞的图形)。我正在使用 here 中的 AsciiPanel 。我的问题是,当我在 map 上绘制实体时,它们似
我正在做一个大学 compsci 项目,我需要一些关于视野算法的帮助。我主要工作,但在某些情况下,算法会看穿墙壁并突出显示玩家不应该看到的墙壁。 void cMap::los(int x0, int
作为 JAVA 继承的学习进程,我组合了一个调度程序类和参与者类。调度程序类创建一个参与者对象列表,并通过它们调用参与者的 act()。 现在,我对 actor 类的第一直觉是向玩家 actor 传递
我正在开发一款 Roguelike 游戏,作为编程/数据库练习和爱好(因为我想拥有自己的“矮人堡垒”项目来随心所欲地称霸)。当我试图编写一个足够强大的系统来生成游戏中的各种生物时,我很早就陷入了困境。
我继续在我的 python roguelike 上取得进展,并进一步深入学习本教程:http://roguebasin.roguelikedevelopment.org/index.php?title
当我尝试运行这段代码时,在 game_start 函数中创建的 pygame 窗口没有启动。当我删除 game_main_loop 功能时,它确实如此。我无法弄清楚该功能有什么问题,有人有任何想法吗?
我正在用 C 语言制作 Roguelike 游戏,但我无法让我的角色按照我想要的方式移动。我在点 (x, y) 处制作了一个带有字符的二维字符数组,绘制了数组,更改了 x 和 y 值,并根据输入的方向
好吧,这听起来像是一个疯狂的想法 - 但我有兴趣模仿 1980 年代的风格 roguelike game纯 Java 中的文本界面,即使用 Swing 或类似软件。 这里大致是它需要做的: 提供固定大
又是我。我仍在开发 Roguelike 游戏,但我还有另一个问题。我使用 Jlabel 的 2D 数组在 GridLayout 上显示我的 map ,它工作得很好。但现在,我想在地板上画我的角色、怪物
[更新] 我尝试使用下面的建议,但仍然有一个问题,即敌人似乎同时移动,并且当第一次看到是否已经有敌人在视线中时,他们每个移动两次。我真正想做的是在玩家视线中的敌人的行动之间有一个延迟,这样他们就不会同
我已经使用 Libgdx 从键盘字符中生成了一个地牢。我决定将数组打印为文本文件。 然而这是我得到的: 而且不一致 我不明白这是怎么回事?我检查了我的算法,没有发现任何错误。 这是我的代码: publ
几个月来我一直梦想制作 Roguelike,但出于某种原因,我固执的头脑不允许我使用图书馆。如何在不使用 stdio.h 以外的库的情况下绘制 map 并对其进行操作? 最佳答案 C 不知道“键盘”或
我有一些现有的 C# 代码,用于一个非常非常简单的 RogueLike 引擎。故意天真,因为我试图尽可能简单地做最少的事情。它所做的只是使用箭头键和 System.Console 在硬编码 map 周
我正在使用 Objective-C/Cocoa 开发一款 Roguelike 游戏,以了解更多信息。我已经掌握了大部分基本功能,但仍然有一个问题一直在试图解决。 以下是该过程的分割: 首先,加载 ma
我正在使用 libtcod 和 python 来制作 roguelike;我正在跟随的教程中,只有当您在怪物的视野中时,怪物才会跟随您。显然这是不够的;因为这意味着您可以转弯,而他们不会跟着您转弯。
我一直在考虑使用 Silverlight 构建基于 Web 的 Roguelike 游戏(或者可能只是使用 WPF 的桌面游戏)。 如果您不知道 Roguelike 是什么,它是一种图形角色扮演游戏,
我刚刚完成 this tutorial 的工作用于在 Python 中编写 Roguelike 程序,现在我非常依赖自己来确定去哪里以及下一步该做什么。 我的困境在于代码的困惑。我想将元素存储在某处,
Similar question found here 我正在开发一款用 Haskell 编写的 Roguelike 游戏。我决定使用 Data.Array.Repa 将世界表示为 2D 网格。 ,现
我是一名优秀的程序员,十分优秀!