Programming Language/go

Go 언어 프로그래밍 - 숫자맞추기 게임

김크리 2021. 7. 19. 20:35

목표

1. 0~99 사이 랜덤한 숫자 생성

2. 사용자 입력

3. 사용자 입력값이 크면 "큽니다" 작으면 "작습니다" 출력 2번 반복

4. 입력값이 같으면 프로그램 종료

 

랜덤

math/rand 패키지 사용rand.Seed(seed int64) 함수로 랜덤 시드(Seed) 설정rand.Intn(n int) int 함수로 0~(n-1) 사이의 값 생성

package main

import (
	"fmt"
	"math/rand"
)

func main() {
	//seed 값에 의해 랜덤이 정해진다.
	//알수 없는 랜덤값이 나오려면 seed 값이 바뀌어야한다.
    //프로그램 실행시마다 계속 변화하는 값을 seed로 해야 진정한 랜덤 -> 대표적으로 시각
	rand.Seed(100)
	for i := 0; i < 10; i++ {
		fmt.Println(rand.Intn(100))
	}
}

시간

time 패키지를 사용하여 시간과 관련된 기능을 사용할 수 있다.

time.Now() 현재 시각 제공

func (t Time) UnixNano() int64 Time 객체의 t의 1970년 1월 1일부터 현재까지 경과된 시간을 nano seconds 단위로 반환

  • 시각은 나타내는 Time 객체
  • 시간을 나타내는 Duration 객체
  • 타임존을 나타내는 Location 객체
package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	t := time.Now()
	rand.Seed(t.UnixNano())
	for i := 0; i < 10; i++ {
		fmt.Println(rand.Intn(100))
	}
}
package main

import (
	"fmt"
	"time"
)

func main() {
	loc, _ := time.LoadLocation("Asiz/Seoul")
	const longForm = "JAn 2, 2006 at 3:06pm"
	t1, _ := time.ParseInLocation(longForm, "Jun 14, 2021 at 10:00pm", loc)
	fmt.Println(t1, t1.Location(), t1.UTC())

	const shortForm = "2006-Jan-02"
	t2, _ := time.Parse(shortForm, "2021-Jun-14")
	fmt.Println(t2, t2.Location())

	//month 의 모호함으로 에러 발생
	t3, err := time.Parse("2021-06-01 15:20:21", "2021-06-14 20:04:05")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(t3, t3.Location())
	d := t2.Sub(t1)
	fmt.Println(d)
}

 

목표 과제를 만들어보자

package main

import (
	"bufio"
	"fmt"
	"math/rand"
	"os"
	"time"
)

//표준 입력 스트림으로 값을 읽을 수 있는 객체를 가져온다.
var stdin = bufio.NewReader(os.Stdin)

func InputIntValue() (int, error) {
	var n int
	_, err := fmt.Scanln(&n)
	if err != nil {
		//clear buffer
		stdin.ReadString('\n')
	}
	return n, err
}

func main() {
	rand.Seed(time.Now().UnixNano())

	r := rand.Intn(100)
	cnt := 1
	for {
		fmt.Println("숫자를 입력하세요 : ")
		n, err := InputIntValue()
		if err != nil {
			fmt.Println("숫자만 입력하세요.")
		} else {
			if n > r {
				fmt.Println("입력하신 숫자가 더 큽니다.")
			} else if n < r {
				fmt.Println("입력하신 숫자가 더 작습니다.")
			} else {
				fmt.Println("숫자를 맞췄습니다. 축하합니다. 시도한 횟수 : ", cnt)
				break
			}
		}
		cnt++
	}
}

 

 

참고

Tucker의 Go언어 프로그래밍 - Go가 온당 17장

https://www.youtube.com/c/TuckerProgramming/videos