ich bin momentan bei der Programmierung von SchiffeVersenken Phase 2.
Man kann bereits gegen einen realen Spieler spielen, jetzt soll man auch noch gegen den PC spielen können. Chris und Rudi haben mir hierbei schon sehr geholfen.
Soweit läuft das ganze auch, jedoch soll der PC noch eine Art "KI" bekommen. Trifft er, so soll er in ein Feld daneben schießen.
Ich habe das mit folgendem Code versucht:
Sub GegnerSpielt()
Dim a As String
Dim b As Integer
Dim c As Integer
Dim d As Variant
Dim e As String
Dim j As Long
Dim f As Integer
Dim g As String
Dim h As Variant
Dim x As Integer
Dim IntC As Integer
Dim IntC2 As Integer
Dim IntC3 As Integer
Dim IntC4 As Integer
j = 3
Do
b = Int(10 * Rnd + 1) + 64
a = Chr(b)
c = Int((10 * Rnd) + 1)
c = c + 14
d = a & c
IntC = Application.CountIf(Range("C3:C100"), d)
'diese Range bekommt den Zellwert, in den geschossen wird.
'durch ein Change event wird dieser Wert weiterverarbeitet
IntC2 = Application.CountIf(Worksheets("Spielfeld").Range("C17:L26"), "x")
If IntC2 = 30 Then Exit Sub
'dann ist das Spiel vorbei
If IntC = 0 Then
Worksheets("PC").Cells(1, 3).End(xlDown).Offset(1, 0).Value = d
IntC3 = Application.CountIf(Worksheets("Spielfeld").Range("C17:L26"), "X")
If IntC3 > IntC2 Then GoTo sprungziel
'zählt durch, ob es jetzt mehr "x" gibt als vorher, also getroffen wurde
Exit Sub
Else
End If
sprungziel:
x = 3
Do While IsEmpty(Cells(x, 3)) = False
Worksheets("PC").Cells(1, 3).End(xlDown).Select
e = Mid(Selection, 1, 1)
f = Asc(e)
f = f + 1
g = Chr(f)
h = g & c
IntC4 = Application.CountIf(Worksheets("PC").Range("C3:C100"), h)
If IntC4 = 0 Then
Worksheets("PC").Cells(1, 3).End(xlDown).Offset(1, 0).Value = h
Exit Do
End If
'meine idee: er liest den letzten Wert aus der Range(C3:C100) aus und da dies
'ein Treffer war, nimmt er sich den ersten Buchstaben und zählt ihn hoch
f = f - 2
g = Chr(f)
h = g & c
IntC4 = Application.CountIf(Worksheets("PC").Range("C3:C100"), h)
If IntC4 = 0 Then
Worksheets("PC").Cells(1, 3).End(xlDown).Offset(1, 0).Value = h
Exit Do
End If
'hat er bereits dorthin geschossen, verändert er auch die Zeilen
f = f + 1
c = c + 1
g = Chr(f)
h = g & c
IntC4 = Application.CountIf(Worksheets("PC").Range("C3:C100"), h)
If IntC4 = 0 Then
Worksheets("PC").Cells(1, 3).End(xlDown).Offset(1, 0).Value = h
Exit Do
End If
c = c - 2
h = g & c
IntC4 = Application.CountIf(Worksheets("PC").Range("C3:C100"), h)
If IntC4 = 0 Then
Worksheets("PC").Cells(1, 3).End(xlDown).Offset(1, 0).Value = h
Exit Do
End If
x = x + 1
Loop
Loop
End Sub
Anmerkung:Wie gesagt werden die Werte in die Range(C3:C100) geschrieben. Ein Changeevent wertet die Zellen aus und markiert in einem anderen Tabellenblatt den Schuss (als Niete oder Treffer).
Soweit die Theorie. Leider erhalte ich einen "400"er Fehler, sobald er in die Sprungmarke hüpft.
Wahrscheinlich ist das viel zu kompliziert gedacht und ich seh den Wald vor lauter Bäumen nicht.
Liebe Grüße,
Dennis