게임강의
각종 노하우 분류

각종 노하우 게임 개발의 기초 c/c++ 강의 - 기본5

컨텐츠 정보

본문

[출처: Gamezone]
작성자: 작성자 없음

 

 


안녕하세요 llafjkl입니다.


난수


먼저 srand()란 난수를 사용하기 위해서는 헤더값을 불러와야 한답니다


저번에 배웠던 전처리기 기능으로 #include <time.h>를 가져옵니다!!


time.h를 갖고 오게되면 time(0)이란 코드를 사용할 수 있는데 요것은 시간을 얻어올 수 있는 기능입니다.


1초가 지나면 1이 증가되는 값을 갖고오게 됩니다.


이 time(0)은 1970년도에 만들어졌다고 해요... 엄청 오래됐죠??


rand() 란 랜덤 한 값을 얻어올수 있습니다. 0 ~ 32767 사이의 수를 얻어오게 됩니다.


rand()를 이용해서 랜덤 한 값을 얻어올때 내부적으로 랜덤한 값이 들어가 있는 표를 이용해서 얻어온다고 합니다.


그런데


std::cout << rand() << std::endl;
std::cout << rand() << std::endl;
std::cout << rand() << std::endl;


이렇게 코드를 구성해서 돌려보면


41
18467
6334


이라는 숫자가 고정적으로 나오게 됩니다.


이 이유는 어떤 표를 사용할 것이다 라고 지정한 게 아닌 고정된 표에서 랜덤 한 값을 얻어와서 계속 같은 값이 나오게 되는 것입니다.


그래서 랜덤한 값을 사용하기 위해서는 표를 실행할 때마다 다른 표를 가져올 수 있게 만들어야 합니다.


srand(time(0));


이런 식으로 말이죠


time();라는 코드 자체가 1초마다 숫자가 1씩 증가되어 계속적으로 srand값이 바뀌는 원리를 이용한 겁니다.


 


또 나머지 연산자를 통해서 ? ~ ? 의 값 사이의 난수를 얻어올 수도 있습니다.


std::cout << rand() % 101 << std::endl;


을 하게 되면 1~100 사이의 난수를 얻어올 수 있게 됩니다.


만약에 여기서 1~200의 난수 코드를 작성하게 되면


std::cout << rand() % 101 + 100 << std::endl;


의 구성이 되게 됩니다.


또 이것을 활용해 1 ~ ???이 아니라


100 ~ 500을 같이 만들려면


난수 % (최대 - 최소 + 1) + 최소의 구성으로


std::cout << rand() % (500 - 100 + 1) + 100 << std::endl;


이 되게 됩니다.


 


난수를 활용한 가위바위보 게임


 


#include <iostream> // 입출력 헤더 파일을 갖고 오기 위한 전처리기

#include <time.h> // 난수 사용을 위해 갖고 온 타임 헤더 파일


 


// enum문을 활용해 가위 바위 보를 구성
enum class SRP
{
S = 1,  // 가위
R,  // 바위
P   // 보
};

int main()
{


    // srand를 활용하여 난수 테이블 생성
    srand(time(0));
    // 첫 난수는 랜덤 한 수가 아닌 계속적으로 상승하는 버그? 가 있어서 rand();값을 한번 작성한다.
    rand();
    // 플레이어가 가위, 바위, 보, 종료를 선택하기 위한 변수를 생성
    int Player = 0;
    // while문을 이용하여 게임이 나가지지 않고 반복되게 설정
    while (true)
    {
        // cls 콘솔 명령을 입력해주어서 콘솔 창의 내용을 모두 지워준다.
        system("cls");


        // 선택하기 위한 내용 설명
        std::cout << "1. 가위" << std::endl;
        std::cout << "2. 바위" << std::endl;
        std::cout << "3. 보" << std::endl;
        std::cout << "4. 종료" << std::endl;
        std::cout << "선택하세요 : ";


        // cin을 활용해 플레이어가 선택할 수 있게 만듦
        std::cin >> Player;
        // if문을 활용해 플레이어가 4번을 누르면 break;되어 게임을 종료하게 만듦
        if (Player == 4)
            break;

        // 인공지능은 랜덤 하게 셋 중 하나를 선택한다.
        int AI = rand() % 3 + 1;


        // 스위치문에 인공지능이 선택한것을 enum class 의 열거체 타입만의 변수를 만듬으로써 스위치문에 넣기 위함
        SRP AISRP = (SRP)AI;

        switch (AISRP)
        {
        case SRP::S:
            std::cout << "AI : 가위" << std::endl;
            break;
        case SRP::R:
            std::cout << "AI : 바위" << std::endl;
            break;
        case SRP::P:
            std::cout << "AI : 보" << std::endl;
            break;
        }
        // enum문 구성을 보면 가위 = 1, 바위 = 2, 보 = 3의 구성이므로


        // 승리의 조건은 Player - AI가 1 or -2가 나와야 한다
        int Result = Player - AI;
        // if문을 활용한 승리 조건
        if (Result == 1 || Result == -2)
            std::cout << "Player 승리" << std::endl;
        // else if를 활용해 비긴 조건
        else if (Result == 0)
            std::cout << "비겼다" << std::endl;

        // else를 활용한 진 조건
        else
            std::cout << "졌다..ㅠㅠ" << std::endl;

        // 콘솔 창을 일시정지시켜준다. 아무 키나 누르면 다시 시작된다.
        system("pause");
    }

return 0;
}

관련자료

댓글 0
등록된 댓글이 없습니다.
전체 422 / 7 페이지
번호
제목
이름

강의실

🏆 포인트 랭킹 TOP 10
순위 닉네임 포인트
1 no_profile 타키야겐지쪽지보내기 자기소개 아이디로 검색 전체게시물 82,042
2 no_profile 라프텔쪽지보내기 자기소개 아이디로 검색 전체게시물 51,280
3 no_profile 동가리쪽지보내기 자기소개 아이디로 검색 전체게시물 32,591
4 no_profile Revolution쪽지보내기 자기소개 아이디로 검색 전체게시물 28,199
5 서번트쪽지보내기 자기소개 아이디로 검색 전체게시물 23,416
6 no_profile 닥터스쪽지보내기 자기소개 아이디로 검색 전체게시물 22,310
7 no_profile 불멸의행복쪽지보내기 자기소개 아이디로 검색 전체게시물 13,822
8 no_profile 호롤롤로쪽지보내기 자기소개 아이디로 검색 전체게시물 13,500
9 no_profile 검은고양이쪽지보내기 자기소개 아이디로 검색 전체게시물 13,246
10 no_profile 하늘2쪽지보내기 자기소개 아이디로 검색 전체게시물 13,239
알림 0