## 해당 TIL은 주어진 과제를 수행하면서 얻은 학습 내용과, 시행착오 등등을 종합해서 작성한것임
1. FileModel 분리
game 안에 여러 기능들이 추가됨에 따라, 너무 코드가 길어진 듯한 느낌이 들어서, 기존에 game에서 파일 읽기,쓰기를 담당했던 부분을 FileModel을 만들어 따로 기능하게 만들기로 함. 그에 알맞게 작동하도록, 코드를 수정
## 추가
파일을 읽어올때 형식에 맞는 데이터만 있다는 것을 가정해서 읽어들이고 있는 코드들인지라..
만약 파일 내부에, 형식에 맞지 않는 형태로 데이터가 있을 경우에는 오류가 발생할 수 있다는 점이 약간 불안요소.
< 기존 코드 >
// game.dart 안에서 처리하던 코드
Future<void> readChar(File f) async {
var charfile = f;
try {
Stream<String> lines =
charfile.openRead().transform(utf8.decoder).transform(LineSplitter());
await for (var line in lines) {
var linelist = line.split(',').toList();
user.hp = int.parse(linelist[0]);
user.atk = int.parse(linelist[1]);
user.dfs = int.parse(linelist[2]);
}
} catch (e) {
print('캐릭터 파일을 읽는 도중 오류가 발생했습니다. $e');
print('게임을 정상 진행 할 수 없으므로, 프로그램을 종료합니다.');
exit(0);
}
}
< 개선 코드 >
// FileModel.dart 내부 클래스 메서드
Future<Character> readChar() async {
var charfile = characterf;
int hp = 0;
int atk = 0;
int dfs = 0;
try {
Stream<String> lines =
charfile.openRead().transform(utf8.decoder).transform(LineSplitter());
await for (var line in lines) {
var linelist = line.split(',').toList();
hp = int.parse(linelist[0]);
atk = int.parse(linelist[1]);
dfs = int.parse(linelist[2]);
}
return Character(hp, atk, dfs);
} catch (e) {
print('캐릭터 파일을 읽는 도중 오류가 발생했습니다. $e');
print('게임을 정상 진행 할 수 없으므로, 프로그램을 종료합니다.');
exit(0);
}
}
2. 캐릭터 버프 처리 수정
초기 버전에는 버프가 아이템 사용했을때 밖에 사용되지 않았는데, 자유 기능을 추가함에 따라, 버프 특성에 공격력버프, 방어력버프, 체력 증감 등등의 요소와 버프 지속시간 등등이 도입되었고, 전체적으로 버프기능을 대폭 수정 및 추가 하였다.
Buff 모델을 만들고, 버프 시작시 효과적용, 턴이 지날때마다 버프 지속시간 감소, 지속시간이 끝나면 버프해제 등등의 기능을 추가하였다.
< 기존 코드 >
class Character {
late int atk;
late int dfs;
bool item = true;
bool buff = false;
// ...
void useitem() {
if (item) {
print('아이템을 사용했습니다! 이번턴동안 공격력이 2배가 됩니다.\n');
item = false;
atk *= 2;
buff = true;
} else {
print('소지한 아이템이 없습니다.\n');
}
}
}
< 개선 코드 >
class Character {
late String name;
late int hp;
late int atk;
late int dfs;
bool item = true;
List<Buff> buffs = [];
// ...
void useitem() {
Buff itembuff = Buff(true, 0, atk, 0, 1);
if (item) {
print('아이템을 사용했습니다! 이번턴동안 현재 공격력이 2배가 됩니다.\n');
buffs.add(itembuff);
effectBuff(itembuff);
item = false;
} else {
print('소지한 아이템이 없습니다.\n');
}
}
3. 버프 지속시간 감소 타이밍 수정 및 User가 확인 가능하도록 개선
캐릭터에 버프 개념이 생김에 따라, 버프 효과 적용시 언제부터 효과가 적용되는지, 언제 효과가 사라지는지에 대한 타이밍 설정이 필요해졌다. 또한, 현재 캐릭터에 걸린 버프/디버프 효과가 무엇인지 사용자에게 인지할 수 있게끔 하는 선택지를 추가하였다.
< 추가 코드 >
// 버프 지속시간이 줄어드는 타이밍은?
// 턴이 끝난 직후(endturn) 또는 전투가 끝난 후(몬스터를 공격하여 처치했을 때)
if (turn != BattleTurn.endturn) {
user.decreseBuff();
}
4. 버프에 의한 스탯 변화에 대한 대응
버프가 적용되었을때, 스탯이 증가했을때는 상관이 없는데, 스탯 감소 라던가 체력이 까이는 일이 발생했을 경우 대응이 필요해 졌다. 이때, 실제 스탯은 '-' 값으로 두되, 실제로 스탯이 사용될 경우 (공격, 데미지 받을때 등등) 0 값으로 인지 되도록 하여 대응하였다. 실제 스탯이 '-' 값이 되는걸 그대로 둔 이유는, 직관적일 뿐더러 버프 지속시간이 끝날경우 스탯을 되돌릴때 보다 쉽기 때문에 이런 방식을 선택했다. 추가로 이벤트에 의해 체력이 0 이하가 되었을 경우엔, 전투에 들어가지 않게 함으로써 대응했다.
< 기존 코드 >
void attackMonster(Monster monster) {
print('${name}이(가) ${monster.name}에게 ${atk}의 데미지를 입혔습니다.');
monster.hp -= atk;
}
< 개선 코드 >
void attackMonster(Monster monster) {
int realatk = atk;
if (atk < 0) realatk = 0;
print('${name}이(가) ${monster.name}에게 ${realatk}의 데미지를 입혔습니다.');
monster.hp -= realatk;
}
5. 선택지에서 한글 입력시 오류 발생하던 문제 해결
선택지 에서 입력 받을시 한글이 입력되면 오류가 발생하던 문제 해결.
사실, 맥에서나 다른 환경에서는 한글이 입력되도 정상 작동하는 반면, Window에서 한글이 입력될때, Window의 문제였던, 한글이 UTF8로 읽히지 않는 문제가 발생하여 오류가 발생한것 같다. 차피 선택지에서는 한글이 입력될 일이 없기 때문에, 해당 오류가 발생하면 입력이 잘못되었다는 처리가 되도록 한꺼번에 처리해주었다.
< 기존 코드 >
bool isSaveResult() {
String? input;
bool loop = true;
while (loop) {
stdout.write('\n결과를 저장하시겠습니까? (y/n) : ');
input = stdin.readLineSync(encoding: utf8);
switch (input) {
case 'y':
return true;
case 'n':
return false;
default:
print('y/n 둘중 하나만 입력해주세요.');
break;
}
}
}
< 개선 코드 >
bool isSaveResult() {
String? input;
bool loop = true;
while (loop) {
stdout.write('\n결과를 저장하시겠습니까? (y/n) : ');
try {
input = stdin.readLineSync(encoding: utf8);
switch (input) {
case 'y':
return true;
case 'n':
return false;
default:
print('y/n 둘중 하나만 입력해주세요.');
break;
}
} catch (e) {
print('y/n 둘중 하나만 입력해주세요.');
}
}
}
## 추가
생각해 보니, 캐릭터 이름을 입력받을때 한글을 사용할 수도 있는데, 이때 Window에서 생기는 오류가 발생하면 문제가 생길거 같아서 이부분도 처리해주었다.
( Windows의 한글 UTF8 문제 때문에, 한글을 입력했음에도 불구하고 Null 값이 들어오거나 이상하게 입력되거나 하는 모습..)
'TIL' 카테고리의 다른 글
TIL - 기차 예매 서비스 (2) <테마 나누기 및 테마 변경법> (0) | 2024.11.13 |
---|---|
TIL - 기차 예매 서비스 (1) <Getx 종속성관리> (0) | 2024.11.13 |
TIL - 전투 RPG게임 (코드 개선) (0) | 2024.11.05 |
TIL - 전투 RPG 게임(Random함수, 파일입출력, 정규표현식) (0) | 2024.11.04 |
TIL - 콘솔 쇼핑몰 (24.10.31) (0) | 2024.10.31 |