본문 바로가기

프로그램/앱인벤터

[문제풀이]앱인벤터2 - "08. 대통령 알아맞히기" 확장하기 P165

앱인벤터2 문제풀이 - 165페이지 "대통령 알아맞히기" 확장하기



1. 현재 앱은 문제마다 그림만 보여준다. 짧은 소리나 동영상도 같이 보여주도록 확장한다.




  디자이너탭에서 ActivityStater, Sound를 추가하여 아래와 같은 형태로 만들고, ActivityStarter의 Action속성에 "android.intent.action.VIEW" 를 추가한다.

Oksound.m4aXsound.m4a




  블록탭에서 아래 그림처럼, initialize global YoutubeList to make a list "유투브주소1", "유투브주소2", "유투브주소3", "유투브주소4"를 자료화면으로 순서대로 삽입하고, HINT(자료화면버튼)는 when HINT.Click do를 꺼내어 set ActivityStarter1.DataUri to select list item list get global YoutubeList, index get global currentQuestionIndex1을, 그리고 call ActivityStarter1.StartActivity를 추가 삽입한다. 그리고, 기존에 있던 when NextButton1.Click do의 맨 밑에 추가블럭으로 set ActivityStarter1.DataUri to select list item list index에 순서대로 get global YoutubeListglobal currentQuestionIndex1을 삽입한다. 




  그리고, 아래 그림처럼 기존에 있던, when AnswerButton1.Click do버튼 이벤트에 추가로 정답일  경우 set Sound1.Source to "Oksound.m4a", call Sound1.Play와 오답일 경우 set Sound1.Source to "Xsound.m4a", call Sound1.Play로 마무리한다. 




2. 현재 앱은 사용자 응답이 정답과 정확히 일치해야 맞은 것으로 간주한다. 이는 융통성이 전혀 없는 방식이다. Text 서랍에 있는 텍스트 처리용 블록을 활용하면 이를 여러 가지로 개선할 수 있다. 예를 들어 대소문자 구분을 없애려면, 사용자 입력과 AnswerList에 있는 정답을 upcase 블록을 이용하여 대문자로 변환한 후 비교하면 된다. 사용자 입력이 정답의 일부로 포함되어 있으면 맞는 것으로 간주할 수도 있다. 그럴 때는 text.contains 블록을 사용하면 된다. 문제마다 여러 개의 정답을 마련해 두고, for each 블록을 이용하여 그중 하나만 일치하면 맞는 것으로 판단할 수도 있다. 



  블록탭에서 기존에 있던 initialize global AnswerList1 to make a list 의 text "루즈벨트"를 "루즈(space/띄어쓰기) 루즈벨트(space/띄어쓰기) roosChurch(space/띄어쓰기) roos(space/띄어쓰기) 루즈 벨트"로 교체 해준다. 왜냐하면 text서랍에 contains 블록은 여러가지 답변을 띄어쓰기를 하여 입력하면 "루즈 벨트" or "루즈" or "roos" 등등 융통성있는 여러종류의 답변을 받는데 사용 할 수 있다. 

따라서 위와 같이 답변을 추가해두고, 비교문이 들어가는 부분 when AsnwerButton1.Click do ifcontains text(미리 저장된 답변리스트)piece(사용자가 입력한문자)get global AnswerList1, AnswerText1.Text를 입력하면 경우에 따른 융통성있는 답변을 얻을 수 있다. 




3. 주관식 문제를 객관식으로 바꾸어 보자. 이제 문제마다 여러 개의 정답후보가 필요하다. 따라서 정답을 담는 리스트는 컴포넌트가 중첩된 구조를 가져야 한다. 정답을 고르는 기능은 ListPicker를 사용하면 된다. 리스트에 대한 보다 자세한 내용은 19장을 참조한다. 




  디자이너탭에서 ListPicker를 추가하여 "객관식보기"로 아래와 같이 설정한다. 



블록탭에서 intialize global Answerchoices1을 만들고 make a list 에 중첩리스트 make a list를 만들어 아래와 같이 4가지 경우의 객관식을 만들어둔다. 

 intialize global Answerchoices1 to make a list 

make a list "루즈벨트", "카터", "닉슨", "트루먼"

make a list "루즈벨트""카터""닉슨""트루먼"

make a list "루즈벨트""카터""닉슨""트루먼"

make a list "루즈벨트""카터""닉슨""트루먼"

그런 다음 when ListPicker1.BeforePicking do set ListPicker1.Elements to select list item listindexget global Answerchoices1과 get global currentQuestionIndex1을 추가한다. 


그리고, when ListPicker1.AfterPicking do if then else를 꺼내어 if에 ListPicker1.Selection = select list item list index get global AnswerList1get global currentQuestionIndex1을 추가하고, then에 set RightWrongLabel1.Text to "맞았습니다."와 set Sound1.Source to "Oksound.m4a"call Sound1.Playelse set RightWrongLabel1.Text to "틀렸습니다."set Sound1.Source to "Xsound.m4a", call Sound1.Play로 마무리한다.









<출처 :  David Wolber, Hal Abelson, Ellen Spertus, Liz Looney(2015), 

앱인벤터2(초판)(오일석, 이진선 번역, 서울:한빛아카데미. (원서는 2014년에 출판)>