로그라이크 프로잭트의 정리
일단 자바스크립트를 처음 해보는 것임으로 가능한 많은 방법을 사용해 보려고 노력했다.
첫번째로 시도한것은 코드의 분활이었다.
개인적으로 c , c++,c#만 해왔음으로 제일 먼저 만든것은 main.js 파일이었다.
import { execSync } from 'child_process';
import {server_Main} from "./gameScripts/server_sample.js";
execSync('chcp 65001');
server_Main.start(false);
제일 먼저 한 생각으로는 모든 전역변수를 이곳에 선언하고 활용할 예정이었으나 export import를 잘 몰라서 만든 실수였다. 자바는 import 한다고 해서 내용을 전부 가져오는게 아니었고 변수의 데이터도 가져오지 않았다.
결론적으로 main.js 파일은 사실상 목적이 없는 나누기가 되었다.
기본 기능을 완성하고 제일 먼저 만들기 시작한건 옵션 기능이었다.
나는 다른 일반적인 게임들처럼 ini 파일을 만드려 시도했다.
나는 관련 라이브러리 같은게 있을까 하는 생각을 하며 import 내용을 보기 시작했다.
뼈대가 된 프로그램을 보니 chalk 라는 어디서 온지 모를 import가 있었고 검색중에 npm이라는걸 알게 되었다.
그래서 npm에서 ini파일을 만드는 내용을 그대로 사용했다. 옵션인 만큼 불러오기를 하는데 비동기로 작동해서는 안되었고 동기함수를 사용했다. 그러나 저장에 경우에는 비동기로 작동하게 만들었다.
function saving_init(game_setting) {
return writeIniFile.writeIniFile(name_of_ini_file, game_setting).then(() => {
console.log('저장완료!');
})
}
이전에 일하던 곳에서는 모든 내용이 크리티컬해서 사실상 비동기 작동을 거의 하지 않았었기에 이 비동기 동작은 나에게 아예 외계의 것이었다.
내가 올바르게 프로그램을 하기를 기도하기 시작했다.
이후 나는 게임 저장을 만들기로 했다.
1차적으로 게임의 정보를 가지고있는 무언가를 만들기 시작했다.
class Battle_status {
#_player = new Actor_constructor();
#_monster;
#_difficulty = 1;
#_floor = 0;
constructor(player, monster, difficulty, floor) {
this.#_player = player ?? this.#_player;
this.#_monster = monster ?? this.#_monster;
this.#_difficulty = difficulty ?? this.#_difficulty;
this.#_floor = floor ?? this.#_floor;
}
Battle_statusTOJson = function (battlestatus) {
if (battlestatus == null) battlestatus = new Battle_status();
let json_object =
JSON.stringify({
player: battlestatus.player.Actor_constructorTOJson(battlestatus.player),
monster: battlestatus.monster == null ? '' : battlestatus.monster.Actor_constructorTOJson(battlestatus.monster),
difficulty: battlestatus.difficulty,
floor: battlestatus.floor,
});
return json_object;
};
}
쓸데없는 get set은 제외하고 올렸다. 나는 이 battle_status를 객체에서 class로 다시 객체로 수십번 고쳐썼다.
내가 처음 생각한건 class로 만드는 것이었는데 import export 하는 과정에서 class의 데이터를 바로 가져오지 못하길래 class가 여기서는 다르게 작동하는가 싶어 object로 만들었다가 이후 생성자를 사용하기 위해 다시 class로 변경하였다.
코드가 변경되는것도 없이 같은 내용을 수십번 적게되어 많은 시간을 낭비했으나 아직도 class와 object 그리고 import export의 데이터 처리가 어떻게 되는지 잘 이해가 되지 않는다.
결과적으로 나는 데이터를 txt파일로 사용자/앱데이터/로밍에 데이터를 저장했다.
다음으로 나는 업적을 만들기로 했다.
이 시점에서 자바에 대한 이해도 보다는 실행은 되리라는 믿음으로 프로그램을 하기 시작했다.
let achievement_list = [
{
name: '업적',
achieved: true,
achiev_check(...achiev_data) {//뭐가되었든 성공
return true;
}
},...
]
그래서 배열안에 객체와 함수를 넣기 시작했다.
확인 알고리즘을 분리해서 읽기도 편하고 추가하기도 편할것이라는 예상 하에
let achievement_achieved = function (index, achievement_list, ...achiev_data) {
if (isNaN(index)) {
for (let i = 0; i < achievement_list.length; i++) {
if (achievement_list[i].name == index) {
index = i;
break;
}
}
}
if (achievement_list[index].achieved) return true;
if (achievement_list[index].achiev_check(...achiev_data)) {
achievement_list[index].achieved = true
save_achievement_list(achievement_list);
return true;
}
return false;
}
이해도는 부족했지만 즐거웠다고 자부할 수 있다.
그리고 이번 저장은 npm이 아니라 nodejs에서 가져와 쓰기로 했다. 사용법은 거의 동일했고 문서를 하나 더 읽어야 했다는 점을 뺴면 큰 문제는 없었다.
let save_achievement_list = function (achievement_list) {
try {
let tmp_achievement_list = ``;
achievement_list.forEach((element, index) => {
tmp_achievement_list += element.achieved ? `${index}, ` : ``;
});
fs.writeFile(name_of_achievement_file, tmp_achievement_list, (err) => {
if (err) throw err;
});
}
catch (err) {
console.log(chalk.red('업적을 저장하는데 실패했습니다.'));
console.error(err);
init_game.sleep(1000);
}
}
게임 데이터는 json으로 변환해서 저장했지만 업적은 단순한 방법을 쓰기로 했다.
json의 시초가 공식이 아니었다는걸 알게되었고 나만의 형식으로 저장하면 되지 라는 생각을 했다.
나는 업적만을 저장하고 또한 그것의 index만을 저장하기에 키:데이터 형식은 과하게 뭐가 많다고 생각했다.
그래서 내 저장 데이터는 다음과 같아졌다.
0, 2,
나는 단순한걸 선호한다. 그리고 이 데이터는 날 미소짓게 하는군.
이번 프로잭트에서 나는 콜백함수나 여러 저장방법에 초점을 두고 공부했다.
그 과정중에 객체와 클래스 관련해서 이해가 부족함을 알게 되었으며 방향을 잡을수 있게 되었다.