U E D R , A S I H C RSS

빵페이지/숫자야구

1. 문제 정의


난수생성 참고자료 : RandomFunction , WindowsConsoleControl

DeleteMe 내용이 중복되어서 문제정의와 참고자료 부분을 지웠습니다. 위키라는 지식 풀속에 중복되는 지식은 링크로 충분하겠지요. 아래의 문제들 역시 ~cpp 숫자야구/유주영 식으로 하는 편이 차후 접근성 측면에서 더 좋을것 같습니다.--NeoCoin


  • 아악~ 아직 마방진도 못했는데 어려운게 또 -_ㅜ - 승균
    • 해보면 알겠지만 결고 어렵지 않아 - 민수
  • 이거 4자리 수로 만든거 있는데 올려도 되나요?? 소스는 지X같지만 ;; - 정욱
  • 아 그리고 rand() 만 쓰면 똑같은 숫자만 된다고.. 뭐 다른것도 해야 되던데요.. - 정욱
    • ctime 를 include 하고 srane(time(0)); 을 선언해주면 바뀔걸~ - 민수


2. 유주영

~cpp 
#include <iostream>
#include <stdlib.h> 
#include <time.h> 
using namespace std;
 int main()
{
	
	int num[3];
	while(num[0]==num[1] || num[1]==num[2] || num[0]==num[2])
	{
	srand(time(NULL)); 
   for(int i=0; i<3; i++)
      num[i] = rand()%9 +1; 
    }
	cout <<"컴퓨터가 생각한 숫자 : " << num[0] << num[1] << num[2] << "\n";
	int ch; 
	while(ch) // 탈출조건X  
	{cout <<"입력 : ";
	cin >> ch;
	
	
	int person[3];
 	int bcount=0;
	int scount=0;
	person[0] = ch/100;
	person[1] = (ch%100)/10;
	person[2] = (ch%10);

		for(int i=0;i<3;i++)
		{
			for(int j=0;j<3;j++)
			{
			if(num[i]==person[j])
				{
				if(i==j)
					scount++;
				else
					bcount++;
				}
			}
		}

		 if(scount==0 && bcount==0)
			cout << "출력 : OUT\n";
		else if(scount==0 && bcount!=0)
			cout << "출력 : "<< bcount << "볼\n";
		else if(bcount==0 && scount!=0)
		{	cout << "출력 : " << scount << "스트라이크\n";
			if(scount==3)
				break;
		}
		else 
			cout << "출력 : "<< scount << "스트라이크 " << bcount << "볼\n"; 
	}
		cout << "프로그램을 종료해요.\n";
		return 0;
	
}
역시나 야바위의 흔적이.. -_-+
쓰다보니 길어졌다~ while문 탈출조건 안쓰고 깔끔하게 하는방법 없을까.?

  • 오,, 주영 멋쪄~ ㅋㅋ - 민수
  • 문자 입력하면 매트릭스 모드 돌입하네 -_-;;; - 승균
    • 숫자만 입력하지 않은 죄값을 치룬것이오.ㅋㅋ


3. 권정욱

~cpp 
// 베이스볼 게임입니다. 간단히 말해 숫자 맞추기 게임으로 4자리 의 숫자를 9번 이전에 맞춰야 합니다.

#include <iostream.h>
#include <stdlib.h>
#include <time.h>

int main()
{
	int rand_num[3]; //난수생성에 사용될 변수입니다.
	int i, j, k, num;   //i,j,k 는 포문용, num 은 사용자 입력입니다.
	int player_num[3];  //사용자가 입력한 값을 각 자리 숫자로 나눠서 rand_num과 비교하기 쉽게 만듭니다.
	int ext,extra;    //여분의 변수입니다.
	int strike, ball; //스트라이크와 볼의 판정에 쓰입니다.
 
	srand(time(NULL));
 
	for(i=0;i<3;i++){
		rand_num[i] = rand()%10;   //한 자리수 난수를 생성합니다.
		if (i == 1 && rand_num[i] == rand_num[0]) 
			i--;
		else if (i == 2 && (rand_num[i] == rand_num[0] || rand_num[i] == rand_num[1])) 
			i--;
	}          //이 if 문을 통해서 4자리 숫자가 모두 다르게 배열되게 합니다.
 
	for (i=0;i<9;i++){   //게임의 시작
		cout << "3자리 숫자를 입력하세요(숫자가 겹치지 않게 쓰세요) : " ;
		cin >> num;
		ext = num;
  
		if (num < 100 || num > 999) {
			cout << "\a 잘못 입력하셨습니다. 다시 입력하여 주세요. \n";
			i--;
		}
		else{
			for (j=2;j>=0;j--){//숫자를 배열로 바꾸는 포문
				player_num[j] = ext%10;
				ext = ext/10;
			}
			for(j=0;j<2;j++){  //각자리 비교 포문 시작
				extra = 1;
				for(k=j+1;k<3;k++){
					if (player_num[j] == player_num[k]) {
						cout << "\a 잘못 입력하셨습니다. 다시 입력하여 주세요. \n";
						i--;
						extra = 0;
						break;
					}
					if (extra == 0) break;
				}
				if (extra == 0) break;
			}   // 각자리 비교 포문 끝
		}    // else 문 끝
                  	if (extra == 0) continue;

		strike = 0;
		ball = 0;

		if (extra == 1) {
			for(j=0;j<3;j++){  
				for(k=0;k<3;k++){
					if (rand_num[j] == player_num[k] && j==k) strike++;
					if (rand_num[j] == player_num[k] && j!=k) ball++;
				}
			}
		}
		if (strike == 0 && ball == 0) cout << "아웃입니다.\n";
		else cout << strike << "스트라이크, " << ball << "볼 입니다.\n";
		if (strike == 3) {
			cout << "숫자를 맞추셨습니다.!!\n";
			break;
		}
		if (i==8 && strike!=3) cout << "9회 게임 오버 입니다.\n";
	}     // 게임의 끝
	return 0;
}
보고 놀라지들 말아주시길 -_-;;; -정욱


  • 아.. 그리고 비주얼 베이직이 갑자기 한글이 다 깨져서 나오는데..
    어떻게 해야 할지 모르겠어요 ㅜㅜ -정욱

4. 일정

~cpp 
#include<iostream> // 수정판 ^^
#include<ctime>
using namespace std;
int main()
{
	int num[3];
	int yagu[3];
	int a;
	cout<<"컴퓨터가 생각하는 숫자:";
	srand(time(NULL));
	do
	{
	for(int i=0;i<3;i++)
	num[i]=rand()%9+1;
	}while(!(num[0]!=num[1] && num[1]!=num[2] && num[2]!=num[0]));
		cout<<num[0]<<num[1]<<num[2];
up :
	cout<<"\n입력:"; 
	cin>>a;
	if(a<1000 && a>99)
		{
			yagu[0]=a/100;
			yagu[1]=(a-yagu[0]*100)/10;
			yagu[2]=(a-yagu[0]*100-yagu[1]*10);
		}
	else
			cout<<"세자리수를 입력하세요:";
	
	int strike=0;
	int ball=0;
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<3;j++)
		{
			if(yagu[i]==num[j])
			{
				if(i==j)
					strike++;
				if(i!=j)
					ball++;
			}
		}
	}
	if(strike!=0 && ball==0)
		if(strike==3)
			cout<<strike<<"스트라이크! 종료";
		else
		{cout<<strike<<"스트라이크";
		goto up;
		}
	else if(strike==0 && ball!=0)
	{
		cout<<ball<<"볼";
		goto up;
	}
	else if(strike!=0 && ball!=0)
	{
		cout<<strike<<"스트라이크"<<ball<<"볼";
		goto up;
	}
	else
	{
		cout<<"out";
		goto up;
	}
	return 0;
}
  • goto문이 생각나서 쓰긴했는데 ... ... 전에 실습시간에 조교오빠가 goto문 안 쓰는 게 좋다고 한 것 같은데.. ㅡㅜ숫자 입력할 때 한 숫자 넣고 스페이스 바 누른 후 다음 숫자를 입력해야 하는 번거로움이 있네 어떻게 해야하지?? 프로그램이 바르게 돌아가는 게 맞는 지 확신이 없어서 계속 미루고 못 올렸는데 흠.. 틀린 것 좀 알려주시길.... - 일정
    - 무엇이든 100% 좋고 100% 나쁜것은 없습니다. dijkstra 할아버지가 goto 를 쓰지 말라고 하셨을 때도 달리 생각하는 많은 아저씨들이 수많은 논문을 썼고 이로 인해 많은 논쟁이 있었습니다. 중요한것은 좋으냐? 혹은 나쁘냐? 가 아니라 그 결론에 이루어지기까지의 과정입니다. SeeAlso NotToolsButConcepts Seminar:컴퓨터고전 Goto Statements Considered Harmful의 구글 검색결과 Wiki:GotoConsideredHarmful - 임인택
    - 소스코드를 보아하니 레이블로 cin 을 사용하였군요. cin 이 c++의 예약어는 아니지만 예약어와 마찬가지인 ostream 의 객체 이름입니다. 이런 레이블은 코드를 읽는 사람에게 그 의미가 와전되어 전달될 수가 있습니다. - 임인택
    • 넵!오빠~ thank you~^^ -일정
  • 오~ 일정 대단해~ 잘했어~ - 민수
  • 우와...goto...첨보는거다 =ㅅ= - 승균
  • goto 문에 관한 것은 도서관에서 마이크로소프트웨어 2003년 4월호 다익스트라가 goto에 시비(?)를 건 진짜 이유는 이라는 기사를 보세요. 2003년에 GotoConsideredHarmful 을 스터디 한후에 토론하고 작성된 기사입니다. Dijkstra 의 심오한 생각들이 묻어 있을겁니다. --아무개
  • 문득 숙제를 하다 go to에대해 알아보게 되었군요. 편한방법이긴한데.. -주영

5. 오승균의 숫자야구게임 v1.3

~cpp 
#include <iostream.h>
#include <stdlib.h>
#include <ctime>
void game();
void new_game();


void main()
{
        cout << "┌──────────────────────────┐\n" 
                "│                                                    │\n" 
                "│                                                    │\n" 
                "│                  숫  자  야  구                    │\n" 
                "│                                                    │\n" 
                "│                      게   임 ver 1.3               │\n" 
                "│                                                    │\n" 
                "│                                                    │\n" 
                "│                                                    │\n" 
                "│                                  Made by 오승균    │\n" 
                "│                                                    │\n" 
                "└──────────────────────────┘\n";// 타이틀 화면	

         cout << "\n";

	game(); // 게임함수 시작
}

void game()
{
	char random[4]; // 임의로 만들어질 숫자를 저장하는 배열
	char space[64]; // 입력하는 숫자를 저장하는 배열
	int strike = 0; // 스타라이크 카운터 초기화
	int ball = 0; // 볼 카운터 초기화
	srand(time(NULL));
	
	for (int i = 0; i < 4; i++)	
	{	
		random[i] = '0' + rand() % 9 + 1;
        for (int j = 0; j < i; j++)
			if (random[i] == random[j])
			{
				i--;
				break;
			}
	} // 랜덤하게 4자리 숫자를 생성합니다
	
	
	/*cout << random[0] << random[1] << random[2] << random[3] << endl;*/ // 대략 답 -_-;;;


	cout << "랜덤하게 4자리숫자를 만들었습니다. 맞춰보세요 *^^* (종료 : Q)\n\n";
	
	int success = 0; // 제대로 입력했는지 확인 절차 (0 = 실패, 1 = 성공)

	while (success == 0)
	{	
		cout << "숫자를 입력하세요 : ";
		cin.getline(space, 64);
		success = 1;

		if ((space[0] == 'q' || space[0] == 'Q') && space[1] == '\0') 
		{
			cout << "Bye!!\n";
			exit(0);
		} // 도중에 'Q'를 입력하면 종료
		
		for (i = 0; i < 4; i++)
		{	
			if (space[i] < '1' || space[i] > '9') 
			{
				success = 0;
                break;
			}
		} // 1~9사이에 숫자가 제대로 입력되었는지 확인 
        if (space[4] != '\0')
			success = 0; // 4자리가 정확히 입력되었는지 확인
		for (i = 0; i < 3; i++)
			for (int h = i + 1; h < 4; h++)
				if (space[i] == space[h])
				{	
					success = 0;
					break;
				} // 중복 입력이 되었는지 확인
		if (success == 0)
			continue; // 위 사항중 1개라도 걸리면 다시 입력

		// 여기서 부터 제대로 입력했을시...
		
		for (int j = 0; j < 4; j++)
		{
			if (space[j] == random[j])
				strike++; // 스트라이크 카운터
			for (int k = 0; k < 4; k++)
				if (j != k && space[j] == random[k])
					ball++; // 볼 카운터
				else 
					continue;
				
		}
			
		if (strike == 0 && ball == 0)
		{
			cout << "결과 : ";
			cout << "OUT!!";	// 스트라이크, 볼이 없는 겨우 'OUT' 출력		
		}
		else if (strike == 4)
			new_game(); // 정확히 맞췄을 경우 new_game함수로 이동
		else
		{
			cout << "결과 : ";
			cout << strike << "S" << "  " << ball << "B";
		} // 입력에 대한 결과 출력
		
		cout << endl;
		
		strike = 0;
		ball = 0; 
		success = 0; // success를 0으로 초기화함으로써 while문 다시 시작
	}
}


void new_game() // 게임에서 성공했을시 여기로 이동
{	
	cout << "맞추셨습니다. 또 하시겠습니까? (Y/N) : ";
	char ch;
	cin >> ch;
	
	while (ch != 'y' || ch != 'Y' || ch != 'n' || ch != 'N')
	{
		if (ch == 'y' || ch == 'Y')
		{
			while (cin.get() != '\n')
				continue; // y를 치고 엔터를 쳤을때 생기는 개행문자 제거
			game();
			break;
		}
		else if (ch == 'n' || ch == 'N')
		{	
			cout << "Bye!!\n";
			exit(0); // 게임 종료
		}
		else
		{
			cout << "맞추셨습니다. 또 하시겠습니까? (Y/N) : ";
			cin >> ch; 
		}
	}
}


/*
Ver 1.3 Update
게임 도중에 종료기능 추가

Ver 1.2 Update
개행문자 제거하기 (무쟈게 어려웠어요 ㅜㅜ)

Ver 1.1 Update
3자리수에서 4자리수로 변경. 소스 대거 수정.

Ver 1.0
기본 틀 완성. 게임은 제대로 구동되나 숫자 이외의 문자 입력시 메트릭스 모드 돌입 -_-;;;
*/

에효...무쟈게 힘들었음 ㅜㅜ
그래도 성공하니 뿌듯하네요.
그리고...
절대!!!!!!!!!!
이거 혼자한거 아님.
기본틀은 혼자서 다 했는데,
메트릭스모드 제거 이런건 도움좀 받았음.

P.S. 윽...소스가 정리가 안되어서 보기에 좋지는 않군 (쿨럭) 비쥬얼C++에다 직접 붙여서 보세요 ~_~
Digi-VM

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:29:38
Processing time 0.0245 sec