Pernahkah kamu mendengar game incremental atau pernah memainkan game seperti cookie clicker, tahu bulat dan sejenisnya. Jika kamu belum pernah memainkan game incremental, akan lebih mudah dan menyenangkan jika kita yang menulis game seperti itu. Untuk kamu yang sudah pernah main, mohon jangan kecewa dengan hasilnya.

Kerangka Game

Game yang akan kita buat sangat sederhana, didalam game hanya ada satu objek type Koki dengan level dan Tahu yang digorengnya. Aksinya hanya satu gorengTahu() yang jelas menggoreng tahu. Fungsi gorengTahu() nantinya akan di panggil sebagai goroutine, jadi kita yang memainkan game cukup menunggu tahu goreng di fungsi main().

Untuk kerangka game nya seperti ini:

package main

import (
	"fmt"
	"time"
)

// Koki kita
type Koki struct {
	Level      int
	Sibuk      bool
	TahuGoreng int64
}

// 3000 = 20 tahu permenit
const KECEPATAN = 3000

// Aksi si koki
func (koki *Koki) gorengTahu() {
    // Kegiatan si koki disini
}

// fungsi utama program/game
func main() {
    // Kita panggil dan tunggu koki disini
}

Game yang kita buat hanya menggunakan 2 standar librari dari golang yaitu fmt untuk input dan output game dan time untuk memberikan waktu untuk si Koki untuk menggoreng setiap tahu. Objek Koki sendiri memiliki properti Level dimana semakin tinggi level semakin handal meggoreng tahu, Properti Sibuk untuk menandai bahwa si koki sedang mengerjakan sesuatu, dan properti TahuGoreng untuk mencatat berapa banyak tah goreng yang telah digoreng si kuki.

Untuk konstan KECEPATAN adalah kecepatan si koki menggoreng tahu permenitnya, jadi bisa dikatakan sangat handal untuk koki level 1. Jangan tanya bagaimana sikoki melakukannya dengan cepat, yang jadi masalah bagaimana kita menghabiskan tahu sebanyak itu permenit.

Terakhir yaitu fungsi yang digunakan pada game ini seperti yang dijelaskan diatas, fungsigorengTahu() adalah aksi si koki dan kita yang memesan tahu di fungsi utama main().

Fungsi gorengTahu()

Di fungsi gorengTahu() utamanya adalah menambahkan mencatat tahu goreng yang digoreng si Koki. Tapi ika itu saja maka game kita akan kurang menuyenangkan, jadi kita beri koki tantangan dengan waktu yang telah di deklarasikan di konstant KECEPATAN. Koki tidak akan berhenti menggoreng hingga kita keluar dari game for koki.Sibuk. Koki akan naik levelnya setiap 70 tahu goreng yang dibuat koki.Level += 1 dan semakin tinggi level maka semakin pendek waktu untuk koki menggoreng tahu t = time.Duration(KECEPATAN / koki.Level).

func (koki *Koki) gorengTahu() {
	if koki.Sibuk { // jangan buat goroutine baru jika koki sibuk
		fmt.Println("Koki sedang sibuk memasak")
		return
	}

	fmt.Println("Koki mulai menggoreng tahu")
	koki.Sibuk = true

	t := time.Duration(KECEPATAN / koki.Level)

	for koki.Sibuk {
		time.Sleep(t * time.Millisecond)
		koki.TahuGoreng += 1

		// naikan level setiap 70 tahu yang digoreng
		if (koki.TahuGoreng % 70) == 0 {
			koki.Level += 1

			// semakin tinggi level semakin cepat menggoreng tahu
			t = time.Duration(KECEPATAN / koki.Level)

			fmt.Println("Tantangan waktu :",t)
			fmt.Printf("Koki naik ke level %d Tahu digoreng %d \n", koki.Level, koki.TahuGoreng)
		}
	}
}

Fungsi Main()

Pada fungsi main kita menginisialisai Objek koki yang akan menggoreng Tahu dengan levelnya yaitu level satu. Kemudian untuk menunggu koki kita menggunkan perulangan for. Dalam perulangan ini kita hanya memiliki empat perintah seperti yang dijelaskan pada bantuan program semuanya ditulis dalam kondisi switch. Jika kita keluar dari perulangan maka kita keluar dari game.

Yang perlu diperhatikan pada fungsi main() adalah untuk menjalankan aksi koki gorengTahu() menggunakan goroutine.

func main() {
	koki := &Koki{
		Level: 1,
	}
	cmd := "x"
	for cmd != "k" {
		//input pengguna
		fmt.Println("Masukkan perintah [b]:")
		fmt.Scanln(&cmd)

		// proses perintah dari pengguna
		switch cmd {
		case "go":
			// jalankan goroutine
			go koki.gorengTahu()

		case "s":
			// Menampilkan Stats
			fmt.Printf(`
			========== STATS ============
				Level koki : %d
				Sibuk : %v
				Jumlah Tahu Digoreng: %d
			=============================
			`, koki.Level, koki.Sibuk, koki.TahuGoreng)

		default:
			fmt.Printf(`
			========== BANTUAN ==========
				b - Menampilkan bantuan
				s - Stats
				go - Suruh koki memasak
				k - keluar game
			=============================
				`)
		}
	}

    // Keluar
	fmt.Println("GAME IS OVER!")
}

Cara memainkan game

Untuk memainkan game cukup mudah, tulis semua kode program diatas dalam satu file main.go kemudian jalankan perintah:

go run main.go

Kalau tidak tahu apa yang harus dilakukan setelah game berjalan masukkan b untuk menampilkan bantuan. Ketika menulis tutorial ini saya juga memainkan game ini dan hasilnya seperti berikut:

Koki naik ke level 102 Tahu digoreng 7070 
s

            ========== STATS ============
                    Level koki : 102
                    Sibuk : true
                    Jumlah Tahu Digoreng: 7119
            =============================
            Masukkan perintah [b]:
Tantangan waktu : 29ns
Koki naik ke level 103 Tahu digoreng 7140