728x90
반응형

안녕하세요, 

 

이번주도 본쉘스크립트로 간단한 예제를 각자 짜보는 연습을 하였습니다. 

 

이번주 예제 : 오크와의 전투
조건 : 플레이어는 1/2 중 임의의 숫자를 전투가 끝날 때까지 계속 입력 (1:공격/2:방어)
1:공격 - 오크에게 5 ~ 10의 피해를 입힌다.
2:방어 - 다음 오크의 공격 데미지를 받지 않는다.
오크는 플레이어가 한번 입력한 이후에 한번씩 공격을 해서 플레이어에게 1 ~ 10의 피해를 입힌다.
오크와 플레이어의 체력은 100이다.

추가 과제 
  - 3:특수스킬을 추가한다 (효과 : 추가로 공격을 한번 더한다, 단 게임 중 한번만 사용 가능)
예시 :

 

 


GAME START!

[ Player HP : 100 / Orc : 100 ]
Select (1-3) : 
1
Player Attack! 
Orc damaged  -5
Orc Attack! 
Player damaged -10
[ Player HP : 90 / Orc : 95 ]
Select (1-3) : 
2
Player Defence!
Orc Attack!
Player damaged -0
[ Player HP : 90 / Orc : 95 ]
Select (1-3) : 
3
Player Attack!
Orc damaged -7
Player Attack!
Orc damaget -10
Orc Attack!
Player damaged -8
[ Player HP : 82 / Orc : 78 ]
...
...
...
[ Player HP : 10 / Orc : 0 ]
<< Player Win >>

 

 

스터디원 분들이 위 예시를 기반으로 해서 각자 자신이 원하는 스타일로 수정/추가를 해서 스크립트를 작성해 주셨습니다.

그리고 스터디원이 아닌 분들도 관심 있으신 분들은 자신이 짠 스크립트를 댓글 등으로 올려주시면 좋을 것 같습니다. ^^

 

- ID : able2

#!/bin/sh

 

orc_p=100

pl_p=100

sld=0

spc=3

cond=0

 

while [ $cond -eq 0 ]

do

echo "-----------------------"

echo " 1: Attack"

echo " 2: Defence"

echo " 3: SPC Attack($spc/3)"

echo " ENTER(1~3): "

read num

 

orc_dmg=`rand -M 9`

orc_dmg=`expr $orc_dmg + 1`

if [ $sld -eq 0 ]

then 

pl_p=`expr $pl_p - $orc_dmg`

fi

 

case "$num" in

1) echo " 1: Player Attack! "

pl_dmg=`rand -M 5`

pl_dmg=`expr $dmg + 5`

orc_p=`expr $orc_p - $pl_dmg`

sld=0

;;

2) echo " 2: Player Defence! "

sld=1

;;

3) echo " 3: SPC Attack! "

if [ $spc -gt 0 ]

then

echo "OK!"

orc_p=`expr $orc_p - 10`

spc=`expr $spc - 1`

else

echo "NOK"

pl_p=`expr $pl_p + $orc_dmg`

fi

sld=0

;;

*) echo " - Wrong number - "

sld=0

;;

esac

 

echo "[Player HP: $pl_p /ORC: $orc_p]"

if [ $pl_p -lt 1 ]

then 

cond=1

echo "<<Orc Win>>"

elif [ $orc_p -lt 1 ]

then

cond=1

echo "<<Player Win>>"

fi

done 


 

- ID : able7

 #!/bin/sh

 

# 상수 정의

ATTACK=1

DEFENCE=2

PLAYER_CRITICAL_PERCENT=30

ORC_BERSERKER_PERCENT=20

 

# 변수 정의

player_hp=100

orc_hp=100

orc_berserker_mode=0

 

echo ">> 오크 소굴 <<"

 

while [ $player_hp -gt 0 -a $orc_hp -gt 0 ]

do

echo "[ 플레이어 체력:$player_hp / 오크 체력:$orc_hp]"

echo "액션을 입력하세요(1:공격/2:방어):" 

 

read player_action

if [ $player_action -eq $ATTACK ]

then

# 플레이어의 공격 데미지 범위 1 ~ 10

player_attack_damage=`rand -M 10`

player_attack_damage=`expr $player_attack_damage + 1`

 

# 플레이어의 공격 크리티컬 판정 시 공격 데미지 2배  

player_critical_percent=`rand -M 100`

if [ $player_critical_percent -gt $PLAYER_CRITICAL_PERCENT ]

then

player_attack_damage=`expr $player_attack_damage \* 2`

echo "플레이어가 오크를 난도질 하였습니다."

else

echo "플레이어가 오크를 칼로 베었습니다."

fi

orc_hp=`expr $orc_hp - $player_attack_damage`

echo "오크가 $player_attack_damage 의 데미지를 입었습니다."

 

# 오크의 공격 데미지 범위 5 ~ 10

orc_attack_damage=`rand -M 6`

orc_attack_damage=`expr $orc_attack_damage + 5`

if [ $orc_berserker_mode -eq 1 ]

then

orc_berserker_mode=0

orc_attack_damage=`expr $orc_attack_damage \* 3`

fi

 

echo "오크가 플레이어를 몽둥이로 후려 쳤습니다."

player_hp=`expr $player_hp - $orc_attack_damage`

echo "플레이어가 $orc_attack_damage 의 데미지를 입었습니다."

 

# 오크의 버서커 상태 진입 판정 

orc_berserker_percent=`rand -M 100`

if [ $orc_berserker_percent -gt $ORC_BERSERKER_PERCENT ]

then

orc_berserker_mode=1

echo "오크가 버서커 상태가 되었습니다.(다음번 공격데미지 3배)"

fi

elif [ $player_action -eq $DEFENCE ]

then

orc_berserker_mode=0

echo "플레이어가 오크의 공격을 방어 하였습니다."

else

echo "잘못 입력 하셨습니다. 1 - 2 사이의 숫자를 입력하세요!"

fi

 

echo ""

done

 

if [ $player_hp -lt 1 ]

then

echo "<<오크 승리>>"

elif [ $orc_hp -lt 1 ]

then

echo "<<플레이어 승리>>"

fi 

 

- ID : able5

#!/bin/sh

 

event_nego() {

echo " 오크와의 협상 이벤트가 발생하였습니다."

echo " 오크를 살려주시겠습니까?  살려주고 싶으시면 (1), 싸움을 진행하시려면 (2) 를 선택해주세요 "

read nego_choice

case $nego_choice in

1)

echo " 참 착하네요~ 오크가 선물로 현자의 검을 건네줍니다 "

;;

2)

echo " 협상결렬 : 오크가 화가 나서 체력이 증가합니다 "

ORC_HEALTH_PLUS=`rand -M 20`

;;

esac

ORC_HEALTH=`expr $ORC_HEALTH + $ORC_HEALTH_PLUS`

}

 

PC_HEALTH=100

ORC_HEALTH=100

CRITICAL_NU=0

MISS_NU=0

 

echo " "

echo " THIS IS THE ORC DESTROY GAME "

echo " START "

 

while [ $PC_HEALTH -ge 0 -a $ORC_HEALTH -ge 0 ]

do

echo " YOUR TURN : "

read choice

ORCACT=`rand -M 2`

if [ $choice -eq 1 ]

then

if [ $ORCACT -eq 0 ]

then

attackdamage=`rand -M 10`

criticaldamage=`rand -M 5`

missdamage=`rand -M 5`

if [ $criticaldamage -eq 3 ]

then

if [ $missdamage -eq 2 ]

then

ORC_DAMAGE=$attackdamage

else

echo " CRITICAL"

CRITICAL_NU=`expr $CRITICAL_NU + 1`

ORC_DAMAGE=`expr $attackdamage \* 2`

fi

elif [ $criticaldamage -eq 1 ]

then

if [ $missdamage -eq 1 ]

then

echo " 오크와의 협상 이벤트가 발생하였습니다."

echo " 오크를 살려주시겠습니까?  살려주고 싶으시면 (1), 싸움을 진행하시려면 (2) 를 선택해주세요 "

read nego_choice

case $nego_choice in

1)

echo " 참 착하네요~ 오크가 선물로 현자의 검을 건네줍니다 "

echo " 행복하게 사세요~~~ "

exit

;;

2)

echo " 협상결렬 : 오크가 화가 나서 체력이 증가합니다 "

echo " ORC : 취익 화가 난다~~  취익~ "

ORC_HEALTH_PLUS=`rand -M 20`

;;

esac

ORC_HEALTH=`expr $ORC_HEALTH + $ORC_HEALTH_PLUS`

else

ORC_DAMAGE=$attackdamage

fi

else

if [ $missdamage -eq 2 ]

then

echo " MISS "

MISS_NU=`expr $MISS_NU + 1`

# event_nego

ORC_DAMAGE=0

else

ORC_DAMAGE=$attackdamage

fi

fi

else

ORC_DAMAGE=`expr $attackdamage + 3`

fi

PC_DAMAGE=`rand -M 7`

else

ORC_DAMAGE=`rand -M 5`

PC_DAMAGE=`rand -M 3`

fi

 

PC_HEALTH=`expr $PC_HEALTH - $PC_DAMAGE`

ORC_HEALTH=`expr $ORC_HEALTH - $ORC_DAMAGE`

echo " AD : $attackdamage , CT : $criticaldamage , MISS : $missdamage , ORCACT : $ORCACT , OD : $ORC_DAMAGE , PD : $PC_DAMAGE "

 

if [ $ORC_HEALTH -le 0 ]

then

echo " PC = $PC_HEALTH : ORC = 0 "

elif [ $PC_HEALTH -le 0 ]

then

echo " PC = 0 : ORC = $ORC_HEALTH "

else

echo " PC = $PC_HEALTH : ORC = $ORC_HEALTH "

fi

done

 

if [ $PC_HEALTH -ge 0 ]

then

echo " YOU WIN "

echo " CRITICAL 횟수 : $CRITICAL_NU , MISS 횟수 : $MISS_NU "

else

echo " YOU LOSE "

echo " CRITICAL 횟수 : $CRITICAL_NU , MISS 횟수 : $MISS_NU "

fi

 

 

 

저희 스터디의 향후 일정은 대략 다음과 같습니다.

- 배시쉘스크립트 로직 작성 연습

- 파이썬 로직 작성 연습 (미정, 필요하신 분에 한해..)

- 정규 표현식

- find/grep/awk

- 개인별 Mini 프로젝트

 

지금까지는 본쉘스크립트 기반으로 스크립트 로직을 작성하는 연습을 하였습니다. 

사실 어떤 스크립트나 프로그래밍 언어를 사용하든 중요한 점은 어떤 문제가 주어졌을 때 문제를 정확히 파악하고 그것을 해결하기 위해 필요한 로직을 작성할 수 있느냐 일 것 같습니다. 하나의 언어로 프로그램을 작성하는데 익숙해진다면 다른 언어를 사용한다고 해도 해당 언어의 문법만 익히면 같은 기능을 수행하는 로직을 작성하는데 큰 무리가 없습니다.

따라서 처음에 간단한 본쉘스크립트를 기반으로 로직 짜는 연습을 하였고, 이후에 해당 로직을 배시쉘 기반으로 변환하는 연습을 한다면 비교적 쉽게 배시쉘 문법을 익힐 수 있을 것 같습니다. 그 이후에 파이썬도 마찬가지고요.

 

본쉘은 문법적 요소가 제약적이라 이후의 진행을 하기 전에 다른 스크립트(배시쉘이나 파이썬)를 먼저 학습할 예정입니다. 

스크립트 로직 짜는데 충분히 익숙해진 이후에는 각자 자신이 원하는 스크립트를 사용하여 리눅스 명령어를 활용한 실제 실무에서 

사용될 수 있는 예제들 위주로 공부하면 될 것 같습니다. 여기서 많은 예제들을 작성하다보면 그러한 것들이 쌓여서

실제 현업에서 바로 활용할 수 있는 좋은 레퍼런스의 역활을 수행할 수 있을 거라고 기대합니다.

 

그럼 다음주에는 기본적인 배시쉘 문법을 먼저 정리하고, 기존에 본쉘로 작성했던 예제들을 배시쉘 기반으로 변환하는 작업을 하도록 하겠습니다.

 

감사합니다.

 

 

ps. 저희 스터디를 반오픈? 방식으로 운영하려고 합니다. 관심 있으신 분들은 스터디 내용이 올라올 때마다 학습한 사항을 같이 댓글 등으로 올려 주시면 될 것 같습니다. 그리고 스터디 시 학습한 내용에 대한 질문이 있거나 추가 내용 공유 하고 싶은신게 있다면 그러한 것들도 함께 올려주세요~ ^^

 

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,