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.
Sasaran
Pengujian
Hasil yang
Diharapkan
Hasil Pengujian
Kesimpulan
1.
Tampilan
ketika
aplikasi
dieksekusi
Aplikasi
menampilkan
halaman Menu
Utama
Aplikasi berhasil
menampilkan
halaman Menu
Utama
Valid
2.
Pemilihan
menu Mulai
Aplikasi
menampilkan
halaman Games
Aplikasi berhasil
menampilkan
halaman Games
Valid
3.
Pemilihan
menu
Bantuan
Aplikasi
menampilkan
halaman Bantuan
Aplikasi berhasil
menampilkan
halaman Bantuan
Valid
4.
Pemilihan
menu
Tentang
Aplikasi
menampilkan
halaman Tentang
Aplikasi berhasil
menampilkan
halaman Tentang
Valid
5.
Pemilihan
menu
Keluar
Aplikasi berhenti
Aplikasi berhasil
berhenti
Valid
b. Hasil Evaluasi pada Tampilan Halaman Game
Tabel Hasil Evaluasi Tampilan Halaman Game
No.
Sasaran
Pengujian
Hasil yang
Diharapkan
Hasil Pengujian
Kesimpulan
1.
Giliran awal
bermain
Aplikasi
mengacak giliran
bermain pada awal
halaman Game
ditampilkan
Aplikasi berhasil
mengacak giliran
bermain dan
menampilkan
pesannya di layar
Valid
2.
Selot
kotak-kotak milik
pemain dan
komputer
Aplikasi
membagikan
masing-masing 8
kotak untuk
Aplikasi berhasil
membagikan
masing-masing 8
kotak untuk
pemain dan
Valid
pemain dan
komputer
komputer
ditunjukkan
dengan
berkurangnya
jumlah kotak yang
tersisa
3.
Selot
kotak-kotak milik
pemain
Pemain dapat
memindahkan
kotak-kotak
miliknya ke papan
game pada saat
gilirannya
Pemain berhasil
memindahkan
semua kotak dari
selot miliknya ke
papan game pada
saat gilirannya
Valid
4.
Pemilihan
menu Swap
/ Delete
Pemain dapat
mengganti satu
atau semua
kotak-kotak miliknya
dengan kotak yang
ada pada
tumpukkan 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
Valid
5.
Pemilihan
menu
Cancel
Pemain dapat
mengembalikan
kotak miliknya
yang baru saja
diletakkan pada
papan game ke
selot miliknya
pada saat
gilirannya
Pemain berhasil
mengembalikan
kotak miliknya
yang baru saja
diletakkan pada
papan game ke
selot miliknya
pada saat
gilirannya
Valid
6.
Pemilihan
menu Next /
End Turn
Pemain dapat
mengakhiri
gilirannya
Pemain berhasil
mengakhiri
gilirannya baik
dengan
memberikan
langkah terbaiknya
maupun hanya
untuk skip
gilirannya dengan
muncul pesan
notifikasi berganti
ke giliran
komputer
Valid
7.
Komputer
berhasil
menemukan
solusi pada
saat
gilirannya
Komputer dapat
mencari langkah
terbaik dari kotak
miliknya dan
meletakkannya
pada papan game
dan giliran
permainan
berganti ke
pemain
Komputer berhasil
mencari langkah
terbaik dari kotak
miliknya dan
meletakkannya
pada papan game
dengan muncul
pesan notifikasi
berganti ke giliran
pemain
Valid
8.
Komputer
gagal
menemukan
solusi pada
saat
gilirannya
Aplikasi dapat
menampilkan
informasi jika
kesempatan skip
miliknya telah
berkurang 1 kali
dan giliran
permainan
berganti ke
pemain
Aplikasi berhasil
menampilkan
informasi jika
kesempatan skip
milik komputer
telah berkurang 1
kali
Valid
9.
Pengecekan
papan game
setelah
giliran
pemain atau
komputer
berakhir
Aplikasi dapat
mengecek langkah
valid yang telah
dilakukan pemain
atau komputer
sesaat setelah
gilirannya
berakhir.
Aplikasi berhasil
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
Valid
10.
Skor Game
Aplikasi dapat
menampilkan total
skor dan skor yang
diperoleh pada
langkah valid yang
didapatkan oleh
pemain dan
komputer
Aplikasi berhasil
menampilkan total
skor dan skor yang
diperoleh pada
langkah valid yang
didapatkan oleh
pemain dan
komputer sesaat
setelah mengakhiri
gilirannya
Valid
11.
Pemilihan
menu Home
Aplikasi dapat
menampilkan
menu pilihan
untuk mengulang
dari awal
permainan atau
kembali ke
halaman Menu
Utama
Aplikasi berhasil
menampilkan
menu pilihan
untuk mengulang
dari awal
permainan atau
kembali ke
halaman Menu
Utama
Valid
12.
Semua
kotak pada
tumpukkan
telah habis
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
menghentikan
permainan,
menghitung total
skor yang
didapatkan, dan
menampilkan
siapa yang
menjadi pemenang
berdasarkan skor
yang paling besar.
Valid
c. Hasil Evaluasi Tampilan Halaman Bantuan
Tabel Hasil Evaluasi Tampilan Halaman Bantuan
No.
Sasaran
Pengujian
Hasil yang
Diharapkan
Hasil Pengujian
Kesimpulan
1.
Tampilan
halaman
Bantuan
Aplikasi dapat
menampilkan
halaman Bantuan
Aplikasi berhasil
menampilkan
halaman Bantuan
Valid
2.
Tutup
halaman
Bantuan
Aplikasi dapat
menutup halaman
Bantuan ketika
area luar halaman
Bantuan diklik
Aplikasi berhasil
menutup halaman
Bantuan ketika
area luar halaman
Bantuan diklik
d. Hasil Evaluasi Tampilan Halaman Tentang
Tabel Hasil Evaluasi Tampilan Halaman Tentang
No.
Sasaran
Pengujian
Hasil yang
Diharapkan
Hasil Pengujian
Kesimpulan
1.
Tampilan
halaman
Tentang
Aplikasi dapat
menampilkan
halaman Tentang
Aplikasi berhasil
menampilkan
halaman Tentang
Valid
2.
Tutup
halaman
Bantuan
Aplikasi dapat
menutup halaman
Tentang ketika
area luar halaman
Tentang diklik
Aplikasi dapat
menutup halaman
Tentang ketika
area luar halaman
Tentang diklik
Valid
e. Hasil Evaluasi Resolusi Layar Monitor terhadap Tampilan Summy
1. Resolusi Layar Monitor 800 x 600 Pixel (Terpotong)
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)
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
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
Komputer Waktu
FPS
terendah
1,3,5,7,9,+,x,-
=
19x3=57
1
0,017
44
2
0,017
60
3
0,017
60
3,4,5,6,7,8,9,-
=
94-58=36
1
0,217
20
2
0,217
28
3
0,200
32
0,2,4,6,8,x,:,-
=
8-6=2
1
0,017
44
2
0,017
60
3
0,017
60
1,2,3,4,5,6,7,+
=
63+12=75
1
0,233
12
2
0,267
28
3
0,217
56
3,4,5,6,7,8,9,-
94-58=36
1
0,283
20
2
0,217
40
3
0,167
60
0,2,4,6,8,x,:,=
96:48=2
1
0,170
24
2
0,170
56
3
0,050
56
1,3,5,7,9,+,-,=
93-78=15
1
0,217
24
2
0,017
32
3
0,017
56
1,2,3,4,5,6,7,=
76-45=31
1
1,850
12
2
3,117
20
3
3,567
56
4,5,6,7,8,9,=,+
679+5=684
1
1,950
32
2
1,100
48
3
1,433
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.
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.
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.
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.
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.
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 Function PisahNumerik(Data() As String) As JenisList Dim T As List(Of String) = Data.ToList
Dim D() As String = T.ToArray Dim TipeList As New JenisList Dim i = 0
Dim j = 0 For 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.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
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"
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
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 <= 2 Or (TemP.ToString.Length > 1 AndAlso TemP.ToString.Substring(0, 1) <> "0") Then
DPermutasi.Add(TemP.ToString) End If
End If
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
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
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
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
Exit For End If End If Next Next End If End Sub End Class