퍼즐게임

2020. 8. 18. 15:16·PROJECT/MINI
728x90
반응형

두번째 미션 퍼즐 움직이기

 

시작 버튼을 누르면 

 onClick = "start( )" 을 실행하겠다

 

start 가 하는 일은 for 문 두 개가 일을한다.

 

  • 첫번 째 for 문은
    • 0부터 16까지 반복문을 돌리면서 Math 함수를 사용해서 난수를 생성한다 => sunsu[a] 번째에 저장한다
  • 두번 째 for 문은
    • 0 부터 a 까지 반복문을 돌리면서 중복 체크를 진행한다.
    • 즉,  방금 전 a에 대입한 숫자가 b에 대입 되어있니?
  • 그리고 mix() 함수를 호출한다

  • 배열에 있는 이미지 파일의 경로를 대입을 해주는구나

 

 

그럼 이제 내가 해야 할 것은 move 와 bingo 함수 채우기.

 

move가 하는 일은 퍼즐을 움직이는 거겠지

 

move 를 호출 할 때 i를 보내는거 같은데 i가 뭘까 싶어서 찍어보자

이미지 파일 경로를 보내는건 아니네 

 

이게 Array 의 숫자를 뜻하는거 같기도하다..

 

30분쯤 고민했는데 이 방법은 어떨까

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

다른 방법을 생각해보자.

임시로 다른 배열을 만들어서 다 복사하는거지

if 를 걸어서 blink 일때랑 k 번째 일때는 continue 해주고

 

미리 temp 로 blink 랑 k 를 바꾸고?

 

어허이 하다가 이 방법은 어떨까 싶었는데

에라이 움직이지도 않아

js 문자열 비교 함수가 틀릴 수도, 

 

 

아니네 비교 잘 되네 헛다리 꿀잼

 

엥 이방법도 어쩌면 잘 되겠다.. 싶었는데 

이 고냥이가 날 그냥 애잔하게 쳐다본다 ㅋㅋㅋ 아냐 난 괜찮아 그렇게 쳐다보지마

오 이렇게 바꿨더니

 

움직이기 시작했다...

 

한단계는 올라온 듯 이제 루틴을 찾자!

 

절대값

abs(-4) => 4

abs(-1) => 1

 

헛다리 제대로 짚은 나! ㅋㅋㅋㅋㅋ

태웅 코드 보고서는 아,, 이렇게 하는거구나,,,

 

응 ~ 완성본!  해석해보자*^^*

<HTML>
	<HEAD>
	
	<script type="text/javascript">
		//var  flag=false;
	   var sunsu = new Array( );
	   var temp = 1;
	   var temp2 = 1;
	   var tempimg;
	   var cnt = 0;
	   var imgsource1 = new Array("1.gif", "2.gif", "3.gif",
					   "4.gif", "5.gif","6.gif", "7.gif",
					   "8.gif", "9.gif", "10.gif", "11.gif",
					   "12.gif", "13.gif", "14.gif", "15.gif","blink.gif");
	   var imgsource2 = new Array("1.gif", "2.gif", "3.gif",
					   "4.gif", "5.gif","6.gif", "7.gif",
					   "8.gif", "9.gif", "10.gif", "11.gif",
					   "12.gif", "13.gif", "14.gif", "15.gif","blink.gif");
	   var blink = 0;
	
	   function start( ) { //시작버튼클릭시 호출되는 함수
		   for(a=0; a<imgsource1.length ; a++){
				 sunsu[a] = Math.round(Math.random()*15); //난수 
			  for(b=0 ; b<a ; b++){
			   if( sunsu[a] ==  sunsu[b]) {  a--;  } //중복체크 
			   }// for b end 
			} //for a end
		  mix( );  //그림섞기
	   }//start end
	
	   function  mix( ){
		  for(i=0; i<16; i++) {
			 document.images[i].src = imgsource1[sunsu[i]];
			 if (sunsu[i]==15) blink = i;
		  } 
	   }// mix end
	
	   function movea(k){
		  document.images[k].src     = imgsource2[sunsu[blink]];
		  document.images[blink].src = imgsource2[sunsu[k]];      
		  
		  tempimg                  = imgsource2[sunsu[k]];
		  imgsource2[sunsu[k]]     = imgsource2[sunsu[blink]];
		  imgsource2[sunsu[blink]] = tempimg;
	
		  tempk = blink;
		  blink = k;
		  k     = tempk;
	   }
	
	   function move(k){
		  if(blink%4==3){
			 if(k==(blink-1)||k==(blink-4)||k==(blink+4))
				movea(k);
		  }else if(blink%4==0){
			 if(k==(blink+1)||k==(blink+4)||k==(blink-4))
				movea(k);
		  }else if(k==(blink+1)||k==(blink-1)||k==(blink+4)||k==(blink-4))
				movea(k);
	   }
	
	   function bingo( ){
		  if(imgsource1==imgsource2){
			 alert('성공'); 
		  }
	   }// bingo end
	</script>
	</head>
	
	<body>
	<font  size=7  color=green> <b> 퍼즐게임 </b></font><br>
	<form>
	   <input id="btn_name" type = "button" value = "시 작" onClick = "start( )"
		  style="font-size:24pt; font-style:bold; " > <p>
	</form>
	
	<script type="text/javascript">
	   imgsource = new Array("1.gif", "2.gif", "3.gif", "4.gif",
						"5.gif", "6.gif", "7.gif", "8.gif",
						  "9.gif", "10.gif", "11.gif", "12.gif",
					   "13.gif", "14.gif", "15.gif", "16.gif") ;
	
	   for (i =0 ; i<imgsource.length ; i++){
		 document.write("<img src=" + imgsource[i] +
					  " border = 1 onClick = 'move(" + i + ")'>") ;
		 if (((i+1)%4)==0) document.write("<br>") ;
	   }
	</script>
	
	</body>
	</html>
	

 

[ 해 석 ]

 

	   function move(k){
		  if(blink%4==3){
			 if(k==(blink-1)||k==(blink-4)||k==(blink+4))
				movea(k);
		  }else if(blink%4==0){
			 if(k==(blink+1)||k==(blink+4)||k==(blink-4))
				movea(k);
		  }else if(k==(blink+1)||k==(blink-1)||k==(blink+4)||k==(blink-4))
				movea(k);
	   }
	

move 를 단 두 줄에 끝낼려고 했던 나,,,,

내가 생각했던 것보다 더 많은 변화가 필요하구나

 

일단 이 체크하는 방식은

파랑을 기준으로 상하좌우만 이벤트가 발생해야해 그러기 때문에 이렇게 체크를 해주는건데

파랑은 blank 니까

 

blank 랑 좌우는 abs(1) 씩 차이나고

blank 랑 상하는 abs(4) 씩 차이나고

 

아니 태웅,, 태웅꺼 보기는 했는데 나는 절대값을 이용해 봐야겠다 

 

오예! 성공 코드가 훨씬 짧아졌다 얄루

	   function move(k){

		  var num = Math.abs(blink-(k))
		  
		  if(num==4 || num==1){
			movea(k);
		  }
	   }

이 코드로 그러면 이제 사용자가 누른 값이 bkank 랑 절대값으로 1하고 4 씩 차이가난다면 성공

 

	   function movea(k){
		  document.images[k].src     = imgsource2[sunsu[blink]];
		  document.images[blink].src = imgsource2[sunsu[k]];      
		  
		  tempimg                  = imgsource2[sunsu[k]];
		  imgsource2[sunsu[k]]     = imgsource2[sunsu[blink]];
		  imgsource2[sunsu[blink]] = tempimg;
	
		  tempk = blink;
		  blink = k;
		  k     = tempk;
	   }

 

이 두 코드는 내가 생각한 대로지만

document.images[k].src     = imgsource2[sunsu[blink]];

document.images[blink].src = imgsource2[sunsu[k]];      

 

실제로 배열도 손을 봐주고 이동 시키기

tempimg                  = imgsource2[sunsu[k]];

imgsource2[sunsu[k]]     = imgsource2[sunsu[blink]];

imgsource2[sunsu[blink]] = tempimg;

 

나는 문자열을 비교해서 blink.gif 를 찾으려고 했는데 태웅은 애초에  blink.gif의 위치를 설정해주고

이렇게 moves 에서 바꿔주는 구나

tempk = blink;

blink = k;

k     = tempk;

 

난 태웅이 만든 movea() 를 삭제하고 합체 시켜야지

코드가 간결해서 마음에 든당

	   function move(k){

		  var num = Math.abs(blink-(k))

		  if(num==4 || num==1){

			 document.images[k].src     = imgsource2[sunsu[blink]];
		 	 document.images[blink].src = imgsource2[sunsu[k]];      
		  
			 tempimg                  = imgsource2[sunsu[k]];
		 	 imgsource2[sunsu[k]]     = imgsource2[sunsu[blink]];
		 	 imgsource2[sunsu[blink]] = tempimg;

		 	 blink = k;
		  }
	   }

 

자, 그러면 move 에서 하는일을 진짜 제대로 차근이 짚어보자.

 

사용자가 누른 위치 값을  k 매개변수로 받자

여기서 제일 먼저 할 일은 blink 값에서 k 값을 뻰다.

 

사용자가 상하좌우에 있는 칸을 클릭했다면 ( 6, 9, 11, 14 )

이렇게 되어있겠지?

 

10 - 6   = 4

10 - 9   = 1

10 - 11  = -1

10 - 14  = -4

 

 

 

 

 

 

Math.abs(num) 을 이용해서 애를 절대값으로 바꾸고

(num==4 || num==1) 이 조건을 확인하자.

 

 

 

 

 

 

 

 

 

참이라면 이제 교체 작업을 실행해 줘야 하는데,

 

document.images[k].src     = imgsource2[sunsu[blink]];

사용자가 누른 값에는 blink 값을 넣어주고.

 

document.images[blink].src = imgsource2[sunsu[k]];

blink 값에는 사용자가 누른 값을 넣어주지.

 

 

그리고 temping 을 이용해서 두 값을 교체 해주자

tempimg                       = imgsource2[sunsu[k]];

imgsource2[sunsu[k]]      = imgsource2[sunsu[blink]];

imgsource2[sunsu[blink]] = tempimg;

 

blink 의 값과 k 의 값도 다시 바꿔줘야 하니까 바꿔주자

blink = k;

 

 

[ 최 종 완 성 본 ]

<HTML>
	<HEAD>
	
	<script type="text/javascript">
		//var  flag=false;
	   var sunsu = new Array( );
	   var temp = 1;
	   var temp2 = 1;
	   var tempimg;
	   var cnt = 0;
	   var imgsource1 = new Array("1.gif", "2.gif", "3.gif",
					   "4.gif", "5.gif","6.gif", "7.gif",
					   "8.gif", "9.gif", "10.gif", "11.gif",
					   "12.gif", "13.gif", "14.gif", "15.gif","blink.gif");
	   var imgsource2 = new Array("1.gif", "2.gif", "3.gif",
					   "4.gif", "5.gif","6.gif", "7.gif",
					   "8.gif", "9.gif", "10.gif", "11.gif",
					   "12.gif", "13.gif", "14.gif", "15.gif","blink.gif");
	   var blink = 0;
	
	   function start( ) { //시작버튼클릭시 호출되는 함수
		   for(a=0; a<imgsource1.length ; a++){
				 sunsu[a] = Math.round(Math.random()*15); //난수 
			  for(b=0 ; b<a ; b++){
			   if( sunsu[a] ==  sunsu[b]) {  a--;  } //중복체크 
			   }// for b end 
			} //for a end
		  mix( );  //그림섞기
	   }//start end
	
	   function  mix( ){
		  for(i=0; i<16; i++) {
			 document.images[i].src = imgsource1[sunsu[i]];
			 if (sunsu[i]==15) blink = i;
		  } 
	   }// mix end
	
	
	   function move(k){

		  var num = Math.abs(blink-(k))

		  if(num==4 || num==1){

			 document.images[k].src     = imgsource2[sunsu[blink]];
		 	 document.images[blink].src = imgsource2[sunsu[k]];      
		  
			 tempimg                  = imgsource2[sunsu[k]];
		 	 imgsource2[sunsu[k]]     = imgsource2[sunsu[blink]];
		 	 imgsource2[sunsu[blink]] = tempimg;
	
		 	 blink = k;

		  }
	   }
	
	   function bingo( ){
		  if(imgsource1==imgsource2){
			 alert('성공'); 
		  }
	   }// bingo end
	</script>
	</head>
	
	<body>
	<font  size=7  color=green> <b> 퍼즐게임 </b></font><br>
	<form>
	   <input id="btn_name" type = "button" value = "시 작" onClick = "start( )"
		  style="font-size:24pt; font-style:bold; " > <p>
	</form>
	
	<script type="text/javascript">
	   imgsource = new Array("1.gif", "2.gif", "3.gif", "4.gif",
						"5.gif", "6.gif", "7.gif", "8.gif",
						  "9.gif", "10.gif", "11.gif", "12.gif",
					   "13.gif", "14.gif", "15.gif", "16.gif") ;
	
	   for (i =0 ; i<imgsource.length ; i++){
		 document.write("<img src=" + imgsource[i] +
					  " border = 1 onClick = 'move(" + i + ")'>") ;
		 if (((i+1)%4)==0) document.write("<br>") ;
	   }
	</script>
	
	</body>
	</html>
	

 

장장 4시간 만에 마무리 짓다 🥳🥳🥳🥳

 

 

 

728x90
반응형

'PROJECT > MINI' 카테고리의 다른 글

반반 피자 만들기  (0) 2020.08.18
'PROJECT/MINI' 카테고리의 다른 글
  • 반반 피자 만들기
Binsoo
Binsoo
내 트러블 슈팅
  • Binsoo
    정수빈 기술블로그임.
    Binsoo
  • 전체
    오늘
    어제
    • 빈수 개발자 개발 일기 (938)
      • 개발중 (635)
        • Spring Boot (95)
        • Spring Security (2)
        • Spring Batch (6)
        • Spring Boot & Redis (13)
        • Java Persistence API (JPA) (28)
        • Web (42)
        • Rest Api (7)
        • Spring Concurrency Control (3)
        • Redis (8)
        • Kubernetes (k8s) (4)
        • MYSQL (35)
        • AirFlow (15)
        • Docker (2)
        • Git (22)
        • Linux (9)
        • JSON Web Tokens (JWT) (4)
        • Troubleshooting (88)
        • Swagger (0)
        • Vue.js (52)
        • Java (74)
        • html (12)
        • C (5)
        • jQuery (15)
        • JavaServer Pages (JSP) (17)
        • Arduino (1)
        • JavaScript (35)
        • Amazon Web Services (AWS) (11)
        • Algorithm (9)
        • 참고 기능 (18)
        • mongo (2)
      • PROJECT (27)
        • 스프링부트+JPA+몽고 API 개발 (3)
        • MINI (2)
        • 게시판 (3)
        • vue 프로젝트 (1)
        • JPA 사이드 프로젝트 기록 (17)
      • TEAM STUDY (156)
        • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (8)
        • 한 권으로 읽는 컴퓨터 구조와 프로그래밍 (12)
        • NAVER DEVELOPER (4)
        • LINUX (23)
        • PYTHON (19)
        • SERVER (8)
        • 알고리즘 코딩 테스트 스터디 (31)
        • 쿠버네티스 (40)
        • 대세는 쿠버네티스 [초급~중급] (11)
      • BOOK (0)
      • 자격증 (61)
        • 리눅스 1급 - 필기 기록 (19)
        • 네트워크 관리사 (2)
        • 네트워크 관리사 2급 - 실기 기록 (21)
        • 네트워크 관리사 2급 - 필기 기록 (16)
        • 정보처리 (2)
      • 직장인 대학원 (17)
        • 기록 (1)
        • 캐글 스터디 (3)
        • R (12)
      • 논문 (5)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    네트워크 관리사 학점
    리눅스 마스터 요약
    쿠버네티스
    네트워크 관리사 요약
    REST API
    쿠버네티스 스터디
    리눅스 1급 요약
    알고리즘
    리눅스 마스터 1급 요약
    git
    Git 저장소
    네트워크 관리사 자격증
    파이썬
    redis
    BackendDevelopment
    springboot
    리눅스 마스터
    리눅스 마스터 1급
    VUE
    파이썬 알고리즘
    Spring
    네트워크 관리사 2급 실기
    jpa
    리눅스 마스터 1급 정리
    스프링
    네트워크 관리사 실기
    java
    네트워크 관리사
    네트워크 관리사 2급
    docker
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
퍼즐게임
상단으로

티스토리툴바