Implementasi Algoritma Greedy Pada Game Summy
47
LAMPIRAN A
LAMPIRAN HASIL EVALUASI GAME SUMMY DENGAN METODE BLACK
BOX TESTING
a. Hasil evaluasi pada Tampilan Halaman Menu Utama
Tabel Hasil Evaluasi Tampilan Halaman Menu Utama
No.
1.
2.
3.
4.
5.
Sasaran
Pengujian
Tampilan
ketika
aplikasi
dieksekusi
Pemilihan
menu Mulai
Pemilihan
menu
Bantuan
Pemilihan
menu
Tentang
Pemilihan
menu
Keluar
Hasil yang
Diharapkan
Aplikasi
menampilkan
halaman Menu
Utama
Aplikasi
menampilkan
halaman Games
Aplikasi
menampilkan
halaman Bantuan
Aplikasi
menampilkan
halaman Tentang
Aplikasi berhenti
Hasil Pengujian
Kesimpulan
Aplikasi berhasil
menampilkan
halaman Menu
Utama
Aplikasi berhasil
menampilkan
halaman Games
Aplikasi berhasil
menampilkan
halaman Bantuan
Aplikasi berhasil
menampilkan
halaman Tentang
Aplikasi berhasil
berhenti
Valid
Valid
Valid
Valid
Valid
b. Hasil Evaluasi pada Tampilan Halaman Game
Tabel Hasil Evaluasi Tampilan Halaman Game
No.
1.
2.
Sasaran
Pengujian
Giliran awal
bermain
Selot kotakkotak milik
pemain dan
komputer
Hasil yang
Diharapkan
Aplikasi
mengacak giliran
bermain pada awal
halaman Game
ditampilkan
Aplikasi
membagikan
masing-masing 8
kotak untuk
Hasil Pengujian
Kesimpulan
Aplikasi berhasil
mengacak giliran
bermain dan
menampilkan
pesannya di layar
Aplikasi berhasil
membagikan
masing-masing 8
kotak untuk
pemain dan
Valid
Valid
48
pemain dan
komputer
3.
Selot kotakkotak milik
pemain
4.
Pemilihan
menu Swap
/ Delete
5.
Pemilihan
menu
Cancel
6.
Pemilihan
menu Next /
End Turn
Pemain dapat
memindahkan
kotak-kotak
miliknya ke papan
game pada saat
gilirannya
Pemain dapat
mengganti satu
atau semua kotakkotak miliknya
dengan kotak yang
ada pada
tumpukkan pada
saat gilirannya
Pemain dapat
mengembalikan
kotak miliknya
yang baru saja
diletakkan pada
papan game ke
selot miliknya
pada saat
gilirannya
Pemain dapat
mengakhiri
gilirannya
komputer
ditunjukkan
dengan
berkurangnya
jumlah kotak yang
tersisa
Pemain berhasil
memindahkan
semua kotak dari
selot miliknya ke
papan game pada
saat gilirannya
Pemain berhasil
mengganti satu
atau semua kotak
miliknya dengan
men-drag and
drop kotak
miliknya baik pada
selot maupun yang
baru saja
diletakkan pada
papan game ke
atas menu swap /
delete pada saat
gilirannya
Pemain berhasil
mengembalikan
kotak miliknya
yang baru saja
diletakkan pada
papan game ke
selot miliknya
pada saat
gilirannya
Pemain berhasil
mengakhiri
gilirannya baik
dengan
memberikan
langkah terbaiknya
maupun hanya
untuk skip
gilirannya dengan
muncul pesan
notifikasi berganti
ke giliran
komputer
Valid
Valid
Valid
Valid
49
7.
Komputer
berhasil
menemukan
solusi pada
saat
gilirannya
8.
Komputer
gagal
menemukan
solusi pada
saat
gilirannya
9.
Pengecekan
papan game
setelah
giliran
pemain atau
komputer
berakhir
10.
Skor Game
Komputer dapat
mencari langkah
terbaik dari kotak
miliknya dan
meletakkannya
pada papan game
dan giliran
permainan
berganti ke
pemain
Aplikasi dapat
menampilkan
informasi jika
kesempatan skip
miliknya telah
berkurang 1 kali
dan giliran
permainan
berganti ke
pemain
Aplikasi dapat
mengecek langkah
valid yang telah
dilakukan pemain
atau komputer
sesaat setelah
gilirannya
berakhir.
Komputer berhasil
mencari langkah
terbaik dari kotak
miliknya dan
meletakkannya
pada papan game
dengan muncul
pesan notifikasi
berganti ke giliran
pemain
Aplikasi berhasil
menampilkan
informasi jika
kesempatan skip
milik komputer
telah berkurang 1
kali
Valid
Valid
Aplikasi berhasil
Valid
mengecek langkah
valid yang telah
dilakukan pemain
atau komputer
sesaat setelah
gilirannya
berakhir.
Ditunjukkan
dengan perubahan
warna kotak
menjadi hijau dan
muncul notifikasi
skor yang didapat
Aplikasi dapat
Aplikasi berhasil
Valid
menampilkan total menampilkan total
skor dan skor yang skor dan skor yang
diperoleh pada
diperoleh pada
langkah valid yang langkah valid yang
didapatkan oleh
didapatkan oleh
pemain dan
pemain dan
komputer
komputer sesaat
setelah mengakhiri
gilirannya
50
11.
Pemilihan
menu Home
12.
Semua
kotak pada
tumpukkan
telah habis
Aplikasi dapat
menampilkan
menu pilihan
untuk mengulang
dari awal
permainan atau
kembali ke
halaman Menu
Utama
Aplikasi akan
menghentikan
permainan,
menghitung total
skor yang
didapatkan oleh
pemain dan
komputer dan
menentukan
pemenang
berdasarkan siapa
pemilik total skor
paling besar
Aplikasi berhasil
Valid
menampilkan
menu pilihan
untuk mengulang
dari awal
permainan atau
kembali ke
halaman Menu
Utama
Aplikasi berhasil
Valid
menghentikan
permainan,
menghitung total
skor yang
didapatkan, dan
menampilkan
siapa yang
menjadi pemenang
berdasarkan skor
yang paling besar.
c. Hasil Evaluasi Tampilan Halaman Bantuan
Tabel Hasil Evaluasi Tampilan Halaman Bantuan
No.
1.
2.
Sasaran
Pengujian
Tampilan
halaman
Bantuan
Tutup
halaman
Bantuan
Hasil yang
Diharapkan
Aplikasi dapat
menampilkan
halaman Bantuan
Aplikasi dapat
menutup halaman
Bantuan ketika
area luar halaman
Bantuan diklik
Hasil Pengujian
Kesimpulan
Aplikasi berhasil
menampilkan
halaman Bantuan
Aplikasi berhasil
menutup halaman
Bantuan ketika
area luar halaman
Bantuan diklik
Valid
Valid
51
d. Hasil Evaluasi Tampilan Halaman Tentang
Tabel Hasil Evaluasi Tampilan Halaman Tentang
No.
1.
2.
Sasaran
Pengujian
Tampilan
halaman
Tentang
Tutup
halaman
Bantuan
Hasil yang
Diharapkan
Aplikasi dapat
menampilkan
halaman Tentang
Aplikasi dapat
menutup halaman
Tentang ketika
area luar halaman
Tentang diklik
Hasil Pengujian
Kesimpulan
Aplikasi berhasil
menampilkan
halaman Tentang
Aplikasi dapat
menutup halaman
Tentang ketika
area luar halaman
Tentang diklik
Valid
Valid
e. Hasil Evaluasi Resolusi Layar Monitor terhadap Tampilan Summy
1. Resolusi Layar Monitor 800 x 600 Pixel (Terpotong)
Gambar Tampilan Summy pada resolusi monitor 800 x 600 pixel
52
2. Resolusi Layar Monitor 1024 x 720 Pixel (Terpotong)
Gambar Tampilan Summy pada resolusi monitor 1024 x 720 pixel
3. Resolusi Layar Monitor 1280 x 720 Pixel (Terpotong)
Gambar Tampilan Summy pada resolusi monitor 1280 x 720 pixel
53
4. Resolusi Layar Monitor 1366 x 768 Pixel (Tidak Terpotong)
Gambar Tampilan Summy pada resolusi monitor 1366 x 768 pixel
f. Hasil Evaluasi Performa pada Game Summy
Spesifikasi beberapa komputer yang akan digunakan dalam percobaan adalah
sebagai berikut:
1. Operating System : Windows 7 Ultimate 32-bit SP1
CPU
: Intel Mobile Core 2 Duo T5870 @ 2.00GHz
RAM
: 2,00GB
Motherboard
: ASUSTeK Computer Inc. K40IN
Graphics
: Generic PnP Monitor (1366x768@62Hz)
512MB NVIDIA GeForce G102M
Storage
: 232GB Seagate ST9250315AS ATA Device (SATA)
2. Operating System : Windows 7 Ultimate 64-bit SP1
CPU
: Intel Core i3 2310M @ 2.10GHz
RAM
: 4,00GB Dual-Channel DDR3 @ 665MHz
Motherboard
: ASUSTeK Computer Inc. K43E (CPU 1)
Graphics
: Generic PnP Monitor (1366x768@60Hz)
Intel HD Graphics 3000
Storage
: 465GB TOSHIBA MQ01ABF050 SCSI Disk Device
3. Operating System : Windows 10 Pro 64-bit
54
CPU
: Intel Core i5 4200U @ 1.60GHz
RAM
: 8,00GB Dual-Channel DDR3 @ 798MHz
Motherboard
: ASUSTeK COMPUTER INC. X450LCP
Graphics
: Generic PnP Monitor (1366x768@60Hz)
Intel HD Graphics Family (ASUStek Computer Inc)
2047MB NVIDIA GeForce GT 720M
Storage
: 465GB Hitachi HGST HTS545050A7E680
Tabel Hasil Evaluasi Performa pada Game Summy yang Dicoba pada Beberapa
Komputer Berbeda
Kotak di
tangan
Kotak di papan
Hasil
Bentuk
1,3,5,7,9,+,x,-
=
19x3=57
3,4,5,6,7,8,9,-
=
94-58=36
0,2,4,6,8,x,:,-
=
8-6=2
1,2,3,4,5,6,7,+
=
63+12=75
3,4,5,6,7,8,9,-
0,2,4,6,8,x,:,=
94-58=36
96:48=2
Komputer Waktu
FPS
terendah
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
0,017
0,017
0,017
0,217
0,217
0,200
0,017
0,017
0,017
0,233
0,267
0,217
0,283
0,217
0,167
44
60
60
20
28
32
44
60
60
12
28
56
20
40
60
1
0,170
24
2
0,170
56
3
0,050
56
55
1,3,5,7,9,+,-,=
1,2,3,4,5,6,7,=
4,5,6,7,8,9,=,+
93-78=15
76-45=31
679+5=684
1
0,217
24
2
0,017
32
3
0,017
56
1
1,850
12
2
3,117
20
3
3,567
56
1
1,950
32
2
1,100
48
3
1,433
56
56
LAMPIRAN B
LAMPIRAN PETUNJUK CARA BERMAIN PADA GAME SUMMY
Cara bermain pada game Summy:
1. Pada saat gilirannya bermain, pemain dapat memindahkan kotak dari selot
miliknya ke papan permainan dengan cara melakukan drag and drop.
57
2. Jika pemain ingin menukarkan salah satu kotak miliknya dengan kotak yang
lain, pemain dapat melakukan drag and drop kotak yang dimaksud ke menu
Tukar.
3. Jika pemain ingin mengembalikan kotak yang baru saja diletakkan pada papan
permainan ke selot miliknya lagi, pemain dapat mengklik menu Kembalikan.
58
4. Ketika pemain telah berhasil menyusun bentuk penjumlahan, pengurangan,
perkalian atau pembagian yang valid maka aplikasi akan mengubah warna kotak
tersebut menjadi hijau. Jika tidak valid akan berubah menjadi warna biru.
59
5. Pemain dapat mengakhiri gilirannya jika telah menyusun bentuk yang valid
untuk memperoleh poin atau jika ingin melewati gilirannya dengan cara
mengklik menu Lanjut.
6. Jika giliran pemain berakhir, maka giliran AI bermain. Hal ini ditunjukkan
dengan notifikasi di sudut atas halaman dan area milik pemain akan menjadi
gelap. Begitu pula sebaliknya saat berganti lagi giliran pemain.
60
61
62
7. Pemenang permainan akan ditentukan berdasarkan skor terbanyak yang diraih
saat tidak ada lagi tumpukkan kotak yang tersisa dan pemain dan AI tidak dapat
menyusun bentuk lagi.
63
LAMPIRAN C
LAMPIRAN LISTING PROGRAM
Kode Program Class GreedyProcess:
Imports System.Text
Imports System.Threading.Tasks
Class GreedyProcess
Private Function PermutasiDikurangi(Data() As String, DaftarYangDihapus As
String) As String()
Dim DataKandidat = Data.ToList
Dim Dftr = DaftarYangDihapus.Split("/"c)
For Each dft In Dftr
If dft "" Then
DataKandidat.Remove(dft)
End If
Next
Return DataKandidat.ToArray
End Function
Structure JenisList
Friend ListNumerik() As String
Friend ListOperator() As String
End Structure
Private
Dim
Dim
Dim
Dim
Dim
For
Function PisahNumerik(Data() As String) As JenisList
T As List(Of String) = Data.ToList
D() As String = T.ToArray
TipeList As New JenisList
i = 0
j = 0
Each S In D
If Integer.TryParse(S, 0) Then
ReDim Preserve TipeList.ListNumerik(i)
TipeList.ListNumerik(i) = S
i += 1
Else
ReDim Preserve TipeList.ListOperator(j)
TipeList.ListOperator(j) = S
j += 1
End If
Next
Return TipeList
End Function
Friend Sub SusunKandidatParalelDanSetUpHasil(Data() As String,
KandidatSource As GamePlay.KandidatCPUBaseKoordinat, Kpbntu As List(Of
Vector2), IsHorizontal As Boolean, TileYangDipegang As TileBoard(), TileBoard
As TileBoard(,), loopState As ParallelLoopState)
Dim TempData = Data
If AktifCPU AndAlso Not CPUPlaceSet AndAlso
CInt(TimeSpan.FromSeconds(WaktuTungguBerjalan).ToString("mm")) <
BatasWaktuTunggu Then
Array.Sort(TempData)
64
Array.Reverse(TempData)
If Not TempData Is Nothing AndAlso TempData.Contains("=") And
TempData.Count > 0 Then
'SyncLock kunci
SusunKandidatDanSetUpHasilnya(TempData, KandidatSource, Kpbntu,
IsHorizontal, TileYangDipegang, TileBoard, loopState)
'End SyncLock
End If
End If
End Sub
Private Sub SusunKandidatDanSetUpHasilnya(Data() As String, KandidatSource
As GamePlay.KandidatCPUBaseKoordinat, Kpbntu As List(Of Vector2), IsHorizontal
As Boolean, TileYangDipegang As TileBoard(), TileBoard As TileBoard(,),
loopState As ParallelLoopState)
If Not AktifCPU Then
Exit Sub
End If
Dim TipeList As JenisList = PisahNumerik(Data)
For Each t In TipeList.ListOperator
If t.Count >= 2 Then
Exit Sub
End If
Next
'Dim OPTerpakai As New StringBuilder
Dim A As New List(Of String)
SyncLock Kunci1
A = Permutasi(2, TipeList.ListNumerik)
End SyncLock
For i = 0 To A.Count - 1
If Not AktifCPU Or CPUPlaceSet Or
CInt(TimeSpan.FromSeconds(WaktuTungguBerjalan).ToString("mm")) >=
BatasWaktuTunggu Then
Exit For
End If
Dim BExtract = PermutasiDikurangi(TipeList.ListNumerik, A(i))
If BExtract.Count > 0 Then
Dim B As New List(Of String)
SyncLock Kunci2
B = Permutasi(2, BExtract)
End SyncLock
If B.Count > 0 AndAlso B.First "" Then
For j = 0 To B.Count - 1
If Not AktifCPU Or CPUPlaceSet Or
CInt(TimeSpan.FromSeconds(WaktuTungguBerjalan).ToString("mm")) >=
BatasWaktuTunggu Then
Exit For
End If
Dim CExtract = PermutasiDikurangi(TipeList.ListNumerik,
A(i) & B(j))
If CExtract.Count > 0 Then
Dim C As New List(Of String)
SyncLock Kunci3
C = Permutasi(2, CExtract)
End SyncLock
If C.Count > 0 AndAlso C.First "" Then
For k = 0 To C.Count - 1
If Not AktifCPU Or CPUPlaceSet Or
CInt(TimeSpan.FromSeconds(WaktuTungguBerjalan).ToString("mm")) >=
BatasWaktuTunggu Then
Exit For
65
End If
For Each OP In TipeList.ListOperator
'If Not
OPTerpakai.ToString.Contains(OP) Then
Select Case OP
Case "+"
If CDbl(A(i).Replace("/", ""))
+ CDbl(B(j).Replace("/", "")) = CDbl(C(k).Replace("/", "")) Then
'OPTerpakai.Append(OP)
Dim tempstr As
StringBuilder = New StringBuilder
tempstr.Append(A(i).Replace("/", ""))
tempstr.Append("+")
tempstr.Append(B(j).Replace("/", ""))
tempstr.Append("=")
tempstr.Append(C(k).Replace("/", ""))
Dim Arr() As Char =
tempstr.ToString.ToCharArray
Dim TN As Integer = 0
For Each Ar In Arr
If Integer.TryParse(Ar,
0) Then
TN += Val(Ar)
End If
Next
CekKePapanPermainan(tempstr.ToString, KandidatSource, Kpbntu, IsHorizontal,
TileYangDipegang, TileBoard, loopState)
End If
Case "-"
If CDbl(A(i).Replace("/", ""))
- CDbl(B(j).Replace("/", "")) = CDbl(C(k).Replace("/", "")) Then
'OPTerpakai.Append(OP)
Dim tempstr As
StringBuilder = New StringBuilder
tempstr.Append(A(i).Replace("/", ""))
tempstr.Append("-")
tempstr.Append(B(j).Replace("/", ""))
tempstr.Append("=")
tempstr.Append(C(k).Replace("/", ""))
Dim Arr() As Char =
tempstr.ToString.ToCharArray
Dim TN As Integer = 0
For Each Ar In Arr
If Integer.TryParse(Ar,
0) Then
TN += Val(Ar)
End If
Next
CekKePapanPermainan(tempstr.ToString, KandidatSource, Kpbntu, IsHorizontal,
TileYangDipegang, TileBoard, loopState)
End If
Case "x"
66
If CDbl(A(i).Replace("/", ""))
* CDbl(B(j).Replace("/", "")) = CDbl(C(k).Replace("/", "")) Then
'OPTerpakai.Append(OP)
Dim tempstr As
StringBuilder = New StringBuilder
tempstr.Append(A(i).Replace("/", ""))
tempstr.Append("x")
tempstr.Append(B(j).Replace("/", ""))
tempstr.Append("=")
tempstr.Append(C(k).Replace("/", ""))
Dim Arr() As Char =
tempstr.ToString.ToCharArray
Dim TN As Integer = 0
For Each Ar In Arr
If Integer.TryParse(Ar,
0) Then
TN += Val(Ar)
End If
Next
CekKePapanPermainan(tempstr.ToString, KandidatSource, Kpbntu, IsHorizontal,
TileYangDipegang, TileBoard, loopState)
End If
Case ":"
If CDbl(A(i).Replace("/", ""))
/ CDbl(B(j).Replace("/", "")) = CDbl(C(k).Replace("/", "")) Then
'OPTerpakai.Append(OP)
Dim tempstr As
StringBuilder = New StringBuilder
tempstr.Append(A(i).Replace("/", ""))
tempstr.Append(":")
tempstr.Append(B(j).Replace("/", ""))
tempstr.Append("=")
tempstr.Append(C(k).Replace("/", ""))
Dim Arr() As Char =
tempstr.ToString.ToCharArray
Dim TN As Integer = 0
For Each Ar In Arr
If Integer.TryParse(Ar,
0) Then
TN += Val(Ar)
End If
Next
CekKePapanPermainan(tempstr.ToString, KandidatSource, Kpbntu, IsHorizontal,
TileYangDipegang, TileBoard, loopState)
End If
End Select
'End If
Next
Next
End If
End If
Next
End If
67
End If
Next
End Sub
Friend Function Permutasi(NPermutasi As Integer, Data() As String) As
List(Of String)
Dim DPermutasi As New List(Of String)
Dim Layak As Boolean
If Not Data Is Nothing AndAlso Data.Count > 0 Then
For n = NPermutasi To 0 Step -1
Dim Banyak(n) As Integer
Dim FPermutasi As Boolean = True
Do
SusunPermutasi(FPermutasi, Banyak, DPermutasi, Data, Layak)
If FPermutasi = False Then
Exit Do
End If
Loop
Next
End If
Return DPermutasi
End Function
Private Sub SusunPermutasi(ByRef FPermutasi As Boolean, ByRef Banyak() As
Integer, ByRef DPermutasi As List(Of String), ByVal Data() As String, ByVal
Layak As Boolean)
If FPermutasi Then
Layak = True
If Banyak.Count > 1 Then
For i = 0 To Banyak.Count - 1
If i < Banyak.Count - 1 Then
If (Banyak(i)) = (Banyak(i + 1)) Then
Layak = False
End If
Else
If (Banyak(i)) = (Banyak(0)) Then
Layak = False
End If
End If
If Layak = False Then
Exit For
End If
Next
End If
Dim TemP As New StringBuilder
If Layak = True Then
For d = Banyak.Count - 1 To 0 Step -1
TemP.Append(Data(Banyak(d)))
TemP.Append("/")
Next
If TemP.ToString = "0/" Then
Dim asda = TemP
End If
If TemP.ToString.Length 1
AndAlso TemP.ToString.Substring(0, 1) "0") Then
DPermutasi.Add(TemP.ToString)
End If
End If
For i = 0 To Banyak.Count - 1
68
If i > 0 Then
If Banyak(i - 1) > Data.Count - 1 Then
Banyak(i) += 1
Banyak(i - 1) = 0
End If
Else
Banyak(i) += 1
End If
If Banyak(Banyak.Count - 1) > Data.Count - 1 Then
FPermutasi = False
End If
Next
End If
End Sub
Private Sub CekKePapanPermainan(Solusi As String, KandidatSource As
GamePlay.KandidatCPUBaseKoordinat, KPbntu As List(Of Vector2), IsHorizontal As
Boolean, TileYangDipegang As TileBoard(), TileBoard As TileBoard(,), loopState
As ParallelLoopState)
Dim avb = AvaibleFormula(Solusi, KandidatSource, KPbntu, TileBoard)
Dim Cocok As Boolean = False
If avb >= 0 Then
Cocok = KelayakanCPU(avb, KandidatSource.Koordinat, Solusi, KPbntu,
IsHorizontal, TileYangDipegang, TileBoard)
End If
If Cocok Then
SyncLock Kunci
If AktifCPU And Not CPUPlaceSet Then
If Not loopState.ShouldExitCurrentIteration Then
CPU_LetakHasilTervalidasi(avb,
KandidatSource.Koordinat, Solusi, IsHorizontal, TileYangDipegang, TileBoard)
loopState.Stop()
CPUPlaceSet = True
End If
End If
End SyncLock
End If
End Sub
Private Function AvaibleFormula(HasilSolusi As String, KandidatSource As
GamePlay.KandidatCPUBaseKoordinat, KPembantu As List(Of Vector2), TileBoard As
TileBoard(,)) As Integer
Dim HslTemp = HasilSolusi.ToList
Dim indeks = -1
For Each c In HasilSolusi.ToList
If c = TileBoard(KandidatSource.Koordinat.X,
KandidatSource.Koordinat.Y).CharValue Then
indeks = HslTemp.IndexOf(c)
'cTemp.Remove(c)
Exit For
End If
Next
Return indeks
End Function
Private Function KelayakanCPU(avb As UInt16, Koordinat As Vector2, Solusi
As String, KPembantu As List(Of Vector2), IsBaris As Boolean, Player As
TileBoard(), TileBoard As TileBoard(,)) As Boolean
Dim Cocok As Boolean = False
Dim Kpem = KPembantu
69
Dim Sol As List(Of Char) = Solusi.ToList
Dim Plyr = Player.ToList
If AktifCPU Then
If avb = 0 Then
If If(IsBaris, Koordinat.Y, Koordinat.X) - 1 >= 0 Then
If TileBoard(Koordinat.X - If(Not IsBaris, 1, 0),
Koordinat.Y - If(IsBaris, 1, 0)).Value 127 Then
Return False
End If
End If
End If
'Batas Atas
If avb - 1 >= 0 And If(IsBaris, Koordinat.Y, Koordinat.X) - 1 >= 0
Then
For i = avb - 1 To 0 Step -1
If i = 0 Then
If If(IsBaris, Koordinat.Y, Koordinat.X) - (avb + 1 i) >= 0 Then
If TileBoard(Koordinat.X - If(Not IsBaris, (avb + 1
- i), 0), Koordinat.Y - If(IsBaris, (avb + 1 - i), 0)).Value 127 Then
Return False
End If
End If
End If
'Cek Kpembantu (Tile yang telah ada dipapan permainan)
For Each k In Kpem
If Solusi(i) = TileBoard(k.X, k.Y).CharValue And
If(IsBaris, Koordinat.Y - k.Y, Koordinat.X - k.X) = avb - i Then
Kpem.Remove(k)
Sol.Remove(Solusi(i))
i -= 1
Exit For
End If
Next
If i = 0 Then
If If(IsBaris, Koordinat.Y, Koordinat.X) - (avb + 1 i) >= 0 Then
If TileBoard(Koordinat.X - If(Not IsBaris, (avb + 1
- i), 0), Koordinat.Y - If(IsBaris, (avb + 1 - i), 0)).Value 127 Then
Return False
End If
End If
End If
If i < 0 Then
Continue For
End If
'Cek Tile yang ada ditangan Player CPU
For Each p In Plyr
If (Solusi(i) = p.CharValue And If(IsBaris,
Koordinat.Y, Koordinat.X) - (avb - i) >= 0) AndAlso
(TileBoard(Koordinat.X - If(Not IsBaris, (avb i), 0), Koordinat.Y - If(IsBaris, (avb - i), 0)).Value = 127 And
Not TileBoard(Koordinat.X - If(Not IsBaris,
(avb - i), 0), Koordinat.Y - If(IsBaris, (avb - i), 0)).IsBlocked) Then
Plyr.Remove(p)
Sol.Remove(Solusi(i))
Exit For
70
End If
Next
Next
End If
If avb = Solusi.Length - 1 Then
If If(IsBaris, Koordinat.Y, Koordinat.X) + 1 <
TileBoard.GetLength(0) Then
If TileBoard(Koordinat.X + If(Not IsBaris, 1, 0),
Koordinat.Y + If(IsBaris, 1, 0)).Value 127 Then
Return False
End If
End If
End If
'Batas Bawah
If avb + 1 < Solusi.Length And If(IsBaris, Koordinat.Y,
Koordinat.X) + 1 < TileBoard.GetLength(0) Then
For i = avb + 1 To Solusi.Length - 1
If i = Solusi.Length - 1 Then
If If(IsBaris, Koordinat.Y, Koordinat.X) + (i + 1 avb) < TileBoard.GetLength(0) Then
If TileBoard(Koordinat.X + If(Not IsBaris, (i + 1 avb), 0), Koordinat.Y + If(IsBaris, (i + 1 - avb), 0)).Value 127 Then
Return False
End If
End If
End If
'Cek Kpembantu (Tile yang telah ada dipapan permainan)
For Each k In Kpem
If Solusi(i) = TileBoard(k.X, k.Y).CharValue And
If(IsBaris, k.Y - Koordinat.Y, k.X - Koordinat.X) = i - avb Then
Kpem.Remove(k)
Sol.Remove(Solusi(i))
i += 1
Exit For
End If
Next
If i = Solusi.Length - 1 Then
If If(IsBaris, Koordinat.Y, Koordinat.X) + (i + 1 avb) < TileBoard.GetLength(0) Then
If TileBoard(Koordinat.X + If(Not IsBaris, (i + 1 avb), 0), Koordinat.Y + If(IsBaris, (i + 1 - avb), 0)).Value 127 Then
Return False
End If
End If
End If
If i >= Solusi.Length Then
Continue For
End If
'Cek Tile yang ada ditangan Player CPU
For Each p In Plyr
If (Solusi(i) = p.CharValue And If(IsBaris,
Koordinat.Y, Koordinat.X) + (i - avb) < TileBoard.GetLength(0)) AndAlso
(TileBoard(Koordinat.X + If(Not IsBaris, i avb, 0), Koordinat.Y + If(IsBaris, i - avb, 0)).Value = 127 And
Not TileBoard(Koordinat.X + If(Not IsBaris,
i - avb, 0), Koordinat.Y + If(IsBaris, i - avb, 0)).IsBlocked) Then
71
Plyr.Remove(p)
Sol.Remove(Solusi(i))
Exit For
End If
Next
Next
End If
If Sol.Count = 1 Then
Cocok = True
End If
End If
Return Cocok
End Function
Private Sub CPU_LetakHasilTervalidasi(avb As UInt16, Koordinat As Vector2,
Solusi As String, IsHorizontal As Boolean, TileYangDipegang As TileBoard(),
TileBoard As TileBoard(,))
Dim Plye = TileYangDipegang.ToArray
'Batas Atas
If avb - 1 >= 0 And If(IsHorizontal, Koordinat.Y, Koordinat.X) - 1 >= 0
Then
For i = avb - 1 To 0 Step -1
'Letak Tile yang ada ditangan Player CPU ke papan permainan
For Each p In Plye
If Not p.IsBlocked Then
If (Solusi(i) = p.CharValue And If(IsHorizontal,
Koordinat.Y, Koordinat.X) - (avb - i) >= 0) AndAlso
(TileBoard(Koordinat.X - If(Not IsHorizontal, (avb
- i), 0), Koordinat.Y - If(IsHorizontal, (avb - i), 0)).Value = 127 And
Not TileBoard(Koordinat.X - If(Not IsHorizontal,
(avb - i), 0), Koordinat.Y - If(IsHorizontal, (avb - i), 0)).IsBlocked) Then
p.IsBlocked = True
TileYangDipegang(Array.IndexOf(Plye, p)).IsBlocked
= True
TileBoard(Koordinat.X - If(Not IsHorizontal, (avb i), 0), Koordinat.Y - If(IsHorizontal, (avb - i), 0)).Value = p.Value
Exit For
End If
End If
Next
Next
End If
'Batas Bawah
If avb + 1 < Solusi.Length And If(IsHorizontal, Koordinat.Y,
Koordinat.X) + 1 < TileBoard.GetLength(0) Then
For i = avb + 1 To Solusi.Length - 1
'Letak Tile yang ada ditangan Player CPU ke papan permainan
For Each p In Plye
If Not p.IsBlocked Then
If (Solusi(i) = p.CharValue And If(IsHorizontal,
Koordinat.Y, Koordinat.X) + (i - avb) < TileBoard.GetLength(0)) AndAlso
(TileBoard(Koordinat.X + If(Not IsHorizontal, i
- avb, 0), Koordinat.Y + If(IsHorizontal, i - avb, 0)).Value = 127 And
Not TileBoard(Koordinat.X + If(Not IsHorizontal,
i - avb, 0), Koordinat.Y + If(IsHorizontal, i - avb, 0)).IsBlocked) Then
p.IsBlocked = True
TileYangDipegang(Array.IndexOf(Plye, p)).IsBlocked
= True
TileBoard(Koordinat.X + If(Not IsHorizontal, i avb, 0), Koordinat.Y + If(IsHorizontal, i - avb, 0)).Value = p.Value
72
Exit For
End If
End If
Next
Next
End If
End Sub
End Class
73
(REZA HIDAYAT BAYU PRABOWO)
DATA PRIBADI
Nama Lengkap
: Reza Hidayat Bayu Prabowo
Nama Panggilan
: Reza
Tempat/Tanggal Lahir: Labuhan Deli / 19 Januari 1991
Jenis Kelamin
: Pria
Agama
: Islam
Warga Negara
: Indonesia
Alamat
: Jl. Seser No. 48, Medan
HP
E-mail
Status
: 081534974535
: [email protected]
: belum menikah
RIWAYAT PENDIDIKAN
Sekolah Menengah Atas
SMA Negeri 3 Medan
2005-2008
Sekolah Menengah Pertama
SMP Negeri 45 Medan
2002-2005
Sekolah Dasar
SD Negeri 066657 Medan
1996-2002
KEMAMPUAN KOMPUTER
Programming: C++, C#, VB.Net
Database
: MySQL
IDE
: Visual Studio 2015, Visual Studio Code
Software
: Ms. Office
Game Engine : XNA Framework, Monogame
74
PENGALAMAN KERJA
No
1
Instansi/Lembaga
Freelancer
Jabatan/Posisi
Tahun
Programmer
2013-2015
SEMINAR
No.
Seminar
Tahun
1
Seminar Demo Software dan Diskusi Panel Integrasi Agent Based Model
(ABM) dan Geographic Information System (GIS)
2011
2
Seminar Nasional Creative Animation dan Gaming Industry
2013
LAMPIRAN A
LAMPIRAN HASIL EVALUASI GAME SUMMY DENGAN METODE BLACK
BOX TESTING
a. Hasil evaluasi pada Tampilan Halaman Menu Utama
Tabel Hasil Evaluasi Tampilan Halaman Menu Utama
No.
1.
2.
3.
4.
5.
Sasaran
Pengujian
Tampilan
ketika
aplikasi
dieksekusi
Pemilihan
menu Mulai
Pemilihan
menu
Bantuan
Pemilihan
menu
Tentang
Pemilihan
menu
Keluar
Hasil yang
Diharapkan
Aplikasi
menampilkan
halaman Menu
Utama
Aplikasi
menampilkan
halaman Games
Aplikasi
menampilkan
halaman Bantuan
Aplikasi
menampilkan
halaman Tentang
Aplikasi berhenti
Hasil Pengujian
Kesimpulan
Aplikasi berhasil
menampilkan
halaman Menu
Utama
Aplikasi berhasil
menampilkan
halaman Games
Aplikasi berhasil
menampilkan
halaman Bantuan
Aplikasi berhasil
menampilkan
halaman Tentang
Aplikasi berhasil
berhenti
Valid
Valid
Valid
Valid
Valid
b. Hasil Evaluasi pada Tampilan Halaman Game
Tabel Hasil Evaluasi Tampilan Halaman Game
No.
1.
2.
Sasaran
Pengujian
Giliran awal
bermain
Selot kotakkotak milik
pemain dan
komputer
Hasil yang
Diharapkan
Aplikasi
mengacak giliran
bermain pada awal
halaman Game
ditampilkan
Aplikasi
membagikan
masing-masing 8
kotak untuk
Hasil Pengujian
Kesimpulan
Aplikasi berhasil
mengacak giliran
bermain dan
menampilkan
pesannya di layar
Aplikasi berhasil
membagikan
masing-masing 8
kotak untuk
pemain dan
Valid
Valid
48
pemain dan
komputer
3.
Selot kotakkotak milik
pemain
4.
Pemilihan
menu Swap
/ Delete
5.
Pemilihan
menu
Cancel
6.
Pemilihan
menu Next /
End Turn
Pemain dapat
memindahkan
kotak-kotak
miliknya ke papan
game pada saat
gilirannya
Pemain dapat
mengganti satu
atau semua kotakkotak miliknya
dengan kotak yang
ada pada
tumpukkan pada
saat gilirannya
Pemain dapat
mengembalikan
kotak miliknya
yang baru saja
diletakkan pada
papan game ke
selot miliknya
pada saat
gilirannya
Pemain dapat
mengakhiri
gilirannya
komputer
ditunjukkan
dengan
berkurangnya
jumlah kotak yang
tersisa
Pemain berhasil
memindahkan
semua kotak dari
selot miliknya ke
papan game pada
saat gilirannya
Pemain berhasil
mengganti satu
atau semua kotak
miliknya dengan
men-drag and
drop kotak
miliknya baik pada
selot maupun yang
baru saja
diletakkan pada
papan game ke
atas menu swap /
delete pada saat
gilirannya
Pemain berhasil
mengembalikan
kotak miliknya
yang baru saja
diletakkan pada
papan game ke
selot miliknya
pada saat
gilirannya
Pemain berhasil
mengakhiri
gilirannya baik
dengan
memberikan
langkah terbaiknya
maupun hanya
untuk skip
gilirannya dengan
muncul pesan
notifikasi berganti
ke giliran
komputer
Valid
Valid
Valid
Valid
49
7.
Komputer
berhasil
menemukan
solusi pada
saat
gilirannya
8.
Komputer
gagal
menemukan
solusi pada
saat
gilirannya
9.
Pengecekan
papan game
setelah
giliran
pemain atau
komputer
berakhir
10.
Skor Game
Komputer dapat
mencari langkah
terbaik dari kotak
miliknya dan
meletakkannya
pada papan game
dan giliran
permainan
berganti ke
pemain
Aplikasi dapat
menampilkan
informasi jika
kesempatan skip
miliknya telah
berkurang 1 kali
dan giliran
permainan
berganti ke
pemain
Aplikasi dapat
mengecek langkah
valid yang telah
dilakukan pemain
atau komputer
sesaat setelah
gilirannya
berakhir.
Komputer berhasil
mencari langkah
terbaik dari kotak
miliknya dan
meletakkannya
pada papan game
dengan muncul
pesan notifikasi
berganti ke giliran
pemain
Aplikasi berhasil
menampilkan
informasi jika
kesempatan skip
milik komputer
telah berkurang 1
kali
Valid
Valid
Aplikasi berhasil
Valid
mengecek langkah
valid yang telah
dilakukan pemain
atau komputer
sesaat setelah
gilirannya
berakhir.
Ditunjukkan
dengan perubahan
warna kotak
menjadi hijau dan
muncul notifikasi
skor yang didapat
Aplikasi dapat
Aplikasi berhasil
Valid
menampilkan total menampilkan total
skor dan skor yang skor dan skor yang
diperoleh pada
diperoleh pada
langkah valid yang langkah valid yang
didapatkan oleh
didapatkan oleh
pemain dan
pemain dan
komputer
komputer sesaat
setelah mengakhiri
gilirannya
50
11.
Pemilihan
menu Home
12.
Semua
kotak pada
tumpukkan
telah habis
Aplikasi dapat
menampilkan
menu pilihan
untuk mengulang
dari awal
permainan atau
kembali ke
halaman Menu
Utama
Aplikasi akan
menghentikan
permainan,
menghitung total
skor yang
didapatkan oleh
pemain dan
komputer dan
menentukan
pemenang
berdasarkan siapa
pemilik total skor
paling besar
Aplikasi berhasil
Valid
menampilkan
menu pilihan
untuk mengulang
dari awal
permainan atau
kembali ke
halaman Menu
Utama
Aplikasi berhasil
Valid
menghentikan
permainan,
menghitung total
skor yang
didapatkan, dan
menampilkan
siapa yang
menjadi pemenang
berdasarkan skor
yang paling besar.
c. Hasil Evaluasi Tampilan Halaman Bantuan
Tabel Hasil Evaluasi Tampilan Halaman Bantuan
No.
1.
2.
Sasaran
Pengujian
Tampilan
halaman
Bantuan
Tutup
halaman
Bantuan
Hasil yang
Diharapkan
Aplikasi dapat
menampilkan
halaman Bantuan
Aplikasi dapat
menutup halaman
Bantuan ketika
area luar halaman
Bantuan diklik
Hasil Pengujian
Kesimpulan
Aplikasi berhasil
menampilkan
halaman Bantuan
Aplikasi berhasil
menutup halaman
Bantuan ketika
area luar halaman
Bantuan diklik
Valid
Valid
51
d. Hasil Evaluasi Tampilan Halaman Tentang
Tabel Hasil Evaluasi Tampilan Halaman Tentang
No.
1.
2.
Sasaran
Pengujian
Tampilan
halaman
Tentang
Tutup
halaman
Bantuan
Hasil yang
Diharapkan
Aplikasi dapat
menampilkan
halaman Tentang
Aplikasi dapat
menutup halaman
Tentang ketika
area luar halaman
Tentang diklik
Hasil Pengujian
Kesimpulan
Aplikasi berhasil
menampilkan
halaman Tentang
Aplikasi dapat
menutup halaman
Tentang ketika
area luar halaman
Tentang diklik
Valid
Valid
e. Hasil Evaluasi Resolusi Layar Monitor terhadap Tampilan Summy
1. Resolusi Layar Monitor 800 x 600 Pixel (Terpotong)
Gambar Tampilan Summy pada resolusi monitor 800 x 600 pixel
52
2. Resolusi Layar Monitor 1024 x 720 Pixel (Terpotong)
Gambar Tampilan Summy pada resolusi monitor 1024 x 720 pixel
3. Resolusi Layar Monitor 1280 x 720 Pixel (Terpotong)
Gambar Tampilan Summy pada resolusi monitor 1280 x 720 pixel
53
4. Resolusi Layar Monitor 1366 x 768 Pixel (Tidak Terpotong)
Gambar Tampilan Summy pada resolusi monitor 1366 x 768 pixel
f. Hasil Evaluasi Performa pada Game Summy
Spesifikasi beberapa komputer yang akan digunakan dalam percobaan adalah
sebagai berikut:
1. Operating System : Windows 7 Ultimate 32-bit SP1
CPU
: Intel Mobile Core 2 Duo T5870 @ 2.00GHz
RAM
: 2,00GB
Motherboard
: ASUSTeK Computer Inc. K40IN
Graphics
: Generic PnP Monitor (1366x768@62Hz)
512MB NVIDIA GeForce G102M
Storage
: 232GB Seagate ST9250315AS ATA Device (SATA)
2. Operating System : Windows 7 Ultimate 64-bit SP1
CPU
: Intel Core i3 2310M @ 2.10GHz
RAM
: 4,00GB Dual-Channel DDR3 @ 665MHz
Motherboard
: ASUSTeK Computer Inc. K43E (CPU 1)
Graphics
: Generic PnP Monitor (1366x768@60Hz)
Intel HD Graphics 3000
Storage
: 465GB TOSHIBA MQ01ABF050 SCSI Disk Device
3. Operating System : Windows 10 Pro 64-bit
54
CPU
: Intel Core i5 4200U @ 1.60GHz
RAM
: 8,00GB Dual-Channel DDR3 @ 798MHz
Motherboard
: ASUSTeK COMPUTER INC. X450LCP
Graphics
: Generic PnP Monitor (1366x768@60Hz)
Intel HD Graphics Family (ASUStek Computer Inc)
2047MB NVIDIA GeForce GT 720M
Storage
: 465GB Hitachi HGST HTS545050A7E680
Tabel Hasil Evaluasi Performa pada Game Summy yang Dicoba pada Beberapa
Komputer Berbeda
Kotak di
tangan
Kotak di papan
Hasil
Bentuk
1,3,5,7,9,+,x,-
=
19x3=57
3,4,5,6,7,8,9,-
=
94-58=36
0,2,4,6,8,x,:,-
=
8-6=2
1,2,3,4,5,6,7,+
=
63+12=75
3,4,5,6,7,8,9,-
0,2,4,6,8,x,:,=
94-58=36
96:48=2
Komputer Waktu
FPS
terendah
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
0,017
0,017
0,017
0,217
0,217
0,200
0,017
0,017
0,017
0,233
0,267
0,217
0,283
0,217
0,167
44
60
60
20
28
32
44
60
60
12
28
56
20
40
60
1
0,170
24
2
0,170
56
3
0,050
56
55
1,3,5,7,9,+,-,=
1,2,3,4,5,6,7,=
4,5,6,7,8,9,=,+
93-78=15
76-45=31
679+5=684
1
0,217
24
2
0,017
32
3
0,017
56
1
1,850
12
2
3,117
20
3
3,567
56
1
1,950
32
2
1,100
48
3
1,433
56
56
LAMPIRAN B
LAMPIRAN PETUNJUK CARA BERMAIN PADA GAME SUMMY
Cara bermain pada game Summy:
1. Pada saat gilirannya bermain, pemain dapat memindahkan kotak dari selot
miliknya ke papan permainan dengan cara melakukan drag and drop.
57
2. Jika pemain ingin menukarkan salah satu kotak miliknya dengan kotak yang
lain, pemain dapat melakukan drag and drop kotak yang dimaksud ke menu
Tukar.
3. Jika pemain ingin mengembalikan kotak yang baru saja diletakkan pada papan
permainan ke selot miliknya lagi, pemain dapat mengklik menu Kembalikan.
58
4. Ketika pemain telah berhasil menyusun bentuk penjumlahan, pengurangan,
perkalian atau pembagian yang valid maka aplikasi akan mengubah warna kotak
tersebut menjadi hijau. Jika tidak valid akan berubah menjadi warna biru.
59
5. Pemain dapat mengakhiri gilirannya jika telah menyusun bentuk yang valid
untuk memperoleh poin atau jika ingin melewati gilirannya dengan cara
mengklik menu Lanjut.
6. Jika giliran pemain berakhir, maka giliran AI bermain. Hal ini ditunjukkan
dengan notifikasi di sudut atas halaman dan area milik pemain akan menjadi
gelap. Begitu pula sebaliknya saat berganti lagi giliran pemain.
60
61
62
7. Pemenang permainan akan ditentukan berdasarkan skor terbanyak yang diraih
saat tidak ada lagi tumpukkan kotak yang tersisa dan pemain dan AI tidak dapat
menyusun bentuk lagi.
63
LAMPIRAN C
LAMPIRAN LISTING PROGRAM
Kode Program Class GreedyProcess:
Imports System.Text
Imports System.Threading.Tasks
Class GreedyProcess
Private Function PermutasiDikurangi(Data() As String, DaftarYangDihapus As
String) As String()
Dim DataKandidat = Data.ToList
Dim Dftr = DaftarYangDihapus.Split("/"c)
For Each dft In Dftr
If dft "" Then
DataKandidat.Remove(dft)
End If
Next
Return DataKandidat.ToArray
End Function
Structure JenisList
Friend ListNumerik() As String
Friend ListOperator() As String
End Structure
Private
Dim
Dim
Dim
Dim
Dim
For
Function PisahNumerik(Data() As String) As JenisList
T As List(Of String) = Data.ToList
D() As String = T.ToArray
TipeList As New JenisList
i = 0
j = 0
Each S In D
If Integer.TryParse(S, 0) Then
ReDim Preserve TipeList.ListNumerik(i)
TipeList.ListNumerik(i) = S
i += 1
Else
ReDim Preserve TipeList.ListOperator(j)
TipeList.ListOperator(j) = S
j += 1
End If
Next
Return TipeList
End Function
Friend Sub SusunKandidatParalelDanSetUpHasil(Data() As String,
KandidatSource As GamePlay.KandidatCPUBaseKoordinat, Kpbntu As List(Of
Vector2), IsHorizontal As Boolean, TileYangDipegang As TileBoard(), TileBoard
As TileBoard(,), loopState As ParallelLoopState)
Dim TempData = Data
If AktifCPU AndAlso Not CPUPlaceSet AndAlso
CInt(TimeSpan.FromSeconds(WaktuTungguBerjalan).ToString("mm")) <
BatasWaktuTunggu Then
Array.Sort(TempData)
64
Array.Reverse(TempData)
If Not TempData Is Nothing AndAlso TempData.Contains("=") And
TempData.Count > 0 Then
'SyncLock kunci
SusunKandidatDanSetUpHasilnya(TempData, KandidatSource, Kpbntu,
IsHorizontal, TileYangDipegang, TileBoard, loopState)
'End SyncLock
End If
End If
End Sub
Private Sub SusunKandidatDanSetUpHasilnya(Data() As String, KandidatSource
As GamePlay.KandidatCPUBaseKoordinat, Kpbntu As List(Of Vector2), IsHorizontal
As Boolean, TileYangDipegang As TileBoard(), TileBoard As TileBoard(,),
loopState As ParallelLoopState)
If Not AktifCPU Then
Exit Sub
End If
Dim TipeList As JenisList = PisahNumerik(Data)
For Each t In TipeList.ListOperator
If t.Count >= 2 Then
Exit Sub
End If
Next
'Dim OPTerpakai As New StringBuilder
Dim A As New List(Of String)
SyncLock Kunci1
A = Permutasi(2, TipeList.ListNumerik)
End SyncLock
For i = 0 To A.Count - 1
If Not AktifCPU Or CPUPlaceSet Or
CInt(TimeSpan.FromSeconds(WaktuTungguBerjalan).ToString("mm")) >=
BatasWaktuTunggu Then
Exit For
End If
Dim BExtract = PermutasiDikurangi(TipeList.ListNumerik, A(i))
If BExtract.Count > 0 Then
Dim B As New List(Of String)
SyncLock Kunci2
B = Permutasi(2, BExtract)
End SyncLock
If B.Count > 0 AndAlso B.First "" Then
For j = 0 To B.Count - 1
If Not AktifCPU Or CPUPlaceSet Or
CInt(TimeSpan.FromSeconds(WaktuTungguBerjalan).ToString("mm")) >=
BatasWaktuTunggu Then
Exit For
End If
Dim CExtract = PermutasiDikurangi(TipeList.ListNumerik,
A(i) & B(j))
If CExtract.Count > 0 Then
Dim C As New List(Of String)
SyncLock Kunci3
C = Permutasi(2, CExtract)
End SyncLock
If C.Count > 0 AndAlso C.First "" Then
For k = 0 To C.Count - 1
If Not AktifCPU Or CPUPlaceSet Or
CInt(TimeSpan.FromSeconds(WaktuTungguBerjalan).ToString("mm")) >=
BatasWaktuTunggu Then
Exit For
65
End If
For Each OP In TipeList.ListOperator
'If Not
OPTerpakai.ToString.Contains(OP) Then
Select Case OP
Case "+"
If CDbl(A(i).Replace("/", ""))
+ CDbl(B(j).Replace("/", "")) = CDbl(C(k).Replace("/", "")) Then
'OPTerpakai.Append(OP)
Dim tempstr As
StringBuilder = New StringBuilder
tempstr.Append(A(i).Replace("/", ""))
tempstr.Append("+")
tempstr.Append(B(j).Replace("/", ""))
tempstr.Append("=")
tempstr.Append(C(k).Replace("/", ""))
Dim Arr() As Char =
tempstr.ToString.ToCharArray
Dim TN As Integer = 0
For Each Ar In Arr
If Integer.TryParse(Ar,
0) Then
TN += Val(Ar)
End If
Next
CekKePapanPermainan(tempstr.ToString, KandidatSource, Kpbntu, IsHorizontal,
TileYangDipegang, TileBoard, loopState)
End If
Case "-"
If CDbl(A(i).Replace("/", ""))
- CDbl(B(j).Replace("/", "")) = CDbl(C(k).Replace("/", "")) Then
'OPTerpakai.Append(OP)
Dim tempstr As
StringBuilder = New StringBuilder
tempstr.Append(A(i).Replace("/", ""))
tempstr.Append("-")
tempstr.Append(B(j).Replace("/", ""))
tempstr.Append("=")
tempstr.Append(C(k).Replace("/", ""))
Dim Arr() As Char =
tempstr.ToString.ToCharArray
Dim TN As Integer = 0
For Each Ar In Arr
If Integer.TryParse(Ar,
0) Then
TN += Val(Ar)
End If
Next
CekKePapanPermainan(tempstr.ToString, KandidatSource, Kpbntu, IsHorizontal,
TileYangDipegang, TileBoard, loopState)
End If
Case "x"
66
If CDbl(A(i).Replace("/", ""))
* CDbl(B(j).Replace("/", "")) = CDbl(C(k).Replace("/", "")) Then
'OPTerpakai.Append(OP)
Dim tempstr As
StringBuilder = New StringBuilder
tempstr.Append(A(i).Replace("/", ""))
tempstr.Append("x")
tempstr.Append(B(j).Replace("/", ""))
tempstr.Append("=")
tempstr.Append(C(k).Replace("/", ""))
Dim Arr() As Char =
tempstr.ToString.ToCharArray
Dim TN As Integer = 0
For Each Ar In Arr
If Integer.TryParse(Ar,
0) Then
TN += Val(Ar)
End If
Next
CekKePapanPermainan(tempstr.ToString, KandidatSource, Kpbntu, IsHorizontal,
TileYangDipegang, TileBoard, loopState)
End If
Case ":"
If CDbl(A(i).Replace("/", ""))
/ CDbl(B(j).Replace("/", "")) = CDbl(C(k).Replace("/", "")) Then
'OPTerpakai.Append(OP)
Dim tempstr As
StringBuilder = New StringBuilder
tempstr.Append(A(i).Replace("/", ""))
tempstr.Append(":")
tempstr.Append(B(j).Replace("/", ""))
tempstr.Append("=")
tempstr.Append(C(k).Replace("/", ""))
Dim Arr() As Char =
tempstr.ToString.ToCharArray
Dim TN As Integer = 0
For Each Ar In Arr
If Integer.TryParse(Ar,
0) Then
TN += Val(Ar)
End If
Next
CekKePapanPermainan(tempstr.ToString, KandidatSource, Kpbntu, IsHorizontal,
TileYangDipegang, TileBoard, loopState)
End If
End Select
'End If
Next
Next
End If
End If
Next
End If
67
End If
Next
End Sub
Friend Function Permutasi(NPermutasi As Integer, Data() As String) As
List(Of String)
Dim DPermutasi As New List(Of String)
Dim Layak As Boolean
If Not Data Is Nothing AndAlso Data.Count > 0 Then
For n = NPermutasi To 0 Step -1
Dim Banyak(n) As Integer
Dim FPermutasi As Boolean = True
Do
SusunPermutasi(FPermutasi, Banyak, DPermutasi, Data, Layak)
If FPermutasi = False Then
Exit Do
End If
Loop
Next
End If
Return DPermutasi
End Function
Private Sub SusunPermutasi(ByRef FPermutasi As Boolean, ByRef Banyak() As
Integer, ByRef DPermutasi As List(Of String), ByVal Data() As String, ByVal
Layak As Boolean)
If FPermutasi Then
Layak = True
If Banyak.Count > 1 Then
For i = 0 To Banyak.Count - 1
If i < Banyak.Count - 1 Then
If (Banyak(i)) = (Banyak(i + 1)) Then
Layak = False
End If
Else
If (Banyak(i)) = (Banyak(0)) Then
Layak = False
End If
End If
If Layak = False Then
Exit For
End If
Next
End If
Dim TemP As New StringBuilder
If Layak = True Then
For d = Banyak.Count - 1 To 0 Step -1
TemP.Append(Data(Banyak(d)))
TemP.Append("/")
Next
If TemP.ToString = "0/" Then
Dim asda = TemP
End If
If TemP.ToString.Length 1
AndAlso TemP.ToString.Substring(0, 1) "0") Then
DPermutasi.Add(TemP.ToString)
End If
End If
For i = 0 To Banyak.Count - 1
68
If i > 0 Then
If Banyak(i - 1) > Data.Count - 1 Then
Banyak(i) += 1
Banyak(i - 1) = 0
End If
Else
Banyak(i) += 1
End If
If Banyak(Banyak.Count - 1) > Data.Count - 1 Then
FPermutasi = False
End If
Next
End If
End Sub
Private Sub CekKePapanPermainan(Solusi As String, KandidatSource As
GamePlay.KandidatCPUBaseKoordinat, KPbntu As List(Of Vector2), IsHorizontal As
Boolean, TileYangDipegang As TileBoard(), TileBoard As TileBoard(,), loopState
As ParallelLoopState)
Dim avb = AvaibleFormula(Solusi, KandidatSource, KPbntu, TileBoard)
Dim Cocok As Boolean = False
If avb >= 0 Then
Cocok = KelayakanCPU(avb, KandidatSource.Koordinat, Solusi, KPbntu,
IsHorizontal, TileYangDipegang, TileBoard)
End If
If Cocok Then
SyncLock Kunci
If AktifCPU And Not CPUPlaceSet Then
If Not loopState.ShouldExitCurrentIteration Then
CPU_LetakHasilTervalidasi(avb,
KandidatSource.Koordinat, Solusi, IsHorizontal, TileYangDipegang, TileBoard)
loopState.Stop()
CPUPlaceSet = True
End If
End If
End SyncLock
End If
End Sub
Private Function AvaibleFormula(HasilSolusi As String, KandidatSource As
GamePlay.KandidatCPUBaseKoordinat, KPembantu As List(Of Vector2), TileBoard As
TileBoard(,)) As Integer
Dim HslTemp = HasilSolusi.ToList
Dim indeks = -1
For Each c In HasilSolusi.ToList
If c = TileBoard(KandidatSource.Koordinat.X,
KandidatSource.Koordinat.Y).CharValue Then
indeks = HslTemp.IndexOf(c)
'cTemp.Remove(c)
Exit For
End If
Next
Return indeks
End Function
Private Function KelayakanCPU(avb As UInt16, Koordinat As Vector2, Solusi
As String, KPembantu As List(Of Vector2), IsBaris As Boolean, Player As
TileBoard(), TileBoard As TileBoard(,)) As Boolean
Dim Cocok As Boolean = False
Dim Kpem = KPembantu
69
Dim Sol As List(Of Char) = Solusi.ToList
Dim Plyr = Player.ToList
If AktifCPU Then
If avb = 0 Then
If If(IsBaris, Koordinat.Y, Koordinat.X) - 1 >= 0 Then
If TileBoard(Koordinat.X - If(Not IsBaris, 1, 0),
Koordinat.Y - If(IsBaris, 1, 0)).Value 127 Then
Return False
End If
End If
End If
'Batas Atas
If avb - 1 >= 0 And If(IsBaris, Koordinat.Y, Koordinat.X) - 1 >= 0
Then
For i = avb - 1 To 0 Step -1
If i = 0 Then
If If(IsBaris, Koordinat.Y, Koordinat.X) - (avb + 1 i) >= 0 Then
If TileBoard(Koordinat.X - If(Not IsBaris, (avb + 1
- i), 0), Koordinat.Y - If(IsBaris, (avb + 1 - i), 0)).Value 127 Then
Return False
End If
End If
End If
'Cek Kpembantu (Tile yang telah ada dipapan permainan)
For Each k In Kpem
If Solusi(i) = TileBoard(k.X, k.Y).CharValue And
If(IsBaris, Koordinat.Y - k.Y, Koordinat.X - k.X) = avb - i Then
Kpem.Remove(k)
Sol.Remove(Solusi(i))
i -= 1
Exit For
End If
Next
If i = 0 Then
If If(IsBaris, Koordinat.Y, Koordinat.X) - (avb + 1 i) >= 0 Then
If TileBoard(Koordinat.X - If(Not IsBaris, (avb + 1
- i), 0), Koordinat.Y - If(IsBaris, (avb + 1 - i), 0)).Value 127 Then
Return False
End If
End If
End If
If i < 0 Then
Continue For
End If
'Cek Tile yang ada ditangan Player CPU
For Each p In Plyr
If (Solusi(i) = p.CharValue And If(IsBaris,
Koordinat.Y, Koordinat.X) - (avb - i) >= 0) AndAlso
(TileBoard(Koordinat.X - If(Not IsBaris, (avb i), 0), Koordinat.Y - If(IsBaris, (avb - i), 0)).Value = 127 And
Not TileBoard(Koordinat.X - If(Not IsBaris,
(avb - i), 0), Koordinat.Y - If(IsBaris, (avb - i), 0)).IsBlocked) Then
Plyr.Remove(p)
Sol.Remove(Solusi(i))
Exit For
70
End If
Next
Next
End If
If avb = Solusi.Length - 1 Then
If If(IsBaris, Koordinat.Y, Koordinat.X) + 1 <
TileBoard.GetLength(0) Then
If TileBoard(Koordinat.X + If(Not IsBaris, 1, 0),
Koordinat.Y + If(IsBaris, 1, 0)).Value 127 Then
Return False
End If
End If
End If
'Batas Bawah
If avb + 1 < Solusi.Length And If(IsBaris, Koordinat.Y,
Koordinat.X) + 1 < TileBoard.GetLength(0) Then
For i = avb + 1 To Solusi.Length - 1
If i = Solusi.Length - 1 Then
If If(IsBaris, Koordinat.Y, Koordinat.X) + (i + 1 avb) < TileBoard.GetLength(0) Then
If TileBoard(Koordinat.X + If(Not IsBaris, (i + 1 avb), 0), Koordinat.Y + If(IsBaris, (i + 1 - avb), 0)).Value 127 Then
Return False
End If
End If
End If
'Cek Kpembantu (Tile yang telah ada dipapan permainan)
For Each k In Kpem
If Solusi(i) = TileBoard(k.X, k.Y).CharValue And
If(IsBaris, k.Y - Koordinat.Y, k.X - Koordinat.X) = i - avb Then
Kpem.Remove(k)
Sol.Remove(Solusi(i))
i += 1
Exit For
End If
Next
If i = Solusi.Length - 1 Then
If If(IsBaris, Koordinat.Y, Koordinat.X) + (i + 1 avb) < TileBoard.GetLength(0) Then
If TileBoard(Koordinat.X + If(Not IsBaris, (i + 1 avb), 0), Koordinat.Y + If(IsBaris, (i + 1 - avb), 0)).Value 127 Then
Return False
End If
End If
End If
If i >= Solusi.Length Then
Continue For
End If
'Cek Tile yang ada ditangan Player CPU
For Each p In Plyr
If (Solusi(i) = p.CharValue And If(IsBaris,
Koordinat.Y, Koordinat.X) + (i - avb) < TileBoard.GetLength(0)) AndAlso
(TileBoard(Koordinat.X + If(Not IsBaris, i avb, 0), Koordinat.Y + If(IsBaris, i - avb, 0)).Value = 127 And
Not TileBoard(Koordinat.X + If(Not IsBaris,
i - avb, 0), Koordinat.Y + If(IsBaris, i - avb, 0)).IsBlocked) Then
71
Plyr.Remove(p)
Sol.Remove(Solusi(i))
Exit For
End If
Next
Next
End If
If Sol.Count = 1 Then
Cocok = True
End If
End If
Return Cocok
End Function
Private Sub CPU_LetakHasilTervalidasi(avb As UInt16, Koordinat As Vector2,
Solusi As String, IsHorizontal As Boolean, TileYangDipegang As TileBoard(),
TileBoard As TileBoard(,))
Dim Plye = TileYangDipegang.ToArray
'Batas Atas
If avb - 1 >= 0 And If(IsHorizontal, Koordinat.Y, Koordinat.X) - 1 >= 0
Then
For i = avb - 1 To 0 Step -1
'Letak Tile yang ada ditangan Player CPU ke papan permainan
For Each p In Plye
If Not p.IsBlocked Then
If (Solusi(i) = p.CharValue And If(IsHorizontal,
Koordinat.Y, Koordinat.X) - (avb - i) >= 0) AndAlso
(TileBoard(Koordinat.X - If(Not IsHorizontal, (avb
- i), 0), Koordinat.Y - If(IsHorizontal, (avb - i), 0)).Value = 127 And
Not TileBoard(Koordinat.X - If(Not IsHorizontal,
(avb - i), 0), Koordinat.Y - If(IsHorizontal, (avb - i), 0)).IsBlocked) Then
p.IsBlocked = True
TileYangDipegang(Array.IndexOf(Plye, p)).IsBlocked
= True
TileBoard(Koordinat.X - If(Not IsHorizontal, (avb i), 0), Koordinat.Y - If(IsHorizontal, (avb - i), 0)).Value = p.Value
Exit For
End If
End If
Next
Next
End If
'Batas Bawah
If avb + 1 < Solusi.Length And If(IsHorizontal, Koordinat.Y,
Koordinat.X) + 1 < TileBoard.GetLength(0) Then
For i = avb + 1 To Solusi.Length - 1
'Letak Tile yang ada ditangan Player CPU ke papan permainan
For Each p In Plye
If Not p.IsBlocked Then
If (Solusi(i) = p.CharValue And If(IsHorizontal,
Koordinat.Y, Koordinat.X) + (i - avb) < TileBoard.GetLength(0)) AndAlso
(TileBoard(Koordinat.X + If(Not IsHorizontal, i
- avb, 0), Koordinat.Y + If(IsHorizontal, i - avb, 0)).Value = 127 And
Not TileBoard(Koordinat.X + If(Not IsHorizontal,
i - avb, 0), Koordinat.Y + If(IsHorizontal, i - avb, 0)).IsBlocked) Then
p.IsBlocked = True
TileYangDipegang(Array.IndexOf(Plye, p)).IsBlocked
= True
TileBoard(Koordinat.X + If(Not IsHorizontal, i avb, 0), Koordinat.Y + If(IsHorizontal, i - avb, 0)).Value = p.Value
72
Exit For
End If
End If
Next
Next
End If
End Sub
End Class
73
(REZA HIDAYAT BAYU PRABOWO)
DATA PRIBADI
Nama Lengkap
: Reza Hidayat Bayu Prabowo
Nama Panggilan
: Reza
Tempat/Tanggal Lahir: Labuhan Deli / 19 Januari 1991
Jenis Kelamin
: Pria
Agama
: Islam
Warga Negara
: Indonesia
Alamat
: Jl. Seser No. 48, Medan
HP
Status
: 081534974535
: [email protected]
: belum menikah
RIWAYAT PENDIDIKAN
Sekolah Menengah Atas
SMA Negeri 3 Medan
2005-2008
Sekolah Menengah Pertama
SMP Negeri 45 Medan
2002-2005
Sekolah Dasar
SD Negeri 066657 Medan
1996-2002
KEMAMPUAN KOMPUTER
Programming: C++, C#, VB.Net
Database
: MySQL
IDE
: Visual Studio 2015, Visual Studio Code
Software
: Ms. Office
Game Engine : XNA Framework, Monogame
74
PENGALAMAN KERJA
No
1
Instansi/Lembaga
Freelancer
Jabatan/Posisi
Tahun
Programmer
2013-2015
SEMINAR
No.
Seminar
Tahun
1
Seminar Demo Software dan Diskusi Panel Integrasi Agent Based Model
(ABM) dan Geographic Information System (GIS)
2011
2
Seminar Nasional Creative Animation dan Gaming Industry
2013