2503회 채점 중 로직 추가

This commit is contained in:
2025-04-11 14:51:29 +09:00
parent 2e1ef0fc8a
commit 0fd9c9e8c0
14 changed files with 40452 additions and 457 deletions

669
2502 CAT 2급 A형.json Normal file
View File

@@ -0,0 +1,669 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='들길')]",
"points": 1.7,
"desc": "배경 이름 변경"
},
"1-2": {
"type": "scene",
"ele": "$..objects[?(@.name=='하늘')]",
"points": 1.7,
"desc": "배경 이름 변경"
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='나무')]",
"points": 1.7,
"desc": "물체 이름 변경"
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='돌')]",
"points": 1.7,
"desc": "물체 이름 변경"
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='행인')]",
"points": 1.7,
"desc": "물체 이름 변경"
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='마라토너')]",
"points": 1.7,
"desc": "물체 이름 변경"
},
"2": {
"type": "script",
"ele": "$.objects[?(@.name=~'나무|나무(10)')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.6,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].type",
"points": 1.6,
"answer": "hide",
"desc": "숨기기"
},
{
"type": "list",
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.6,
"desc": "무한 반복"
},
{
"type": "list",
"ele": [
"$[0][2].statements[0][0].type",
"$[0][2].statements[0][0].params[0]"
],
"answer": [
"create_clone",
"self"
],
"points": 1.6,
"desc": "clone self"
},
{
"type": "list",
"ele": [
"$[0][2].statements[0][1].type",
"$[0][2].statements[0][1].params[0].type",
"$[0][2].statements[0][1].params[0].params[1].params[0]",
"$[0][2].statements[0][1].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"1",
"3"
],
"points": 1.6,
"desc": "wait random 1 betwwen 3 sec"
},
{
"ele": "$[1][0].type",
"points": 1.6,
"answer": "when_clone_start",
"desc": "cloen start"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"locate_xy",
"240",
"-20"
],
"points": 1.6,
"desc": "변수가 1보다 클때까지 반복"
},
{
"ele": "$[1][2].type",
"points": 1.6,
"answer": "show",
"desc": "show"
},
{
"type": "list",
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0].params[3]",
"$[1][3].params[0].params[1]",
"$[1][3].params[0].params[2].params[0]"
],
"answer": [
"repeat_while_true",
"x",
"LESS",
"-240"
],
"points": 1.6,
"desc": "while object x pos less then -240"
},
{
"type": "list",
"ele": [
"$[1][3].statements[0][0].type",
"$[1][3].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"-3"
],
"points": 1.6,
"desc": "move x pos -3"
},
{
"ele": "$[1][4].type",
"points": 1.6,
"answer": "delete_clone",
"desc": "delete clone"
}
]
},
"3": {
"type": "script",
"ele": "$.objects[?(@.name=~'돌|바위(1)')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.6,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "30",
"points": 1.6,
"desc": "크기 지정"
},
{
"ele": "$[0][2].type",
"points": 1.6,
"answer": "hide",
"desc": "숨기기"
},
{
"type": "list",
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.6,
"desc": "무한 반복"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0]"
],
"answer": [
"create_clone",
"self"
],
"points": 1.6,
"desc": "clone self"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0].type",
"$[0][3].statements[0][1].params[0].params[1].params[0]",
"$[0][3].statements[0][1].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"1.5",
"3"
],
"points": 1.6,
"desc": "wait random 1.5 betwwen 3 sec"
},
{
"ele": "$[1][0].type",
"points": 1.6,
"answer": "when_clone_start",
"desc": "cloen start"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"locate_xy",
"240",
"-105"
],
"points": 1.6,
"desc": "move location x:240, y:-105"
},
{
"ele": "$[1][2].type",
"points": 1.6,
"answer": "show",
"desc": "show"
},
{
"type": "list",
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0].params[3]",
"$[1][3].params[0].params[1]",
"$[1][3].params[0].params[2].params[0]"
],
"answer": [
"repeat_while_true",
"x",
"LESS",
"-240"
],
"points": 1.6,
"desc": "while object x pos less then -240"
},
{
"type": "list",
"ele": [
"$[1][3].statements[0][0].type",
"$[1][3].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"-3"
],
"points": 1.6,
"desc": "move x pos -3"
},
{
"ele": "$[1][4].type",
"points": 1.6,
"answer": "delete_clone",
"desc": "delete clone"
}
]
},
"4": {
"type": "script",
"ele": "$.objects[?(@.name=~'행인|가을 자전거를 타는 모습')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.6,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"type": "list",
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": [
"locate_xy",
"240",
"-30"
],
"points": 1.6,
"desc": "move location x:240, y:-30"
},
{
"type": "list",
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.6,
"desc": "무한 반복"
},
{
"type": "list",
"ele": [
"$[0][2].statements[0][0].type",
"$[0][2].statements[0][0].params[0].params[0]"
],
"answer": [
"move_direction",
"-1"
],
"points": 1.6,
"desc": "무한 반복"
}
]
},
"28": {
"type": "scene",
"ele": "$.messages[?(@.name=='넘어짐')]",
"points": 1.6,
"desc": "시그널 작성 여부"
},
"5": {
"type": "script",
"ele": "$.objects[?(@.name=~'마라토너|축구선수')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.6,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].type",
"points": 1.6,
"answer": "flip_y",
"desc": "y axis flip"
},
{
"type": "list",
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1].params[0]"
],
"answer": [
"locate_xy",
"-150",
"-70"
],
"points": 1.6,
"desc": "move location x:240, y:-30"
},
{
"type": "list",
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.6,
"desc": "무한 반복"
},
{
"ele": "$[0][3].statements[0][0].params[0]",
"points": 1.6,
"answer": "next",
"desc": "change to next shape check value"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0].params[0]"
],
"points": 1.6,
"answer": [
"wait_second",
"0.1"
],
"desc": "wait 0.1 second"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][2].type",
"$[0][3].statements[0][2].params[0].type",
"$[0][3].statements[0][2].params[0].params[0]"
],
"points": 1.6,
"answer": [
"_if",
"is_press_some_key",
"32"
],
"desc": "if press space key"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][2].statements[0][0].type",
"$[0][3].statements[0][2].statements[0][0].params[0].params[0]"
],
"points": 1.6,
"answer": [
"repeat_basic",
"20"
],
"desc": "while 20"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][2].statements[0][0].statements[0][0].type",
"$[0][3].statements[0][2].statements[0][0].statements[0][0].params[0].params[0]"
],
"points": 1.6,
"answer": [
"move_y",
"5"
],
"desc": "y pos move 5"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][2].statements[0][1].type",
"$[0][3].statements[0][2].statements[0][1].params[0].params[0]"
],
"points": 1.6,
"answer": [
"repeat_basic",
"20"
],
"desc": "while 20"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][2].statements[0][1].statements[0][0].type",
"$[0][3].statements[0][2].statements[0][1].statements[0][0].params[0].params[0]"
],
"points": 1.6,
"answer": [
"move_y",
"-5"
],
"desc": "y pos move -5"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][3].type",
"$[0][3].statements[0][3].params[0].type"
],
"points": 1.6,
"answer": [
"_if",
"reach_something"
],
"desc": "if reach object"
},
{
"ele": "$[0][3].statements[0][3].statements[0][0].type",
"points": 1.6,
"answer": "message_cast",
"desc": "신호 보내기"
},
{
"ele": "$[1][0].type",
"answer": "when_message_cast",
"points": 1.6,
"desc": "신호를 받았을 때"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0].type",
"$[1][1].params[0].params[0]"
],
"points": 1.6,
"answer": [
"rotate_relative",
"angle",
"40"
],
"desc": "rotate angle 40"
},
{
"type": "list",
"ele": [
"$[1][2].type",
"$[1][2].params[0].params[0]",
"$[1][2].params[1].params[0]",
"$[1][2].params[2].params[0]"
],
"points": 1.6,
"answer": [
"locate_xy_time",
"0.2",
"-140",
"-100"
],
"desc": "locate x: -140, y:-100 during 0.2 sec "
},
{
"type": "list",
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0]",
"$[1][3].params[1]"
],
"answer": [
"dialog",
"아야!",
"speak"
],
"points": 1.6,
"desc": "아야! speak"
},
{
"type": "list",
"ele": [
"$[1][4].type",
"$[1][4].params[0]"
],
"answer": [
"stop_object",
"otherThread"
],
"points": 1.6,
"desc": "object other code stop"
},
{
"type": "list",
"ele": [
"$[1][5].type",
"$[1][5].params[0].params[0]"
],
"points": 1.6,
"answer": [
"wait_second",
"1"
],
"desc": "wait 1 second"
},
{
"ele": "$[1][6].type",
"answer": "start_neighbor_scene",
"points": 1.6,
"desc": "next scene start"
}
]
},
"6": {
"type": "script",
"ele": "$.objects[?(@.name=~'하늘|날씨')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_scene_start",
"points": 1.6,
"desc": "scene start"
},
{
"type": "list",
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1]"
],
"answer": [
"dialog",
"아쉽지만 잘했어!",
"speak"
],
"points": 1.6,
"desc": "말하기"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 1.6,
"desc": "오브젝트 클릭 시"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"brightness",
"55"
],
"points": 1.6,
"desc": "add brightness 55 effect"
},
{
"type": "list",
"ele": [
"$[1][2].type",
"$[1][2].params[0].params[0]",
"$[1][2].params[1]"
],
"answer": [
"dialog",
"처음부터 다시 실행합니다.",
"speak"
],
"points": 1.6,
"desc": "말하기"
},
{
"type": "list",
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0]"
],
"points": 1.6,
"answer": [
"wait_second",
"2"
],
"desc": "wait 2 second"
},
{
"ele": "$[1][4].type",
"answer": "restart_project",
"points": 1.6,
"desc": "restart"
}
]
}
}

View File

@@ -0,0 +1,370 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='꽃밭')]",
"points": 2,
"desc": "배경 이름 변경"
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='당근')]",
"points": 2,
"desc": "물체 이름 변경"
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='하트')]",
"points": 2,
"desc": "물체 이름 변경"
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='토끼')]",
"points": 2,
"desc": "물체 이름 변경"
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='상자')]",
"points": 2,
"desc": "물체 이름 변경"
},
"2": {
"type": "script",
"ele": "$.objects[?(@.name=='당근')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.57,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"points": 2.57,
"answer": "45",
"desc": "크기 지정"
},
{
"ele": "$[0][2]['params']",
"points": 2.57,
"answer": [
"FORWARD",
null
],
"desc": "물체 앞으로 보내기"
},
{
"ele": "$[0][3].type",
"points": 2.57,
"answer": "hide",
"desc": "숨기기"
},
{
"ele": "$[0][4].params[0]",
"answer": null,
"points": 2.57,
"desc": "반복하기 (계속)"
},
{
"ele": "$[0][4].statements[0][?@.type=='locate_xy'].params[*].params",
"answer": [
"0",
"-100"
],
"points": 2.57,
"desc": "x:0, y:-100 으로 이동"
},
{
"ele": "$[0][4].statements[0][1].type",
"points": 2.57,
"answer": "show",
"desc": "모양보이기"
},
{
"ele": "$[0][4].statements[0][2].params[0].params[0]",
"answer": "32",
"points": 2.57,
"desc": "스페이스(32) 를 눌렀을 때"
},
{
"ele": "$[0][4].statements[0][2].statements[0][0].params[0].params[0]",
"answer": "0.2",
"points": 2.57,
"desc": "0.2초 기다리기"
},
{
"type": "list",
"ele": [
"$[0][4].statements[0][2].statements[0][1].params[0].params[0]",
"$[0][4].statements[0][2].statements[0][1].params[1]"
],
"answer": [
"0.5",
"mouse"
],
"points": 2.57,
"desc": "0.5초 동안 마우스 좌표 위치로 이동"
},
{
"type": "list",
"ele": [
"$[0][4].statements[0][3].type",
"$[0][4].statements[0][3].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 2.57,
"desc": "if reach something"
},
{
"ele": "$[0][4].statements[0][3].statements[0][0].params[*].params",
"answer": [
"냠냠!",
"0.5"
],
"points": 2.57,
"desc": "dialog_time 냠냠!을 0.5초"
},
{
"type": "list",
"ele": [
"$[0][4].statements[0][4].type",
"$[0][4].statements[0][4].params[0].type",
"$[0][4].statements[0][4].params[0].params[1]"
],
"answer": [
"_if",
"reach_something",
"wall"
],
"points": 2.57,
"desc": "if reach something wall"
},
{
"type": "list",
"ele": [
"$[0][4].statements[0][4].statements[0][0].type",
"$[0][4].statements[0][4].statements[0][0].params[0]"
],
"answer": [
"stop_object",
"all"
],
"points": 2.57,
"desc": "모든 오브젝트 정지"
}
]
},
"3": {
"type": "script",
"ele": "$.objects[?name=~'하트'].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.57,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "50",
"points": 2.57,
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[0]",
"answer": "FRONT",
"points": 2.57,
"desc": "맨 앞으로 보내기"
},
{
"ele": "$[0][3].params[0]",
"answer": null,
"points": 2.57,
"desc": "반복하기 (계속)"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0]"
],
"answer": [
"locate",
"mouse"
],
"points": 2.57,
"desc": "마우스 위치로 이동"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0]",
"$[0][3].statements[0][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"0.5"
],
"points": 2.57,
"desc": "Add Color effect 0.5 duration"
}
]
},
"4": {
"type": "script",
"ele": "$.objects[?(@.name=='토끼')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.57,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "90",
"points": 2.57,
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"0",
"60"
],
"points": 2.57,
"desc": "x:0, y:60 으로 이동"
},
{
"ele": "$[0][3].params[0]",
"answer": null,
"points": 2.57,
"desc": "계속 반복하기"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][0].params[0].params[0]",
"$[0][3].statements[0][0].params[1].params[*].params[0]",
"$[0][3].statements[0][0].params[2].params[0]"
],
"answer": [
"2",
"-200",
"200",
"60"
],
"points": 2.57,
"desc": "2초 동안 무작위로 x:-200~200, y:60"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 2.57,
"desc": "if reach something"
},
{
"ele": "$[0][3].statements[0][1].statements[0][0].params[0].params[0]",
"answer": "10",
"points": 2.57,
"desc": "크기 지정"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][1].statements[0][1].type",
"$[0][3].statements[0][1].statements[0][1].params[0].params[0].type",
"$[0][3].statements[0][1].statements[0][1].params[0].params[0].params[3]",
"$[0][3].statements[0][1].statements[0][1].params[0].params[1]",
"$[0][3].statements[0][1].statements[0][1].params[0].params[2].params[0]"
],
"answer": [
"_if",
"coordinate_object",
"size",
"EQUAL",
"120"
],
"points": 2.57,
"desc": "비교 오브젝트의 크기가 120과 같을 때"
},
{
"ele": "$[0][3].statements[0][1].statements[0][1].statements[0][0].params[*].params",
"answer": [
"미션 성공!",
"2"
],
"points": 2.57,
"desc": "dialog_time 미션 성공!을 2초"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][1].statements[0][1].statements[0][1].type",
"$[0][3].statements[0][1].statements[0][1].statements[0][1].params[0]"
],
"answer": [
"stop_object",
"all"
],
"points": 2.57,
"desc": "모든 오브젝트 정지"
}
]
},
"5": {
"type": "script",
"ele": "$.objects[?name=~'상자'].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.57,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0]",
"points": 2.57,
"answer": "FORWARD",
"desc": "물체 앞으로 보내기"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"0",
"-100"
],
"points": 2.57,
"desc": "x:0, y:-100 으로 이동"
},
{
"ele": "$[0][3].params[0].params[0]",
"points": 2.57,
"answer": "90",
"desc": "크기 지정"
},
{
"ele": "$[0][4].params[*].params",
"answer": [
"시작!",
"0.5"
],
"points": 2.57,
"desc": "dialog_time 시작!을 0.5초"
}
]
}
}

Binary file not shown.

382
2503 CAT 3급 A형.json Normal file
View File

@@ -0,0 +1,382 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='약도')]",
"points": 2,
"desc": "배경 이름 변경"
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='놀이동산')]",
"points": 2,
"desc": "물체 이름 변경"
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='백화점')]",
"points": 2,
"desc": "물체 이름 변경"
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='우리집')]",
"points": 2,
"desc": "물체 이름 변경"
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='어린이')]",
"points": 2,
"desc": "물체 이름 변경"
},
"2": {
"type": "script",
"ele": "$.objects[?(@.name=~'놀이동산')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"points": 2.43,
"answer": "90",
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"-25",
"60"
],
"points": 2.43,
"desc": "x:-25, y:60 으로 이동"
},
{
"ele": "$[1][0].params",
"points": 2.43,
"answer": [
null,
"49"
],
"desc": "키보드 눌렀을 때"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"30"
],
"points": 2.43,
"desc": "Add Color effect 30 duration"
},
{
"ele": "$[1][2].params[*].params",
"answer": [
"여기는 놀이동산!",
"1"
],
"points": 2.43,
"desc": "dialog_time 여기는 놀이동산 1초 "
},
{
"ele": "$[1][3].type",
"answer": "erase_all_effects",
"points": 2.43,
"desc": "효과 모두 삭제하기"
}
]
},
"3": {
"type": "script",
"ele": "$.objects[?(@.name=~'백화점|건물')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"points": 2.43,
"answer": "50",
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"180",
"50"
],
"points": 2.43,
"desc": "x:-25, y:60 으로 이동"
},
{
"ele": "$[1][0].params",
"points": 2.43,
"answer": [
null,
"50"
],
"desc": "키보드 눌렀을 때"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"40"
],
"points": 2.43,
"desc": "Add Color effect 30 duration"
},
{
"ele": "$[1][2].params[*].params",
"answer": [
"여기는 백화점!",
"1"
],
"points": 2.43,
"desc": "dialog_time 여기는 놀이동산 1초 "
},
{
"ele": "$[1][3].type",
"answer": "erase_all_effects",
"points": 2.43,
"desc": "효과 모두 삭제하기"
}
]
},
"4": {
"type": "script",
"ele": "$.objects[?(@.name=~'우리집|예쁜집')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"points": 2.43,
"answer": "60",
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"-190",
"-90"
],
"points": 2.43,
"desc": "x:-25, y:60 으로 이동"
},
{
"ele": "$[1][0].params",
"points": 2.43,
"answer": [
null,
"51"
],
"desc": "키보드 눌렀을 때"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"35"
],
"points": 2.43,
"desc": "Add Color effect 30 duration"
},
{
"ele": "$[1][2].type",
"answer": "erase_all_effects",
"points": 2.43,
"desc": "효과 모두 삭제하기"
}
]
},
"5": {
"type": "script",
"ele": "$.objects[?name=~'어린이'].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"points": 2.57,
"answer": "30",
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"-100",
"-100"
],
"points": 2.43,
"desc": "x:-25, y:60 으로 이동"
},
{
"ele": "$[0][3].params[*].params",
"answer": [
"야호! 출발!",
"1"
],
"points": 2.43,
"desc": "dialog_time 여기는 놀이동산 1초 "
},
{
"ele": "$[1][0].params",
"points": 2.43,
"answer": [
null,
"49"
],
"desc": "키보드 눌렀을 때"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0].params[0]"
],
"answer": [
"locate_object_time",
"2"
],
"points": 2.43,
"desc": "Locate Object 2 sec"
},
{
"ele": "$[1][2].type",
"points": 2.43,
"answer": "hide",
"desc": "숨기기"
},
{
"type": "list",
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0]"
],
"points": 2.43,
"answer": [
"wait_second",
"1"
],
"desc": "wait second"
},
{
"ele": "$[1][4].type",
"points": 2.43,
"answer": "show",
"desc": "보이기"
},
{
"ele": "$[2][0].params",
"points": 2.43,
"answer": [
null,
"50"
],
"desc": "키보드 눌렀을 때"
},
{
"type": "list",
"ele": [
"$[2][1].type",
"$[2][1].params[0].params[0]"
],
"answer": [
"locate_object_time",
"2"
],
"points": 2.43,
"desc": "Locate Object 2 sec"
},
{
"ele": "$[2][2].type",
"points": 2.43,
"answer": "hide",
"desc": "숨기기"
},
{
"type": "list",
"ele": [
"$[2][3].type",
"$[2][3].params[0].params[0]"
],
"points": 2.43,
"answer": [
"wait_second",
"1"
],
"desc": "wait second"
},
{
"ele": "$[2][4].type",
"points": 2.43,
"answer": "show",
"desc": "보이기"
},
{
"ele": "$[3][0].params",
"points": 2.43,
"answer": [
null,
"51"
],
"desc": "키보드 눌렀을 때"
},
{
"type": "list",
"ele": [
"$[3][1].type",
"$[3][1].params[0].params[0]"
],
"answer": [
"locate_object_time",
"2"
],
"points": 2.43,
"desc": "Locate Object 2 sec"
},
{
"ele": "$[3][2].params[*].params",
"answer": [
"다녀왔습니다!",
"1"
],
"points": 2.43,
"desc": "dialog_time 여기는 놀이동산 1초 "
}
]
}
}

1127
2503CAT3A.log Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,16 @@
# Entry 채점 프로그램
### main.py
scoring.json 기준표 작성
scoring.json 기준표 작성 (샘플 파일)
1. 채점용 답안 파일 복사 후 .ent 파일 .zip 으로 변경
2. 변경된 압축 파일 디렉토리 포함해서 압축 해제
> 채점 디렉토리 구조의 예
> 2502 CAT 3급 수시2/학생명/temp/project.json 채점
>
### copyFiles.py
특정 디렉토리의 .ent 파일을 타겟 디렉토리로 복사
복사 시 copy_ent_files 함수 확인

View File

@@ -42,8 +42,8 @@ def copy_ent_files(source_root, target_root):
print(f"Copied {source_file_path} to {target_file_path}")
# 사용법
source_directory = r"/Users/waterdrw/Downloads/제2502회 코딩활용능력 2수시4_답안파일" # 원본 디렉토리 경로
target_directory = r"./output/"
source_directory = r"/Users/waterdrw/Downloads/제2503회 코딩활용능력 3정기검정 답안파일" # 원본 디렉토리 경로
target_directory = r"./output/2503 CAT 3급 A형"
target_directory_a = r"./output/A" # '1교시'의 타겟 경로
target_directory_b = r"./output/B" # '2교시'의 타겟 경로
target_directory_c = r"./output/C" # '3교시'의 타겟 경로

79
main-김세연.log Normal file
View File

@@ -0,0 +1,79 @@
Processing: output/2502 CAT 2급 A형/cas-000549-김세연/temp/project.json
example: 1-1
Element '$..objects[?(@.name=='들길')]' not found
example: 1-2
Element '$..objects[?(@.name=='하늘')]' not found
example: 1-3
Element '$..objects[?(@.name=='나무')]' not found
example: 1-4
Element '$..objects[?(@.name=='돌')]' not found
example: 1-5
Element '$..objects[?(@.name=='행인')]' not found
example: 1-6
Element '$..objects[?(@.name=='마라토너')]' not found
example: 2
2-1: when_run_button_click == when_run_button_click
2-2: hide == hide
2-3: ['repeat_inf', 'None'] == ['repeat_inf', 'None']
2-4: ['create_clone', 'self'] == ['create_clone', 'self']
2-5: ['wait_second', 'calc_rand', '1', '3'] == ['wait_second', 'calc_rand', '1', '3']
2-6: when_clone_start == when_clone_start
2-7: ['locate_xy', '240', '-20'] == ['locate_xy', '240', '-20']
2-8: show == show
2-9: ['repeat_while_true', 'x', 'LESS', '-240'] == ['repeat_while_true', 'x', 'LESS', '-240']
2-10: ['move_x', '-3'] == ['move_x', '-3']
2-11: delete_clone == delete_clone
example: 3
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
example: 4
4-1: when_run_button_click == when_run_button_click
4-2: ['locate_xy', '240', '-30'] == ['locate_xy', '240', '-30']
4-3: ['repeat_inf', 'None'] == ['repeat_inf', 'None']
4-4: ['move_direction', '-1'] == ['move_direction', '-1']
example: 28
elements found for $.messages[?(@.name=='넘어짐')]
$.messages[?(@.name=='넘어짐')] found
example: 5
5-1: when_run_button_click == when_run_button_click
5-2: flip_y == flip_y
5-3: ['locate_xy', '-150', '-70'] == ['locate_xy', '-150', '-70']
5-4: ['repeat_inf', 'None'] == ['repeat_inf', 'None']
5-5: next == next
5-6: ['wait_second', '0.1'] == ['wait_second', '0.1']
5-7: ['_if', 'is_press_some_key', '32'] == ['_if', 'is_press_some_key', '32']
5-8: ['repeat_basic', '20'] == ['repeat_basic', '20']
5-9: ['move_y', '5'] == ['move_y', '5']
5-10: ['repeat_basic', '20'] == ['repeat_basic', '20']
5-11: ['move_y', '-5'] == ['move_y', '-5']
5-12: ['_if', 'reach_something'] == ['_if', 'reach_something']
5-13: message_cast == message_cast
5-14: when_message_cast == when_message_cast
5-15: ['rotate_relative', 'angle', '40'] == ['rotate_relative', 'angle', '40']
5-16: ['locate_xy_time', '0.2', '-140', '-100'] == ['locate_xy_time', '0.2', '-140', '-100']
5-17: ['dialog', '아야!', 'speak'] == ['dialog', '아야!', 'speak']
5-18: ['stop_object', 'otherThread'] == ['stop_object', 'otherThread']
5-19: ['wait_second', '1'] == ['wait_second', '1']
5-20: start_neighbor_scene == start_neighbor_scene
example: 6
6-1: when_scene_start == when_scene_start
6-2: ['dialog', '아쉽지만 잘했어!', 'speak'] == ['dialog', '아쉽지만 잘했어!', 'speak']
6-3: when_object_click == when_object_click
6-4: ['add_effect_amount', 'brightness', '55'] == ['add_effect_amount', 'brightness', '55']
6-5: ['dialog', '처음부터 다시 실행합니다.', 'speak'] == ['dialog', '처음부터 다시 실행합니다.', 'speak']
6-6: ['wait_second', '2'] == ['wait_second', '2']
6-7: restart_project == restart_project
Total Points for ['cas-000549-김세연', 0, 0, 0, 0, 0, 0, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 68.80000000000001]
Results saved to output/2502 CAT 2급 A형/cas-000549-김세연/results.xlsx

36943
main.log Normal file

File diff suppressed because it is too large Load Diff

210
main.py
View File

@@ -1,10 +1,14 @@
from jsonpath_ng.ext import parse
import json
from itertools import chain
import os
import pandas as pd # 추가된 import
import unicodedata # 상단에 import 추가
import re # 상단에 추가
# 파일 경로 설정
project_json_path = './sample/제2502회 코딩활용능력 2급 B형 정답/project.json'
scoring_json_path = './scoring.json'
project_json_path = 'output/2503 CAT 3급 A형'
scoring_json_path = './2503 CAT 3급 A형.json'
# JSON 파일 읽기
def read_json(file_path):
@@ -36,21 +40,101 @@ def find_list_element(data, jsonpath_expr_list):
return result
# 스크립트 채점 진행 전 스크립트 블럭 순서가 when_run_button_click 1번째, when_clone_start 2번째 배열에 없으면
# 리스트 순서 스왑해서 각각 0, 1번 순서로 배치될 수 있도록 함
# when_scene_start 1번째, when_message_cast 2번째 동일한 순서로 리스트 순서 스왑해서 정렬
def swap_script(origin):
"""스크립트 블록 순서 정렬 함수"""
if not origin or len(origin) == 0:
return origin
# 스크립트 블록 분류를 위한 임시 저장소
run_button_block = None
key_press_blocks = []
clone_start_block = None
message_cast_block = None
other_blocks = []
# 각 블록을 타입별로 분류
for i, block in enumerate(origin):
if not block or len(block) == 0:
continue
# main 함수
def main():
project_data = read_json(project_json_path)
scoring_data = read_json(scoring_json_path)
block_type = block[0].get("type")
# 기존 로직: run_button과 scene_start 처리
if (block_type == "when_run_button_click" or block_type == "when_scene_start") and i > 0:
print(f"swap script run button or scene start")
swap = origin[0]
origin[0] = origin[i]
origin[i] = swap
# 기존 로직: clone_start와 message_cast 처리
elif (block_type == "when_clone_start" or block_type == "when_message_cast") and i > 0:
print(f"swap script clone start or msg cast")
swap = origin[1]
origin[1] = origin[i]
origin[i] = swap
# 새로운 로직: 키 이벤트 처리
if block_type == "when_run_button_click":
run_button_block = block
elif block_type == "when_some_key_pressed":
# params[1]에서 키 값 확인 (49, 50, 51) 아스키코드 값이므로 필요하면 추가 가능
key_value = block[0].get("params")[1]
if key_value in ["49", "50", "51"]:
key_press_blocks.append((key_value, block))
elif block_type == "when_clone_start":
clone_start_block = block
elif block_type == "when_message_cast":
message_cast_block = block
else:
other_blocks.append(block)
# 결과 배열 재구성
result = []
# 1. when_run_button_click 블록을 첫 번째로 추가
if run_button_block:
result.append(run_button_block)
# 2. when_some_key_pressed 블록들을 키 값 순서대로 정렬하여 추가
key_press_blocks.sort(key=lambda x: int(x[0]) if x[0] else 0)
result.extend([block for _, block in key_press_blocks])
# 3. clone_start와 message_cast 블록 추가
if clone_start_block:
result.append(clone_start_block)
if message_cast_block:
result.append(message_cast_block)
# 4. 나머지 블록 추가
result.extend(other_blocks)
# 결과가 비어있으면 원본 반환
return result if result else origin
def clean_string(text):
"""문자열 끝의 . 또는 ! 제거"""
if isinstance(text, str):
# 문자열 끝의 . 또는 ! 제거
return re.sub(r'', '', text.strip())
return text
def convert_to_str(value):
"""값을 문자열로 변환"""
if isinstance(value, (list, tuple)):
return [convert_to_str(v) for v in value]
return str(value)
def process_project(project_data, scoring_data):
total_points = 0
points = []
for key, value in scoring_data.items():
ele = value.get('ele')
type = value.get('type')
blocks = value.get('blocks')
# 정답
answer = value.get('answer')
print(f"example: {key}")
@@ -58,15 +142,22 @@ def main():
exists = find_element(project_data, ele)
if exists:
print(f"elements found for {ele}")
# scene type의 경우 문자열 변환
exists = [convert_to_str(x) for x in exists]
if exists == answer:
total_points += value.get('points')
points.append(value.get('points'))
elif exists and answer == None:
total_points += value.get('points')
points.append(value.get('points'))
print(f"{ele} found ");
else :
else:
points.append(0)
print(f"{exists} not found");
else:
print(f"Element '{ele}' exists in project.json: {exists}")
print(f"Element '{ele}' not found")
points.append(0)
if type == "script":
exists = find_script_element(project_data, ele)
@@ -75,49 +166,118 @@ def main():
temp = None
else:
temp = json.loads(exists)
temp = swap_script(temp)
innerKey= 1;
innerKey = 1
for block in blocks:
innerType = block.get('type')
if temp == None:
print(f"{key}-{innerKey}: Script Not exist")
innerKey = innerKey + 1
points.append("확인 필요")
continue
if innerType == "list":
elif innerType == "list":
block_exists = find_list_element(temp, block.get('ele'))
else:
block_exists = find_element(temp, block.get('ele'))
# 정답
answer = block.get('answer', None)
if isinstance(answer, list):
flat_matches = list(chain.from_iterable(block_exists))
if block_exists and isinstance(answer, list):
# 리스트의 모든 요소를 문자열로 변환
flat_matches = [convert_to_str(x) for x in list(chain.from_iterable(block_exists))]
else:
flat_matches = block_exists[0]
if not block_exists:
flat_matches = None
else:
# 단일 값을 문자열로 변환
flat_matches = convert_to_str(block_exists[0])
# 블록에 따라 params 값이나 statements 값이 있는 경우 처리 추가 필요
if block_exists:
if answer is not None and answer != flat_matches:
print(f"{key}-{innerKey}: {answer} != {flat_matches}")
elif answer is not None and answer == flat_matches:
print(f"{key}-{innerKey}: {answer} == {flat_matches}")
# answer도 문자열로 변환하여 비교
str_answer = convert_to_str(answer) if answer is not None else None
if answer is not None and str_answer != flat_matches:
print(f"{key}-{innerKey}: {str_answer} != {flat_matches}")
points.append(0)
elif answer is not None and str_answer == flat_matches:
print(f"{key}-{innerKey}: {str_answer} == {flat_matches}")
total_points += block.get('points')
points.append(block.get('points'))
elif answer is None and block_exists:
total_points += block.get('points')
points.append(block.get('points'))
print(f"{key}-{innerKey}: exist ele: {block_exists}")
else:
print(f"No elements found for {block.get('ele')}")
points.append(0)
innerKey = innerKey + 1
print(f"Total Points: {total_points}")
points.append(total_points)
return points
def normalize_path(path):
"""한글 경로명을 NFC 방식으로 정규화"""
return unicodedata.normalize('NFC', path)
def main():
scoring_data = read_json(scoring_json_path)
student_score_list = []
# 컬럼명 생성
columns = ['학생명']
idx = 1
for key in scoring_data.keys():
if scoring_data[key].get('type') == 'scene':
columns.append(f'{idx}')
idx = idx + 1
elif scoring_data[key].get('type') == 'script':
for i in range(len(scoring_data[key].get('blocks', []))):
columns.append(f'{idx}')
idx = idx + 1
columns.append('총점')
# os.walk 결과를 리스트로 변환하고 정렬
walk_results = []
for root, dirs, files in os.walk(project_json_path):
# 디렉토리명 정규화
normalized_root = normalize_path(root)
normalized_dirs = [normalize_path(d) for d in dirs]
normalized_files = [normalize_path(f) for f in files]
normalized_dirs.sort() # 정규화된 디렉토리 정렬
walk_results.append((normalized_root, normalized_dirs, normalized_files))
# 정렬된 결과를 바탕으로 처리
for root, dirs, files in sorted(walk_results):
for file in sorted(files): # 파일도 정렬
if file == 'project.json':
full_path = os.path.join(root, file)
print(f"\nProcessing: {full_path}")
try:
# 디렉토리 패스 내에 학생 이름만 뽑아서 엑셀 컬럼 명으로 추가
# output/cas-000040-이지원/temp/project.json
student_id = normalize_path(full_path.split('/')[2])
project_data = read_json(full_path)
points = process_project(project_data, scoring_data)
points.insert(0, student_id)
student_score_list.append(points)
print(f"Total Points for {points}")
except Exception as e:
print(f"Error processing {full_path}: {str(e)}")
continue
# DataFrame 생성 및 엑셀 저장
df = pd.DataFrame(student_score_list, columns=columns).transpose()
df.columns = df.iloc[0]
df = df[1:]
excel_path = project_json_path + '/' + 'results.xlsx'
df.to_excel(excel_path, index=False)
print(f"\nResults saved to {excel_path}")
if __name__ == "__main__":
main()

BIN
results.xlsx Normal file

Binary file not shown.

View File

@@ -1,29 +1,39 @@
{
"1-1": {
"type": "scene",
"ele": "$.scenes[0].name",
"answer": "꽃밭",
"points": 1.77,
"desc": "장면 1 이름 변경"
"ele": "$..objects[?(@.name=='꽃밭')]",
"points": 1.7,
"desc": "배경 이름 변경"
},
"1-2": {
"type": "scene",
"ele": "$.scenes[1].name",
"answer": "숲속",
"points": 1.77,
"desc": "장면 2 이름 변경"
"ele": "$..objects[?(@.name=='숲속')]",
"points": 1.7,
"desc": "배경 이름 변경"
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='당근')]",
"points": 1.77,
"desc": "장면 2 이름 변경"
"points": 1.7,
"desc": "물체 이름 변경"
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='하트')]",
"points": 1.77,
"desc": "장면 2 이름 변경"
"points": 1.7,
"desc": "물체 이름 변경"
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='토끼')]",
"points": 1.7,
"desc": "물체 이름 변경"
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='상자')]",
"points": 1.7,
"desc": "물체 이름 변경"
},
"2-1": {
"type": "scene",
@@ -89,7 +99,7 @@
"1"
],
"points": 1.77,
"desc": "x:0, y:-100 으로 이동"
"desc": "변수가 1보다 클때까지 반복"
},
{
"ele": "$[0][3].statements[0][?@.type=='locate_xy'].params[*].params",
@@ -169,18 +179,13 @@
"ele": "$[0][5].type",
"answer": "hide",
"points": 1.77,
"desc": "신호 보내기"
"desc": "숨기기"
}
]
},
"3": {
"type": "script",
"ele": "$.objects[?(@.name=='하트')].script",
"blocks": []
},
"5": {
"type": "script",
"ele": "$.objects[?(@.name=='상자')].script",
"ele": "$.objects[?name=~'하트'].script",
"blocks": [
{
"ele": "$[0][0].type",
@@ -189,7 +194,171 @@
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[*][?(@.type=='change_object_index')].params[0]",
"ele": "$[0][1].params[0].params[0]",
"answer": "50",
"points": 1.77,
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[0]",
"answer": "FRONT",
"points": 1.77,
"desc": "맨 앞으로 보내기"
},
{
"ele": "$[0][3].params[0]",
"answer": null,
"points": 1.77,
"desc": "반복하기 (계속)"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0]"
],
"answer": [
"locate",
"mouse"
],
"points": 1.77,
"desc": "마우스 위치로 이동"
},
{
"ele": "$[1][0].type",
"answer": "when_message_cast",
"points": 1.77,
"desc": "신호를 받았을 때"
},
{
"ele": "$[1][1].type",
"answer": "hide",
"points": 1.77,
"desc": "숨기기"
}
]
},
"4": {
"type": "script",
"ele": "$.objects[?(@.name=='토끼')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.77,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "90",
"points": 1.77,
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"0",
"60"
],
"points": 1.77,
"desc": "x:0, y:60 으로 이동"
},
{
"type": "list",
"ele": [
"$[0][3].params[0].params[?(@.type=='get_variable')].type",
"$[0][3].params[0].params[?(@=='LESS')]",
"$[0][3].params[0].params[?(@.type=='text')].params[0]"
],
"answer": [
"get_variable",
"LESS",
"1"
],
"points": 1.77,
"desc": "변수가 1보다 클때까지 반복"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][*].params[0].params[0]",
"$[0][3].statements[0][*].params[1].params[*].params[0]",
"$[0][3].statements[0][*].params[2].params[0]"
],
"answer": [
"2",
"-200",
"200",
"60"
],
"points": 1.77,
"desc": "2초 동안 무작위로 x:-200~200, y:60"
},
{
"ele": "$[1][0].type",
"answer": "when_message_cast",
"points": 1.77,
"desc": "신호를 받았을 때"
},
{
"ele": "$[1][1].params[*].params[0]",
"answer": [
"2",
"0",
"0"
],
"points": 1.77,
"desc": "2초 동안 x:0, y:0 좌표 이동"
},
{
"ele": "$[1][2].params[0].params[0]",
"answer": "50",
"points": 1.77,
"desc": "크기 지정"
},
{
"type": "list",
"ele": [
"$[1][3].params[0].params[0].type",
"$[1][3].params[0].params[1]",
"$[1][3].params[0].params[2].params[0]",
"$[1][3].params[1].params[0]"
],
"answer": [
"get_variable",
"PLUS",
"점 입니다.",
"3"
],
"points": 1.77,
"desc": "변수 + 점 입니다. 3초 동안 말하기"
},
{
"ele": "$[1][4].params[0].params[0]",
"answer": "0.5",
"points": 1.77,
"desc": "0.5초 기다리기"
},
{
"ele": "$[1][5].type",
"answer": "start_scene",
"points": 1.77,
"desc": "장면 전환"
}
]
},
"5": {
"type": "script",
"ele": "$.objects[?name=~'상자'].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.77,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[*][1].params[0]",
"points": 1.77,
"answer": "FORWARD",
"desc": "물체 앞으로 보내기"
@@ -231,5 +400,77 @@
"desc": "숨기기"
}
]
},
"6": {
"type": "script",
"ele": "$.objects[?(@.name=='숲속')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_scene_start",
"points": 1.77,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].type",
"answer": "hide_variable",
"points": 1.77,
"desc": "변수 숨기기"
},
{
"ele": "$[0][2].type",
"answer": "hide_variable",
"points": 1.77,
"desc": "변수 숨기기"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 2,
"desc": "오브젝트 클릭 시"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"change_effect_amount",
"color",
"50"
],
"points": 2,
"desc": "색깔 효과를 50으로 변경"
},
{
"type": "list",
"ele": [
"$[1][2].type",
"$[1][2].params[0].params[0]",
"$[1][2].params[1]"
],
"answer": [
"dialog",
"처음부터 다시 실행합니다.",
"speak"
],
"points": 2,
"desc": "처음부터 다시 실행합니다. 를 말하기"
},
{
"ele": "$[1][3].params[0].params[0]",
"answer": "2",
"points": 2,
"desc": "2초 기다리기"
},
{
"ele": "$[1][4].type",
"answer": "restart_project",
"points": 2,
"desc": "처음부터 다시 시작하기"
}
]
}
}

View File

@@ -1,9 +1,9 @@
[
[
{
"id": "om8f",
"id": "vlyg",
"x": 50,
"y": 70,
"y": 30,
"type": "when_run_button_click",
"params": [
null
@@ -18,18 +18,18 @@
"extensions": []
},
{
"id": "y31p",
"id": "wqvc",
"x": 0,
"y": 0,
"type": "set_scale_size",
"params": [
{
"id": "vohi",
"id": "7qfb",
"x": 0,
"y": 0,
"type": "number",
"params": [
"45"
"30"
],
"statements": [],
"movable": null,
@@ -52,71 +52,35 @@
"extensions": []
},
{
"id": "ybwv",
"id": "kmdb",
"x": 0,
"y": 0,
"type": "change_object_index",
"params": [
"FORWARD",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "g6zh",
"x": 0,
"y": 0,
"type": "repeat_while_true",
"type": "locate_xy",
"params": [
{
"id": "t4xt",
"id": "yry5",
"x": 0,
"y": 0,
"type": "boolean_basic_operator",
"type": "number",
"params": [
{
"id": "fe87",
"x": 0,
"y": 0,
"type": "get_variable",
"params": [
"ofvf",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"LESS",
{
"id": "7eqj",
"x": 0,
"y": 0,
"type": "text",
"params": [
"1"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
"-100"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "g3wu",
"x": 0,
"y": 0,
"type": "number",
"params": [
"-100"
],
"statements": [],
"movable": null,
@@ -127,347 +91,6 @@
"assemble": true,
"extensions": []
},
"until",
null
],
"statements": [
[
{
"id": "6dad",
"x": 0,
"y": 0,
"type": "locate_xy",
"params": [
{
"id": "bj58",
"x": 0,
"y": 0,
"type": "number",
"params": [
"0"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "oeup",
"x": 0,
"y": 0,
"type": "number",
"params": [
"-120"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "bdne",
"x": 0,
"y": 0,
"type": "_if",
"params": [
{
"id": "kzo7",
"x": 0,
"y": 0,
"type": "is_press_some_key",
"params": [
"32",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [
[
{
"id": "skya",
"x": 0,
"y": 0,
"type": "wait_second",
"params": [
{
"id": "lw8x",
"x": 0,
"y": 0,
"type": "number",
"params": [
"0.2"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "cwhq",
"x": 0,
"y": 0,
"type": "change_variable",
"params": [
"ofvf",
{
"id": "zzzs",
"x": 0,
"y": 0,
"type": "text",
"params": [
"-1"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "fi2n",
"x": 0,
"y": 0,
"type": "locate_object_time",
"params": [
{
"id": "kwih",
"x": 0,
"y": 0,
"type": "number",
"params": [
"0.5"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"mouse",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
]
],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "w10m",
"x": 0,
"y": 0,
"type": "_if",
"params": [
{
"id": "3mja",
"x": 0,
"y": 0,
"type": "reach_something",
"params": [
null,
"1dcp",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [
[
{
"id": "1o2h",
"x": 0,
"y": 0,
"type": "change_variable",
"params": [
"cyzm",
{
"id": "v14q",
"x": 0,
"y": 0,
"type": "text",
"params": [
"10"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "f6lo",
"x": 0,
"y": 0,
"type": "dialog_time",
"params": [
{
"id": "sydb",
"x": 0,
"y": 0,
"type": "text",
"params": [
"성공!"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "qxvc",
"x": 0,
"y": 0,
"type": "number",
"params": [
"0.5"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"speak",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
]
],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
]
],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "b4zg",
"x": 0,
"y": 0,
"type": "message_cast",
"params": [
"4tjs",
null
],
"statements": [],
@@ -480,7 +103,114 @@
"extensions": []
},
{
"id": "937f",
"id": "wh5n",
"x": 0,
"y": 0,
"type": "dialog_time",
"params": [
{
"id": "cga0",
"x": 0,
"y": 0,
"type": "text",
"params": [
"야호! 출발!"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "gihc",
"x": 0,
"y": 0,
"type": "number",
"params": [
"1"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"speak",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
],
[
{
"id": "mfln",
"x": 50,
"y": 168,
"type": "when_some_key_pressed",
"params": [
null,
"49"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "t3ej",
"x": 0,
"y": 0,
"type": "locate_object_time",
"params": [
{
"id": "th0s",
"x": 0,
"y": 0,
"type": "number",
"params": [
"2"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"meq4",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "zakv",
"x": 0,
"y": 0,
"type": "hide",
@@ -495,6 +225,287 @@
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "f98n",
"x": 0,
"y": 0,
"type": "wait_second",
"params": [
{
"id": "urh6",
"x": 0,
"y": 0,
"type": "number",
"params": [
"1"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "p4yn",
"x": 0,
"y": 0,
"type": "show",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
],
[
{
"id": "hlnb",
"x": 50,
"y": 444,
"type": "when_some_key_pressed",
"params": [
null,
"50"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "smqv",
"x": 0,
"y": 0,
"type": "locate_object_time",
"params": [
{
"id": "941e",
"x": 0,
"y": 0,
"type": "number",
"params": [
"2"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"6kvc",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "f8ez",
"x": 0,
"y": 0,
"type": "hide",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "6ln4",
"x": 0,
"y": 0,
"type": "wait_second",
"params": [
{
"id": "eihx",
"x": 0,
"y": 0,
"type": "number",
"params": [
"1"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "mism",
"x": 0,
"y": 0,
"type": "show",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
]
[
{
"id": "edyx",
"x": 50,
"y": 334,
"type": "when_some_key_pressed",
"params": [
null,
"51"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "vjkb",
"x": 0,
"y": 0,
"type": "locate_object_time",
"params": [
{
"id": "jwnn",
"x": 0,
"y": 0,
"type": "number",
"params": [
"2"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"9200",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "brfk",
"x": 0,
"y": 0,
"type": "dialog_time",
"params": [
{
"id": "nun7",
"x": 0,
"y": 0,
"type": "text",
"params": [
"다녀왔습니다!"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "sriu",
"x": 0,
"y": 0,
"type": "number",
"params": [
"1"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"speak",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
]
]

1
temp.csv Normal file
View File

@@ -0,0 +1 @@
'cas-000039-정승혁', 0, 0, 1.77, 1.77, 0, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 0, 0, 0, 0, 0, 0, 0, 1.77, 1.77, 0, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 58.41000000000004
1 'cas-000039-정승혁' 0 0 1.77 1.77 0 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 0 0 0 0 0 0 0 1.77 1.77 0 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 58.41000000000004