[求救]Visual Basic 讓電腦變聰明

我有一個程式

是關於取球遊戲的

就是有16顆球

我最多能點4顆球

而電腦也是

然而最後一個點到的玩家就輸了

而我有程式碼了

但是我要把他修改聰明一點

可是我完全找不到方向

......可不可以請各位大大能夠給我一些方向來完成這個作業



要把他改聰明,我想應該是電腦要贏

我的想法是在總球數剩下5顆的時候電腦要取4顆
總球數剩下4顆的時候電腦要取3顆
總球數剩下3顆的時候電腦要取2顆
總球數剩下2顆的時候電腦要取1顆



可是一直想不到方法來處理.....><



這是取球遊戲的程式碼



Dim i, j, n, sel As Integer
Dim ending As Boolean
Option Explicit

Private Sub Command1_Click()
If sel > 0 Then
Randomize
n = Int((Rnd * 4) + 1)
Label1 = n
For j = 1 To n
For i = 0 To 15
If Image1( i ).Visible = True Then
Image1( i ).Visible = False
Call result
If ending = True Then
Label2 = "Computer Lose !"
End If
Exit For
End If
Next i, j
sel = 0
End If
End Sub

Private Sub Form_Load()
For i = 0 To 15
Image1( i ).Picture = LoadPicture(App.Path + "\pinball.jpg")
Next i
End Sub

Private Sub Image1_Click(Index As Integer)
Image1(Index).Visible = False
Call result
If ending = True Then
Label2 = "You Lose !"
End If
sel = sel + 1
If sel = 4 Then
Randomize
n = Int((Rnd * 4) + 1)
Label1 = n
For j = 1 To n
For i = 0 To 15
If Image1( i ).Visible = True Then
Image1( i ).Visible = False
Call result
If ending = True Then
Label2 = "Computer Lose !"
End If
Exit For
End If
Next i, j
sel = 0
End If
End Sub
Public Sub result()
ending = True
For i = 0 To 15
If Image1( i ).Visible = True Then
ending = False
End If
Next i
End Sub



2008-06-09 23:51 發佈
文章關鍵字 Visual Basic 電腦
這個程式一點也不難,基本上就是先拿的一定輸,
在演算法的部分,根本不用考慮剩下幾顆球,只要每回合拿的球數
總和是5就可以了,例如 A 先拿 1顆,B就拿4顆、A 先拿 2顆,B就拿3顆,
最後一定是A輸。
不過這也有難的地方,就是電腦先拿,但是人擺爛故意不要贏,看看電腦是不是能贏,
基本上只要拿完後剩下的球數是5的倍數+1,那麼就穩贏了。

不過我不會VB沒辦法寫給你,基本上用上面那個想法就OK了。
電腦取球只要做到:
------
if ( 球數 == 1 )
return 人贏;
if ( 球數 < 5 ) (補充一下,原文只有 < ,但應要 <= )
球數 = 球數 - ( 球數 - 1 );
------
這樣一來,人會是剩下一顆球
了解吧
------
而我覺得樓上做法可能會有問題
畢竟是最多取4可能情形是0、1、2、3、4
人加上電腦取球後每回合總合不一定是5
所以只能在"電腦確定自己有機會贏的情況下不失誤"
------
有錯提出來討論吧
先謝謝你幫我

可是我還是不太懂耶><

我有針對 sel = sel + 1

去做了一下修改

可是結果不是我選一顆,電腦就狂選到剩一顆

不然就是我一直選一直選.....也超過4顆了

你說的 Sel - (sel - 1) 是?

我在想可不可以把電分成兩種狀況

一個是在球數大於5的時候用隨機取球
到了5科的時候就電腦就選 sel -1

不過好像會溢位耶.....

真的不知道該怎麼用了....

老師在學校交的非常的模糊

很多東西根本沒說明.....
真的很擔心會學不來><
dc0001 wrote:
而我覺得樓上做法可能會有問題
畢竟是最多取4可能情形是0、1、2、3、4
人加上電腦取球後每回合總合不一定是5
所以只能在"電腦確定自己有機會贏的情況下不失誤"


這種遊戲能拿0顆球嗎?那就也拿0顆球就好,擺爛下去...不對吧!

這個遊戲不能必勝的狀況是:輪到自己拿的時候,球的數量是5*N+1
這個遊戲能必勝的狀況是:自己拿完之後,球的數量是5*N+1

所以要怎麼拿?就把目前球數先減1,然後再除以5,算出來的餘數就
是應該拿的數量,拿完以後就會等於5*N+1...

所以如果電腦取零就是它擺爛耍賤了...
dc0001 wrote:
電腦取球只要做到:-...(恕刪)



不過取球的規則應該是 1-4 不是 0-4 ,要是可以選0個,遊戲就玩不下去了。




再來回樓主,你應該設一個變數,記錄這次你選了選了多少球,當等於4的時候就不可再選了,然後再多個"選擇完成"按鈕,按下後就換電腦選,電腦想贏,就照我上一篇的方法,


球數 = 球數 - ( 球數 - 1 );

這是不正確的,上面那行程式執行的結果永遠等於1



還有一件事情,剛開始學寫程式,最好不要去改別人的程式,像這樣的小程式應該要自己獨力完成,

還有一定要養成寫註解的習慣,尤其是變數代表的意思,像 sel 我就搞不清楚是代表什麼。

接到一個案子先不要急著寫CODE,要先在紙上作業,通常在開始KEYIN的時候,程式其實已經寫好了。



HeavyWang wrote:
球數 = 球數 - ( 球數 - 1 );
這是不正確的,上面那行程式執行的結果永遠等於1
...(恕刪)

所以啊
我有用if判斷是不是小於5顆球(原文有錯,應該要<=)
如果是小於5顆,才能"球數 = 球數 - ( 球數 - 1 );"
也就是若現在剩4顆球,又是該電腦取球
則電腦會直接取3顆,而剩下一顆,所以玩家輸了
或許是我表達不夠好吧...
還請見諒
------
而至於最多取四顆,那也許就要看初始規格了
看老師是說能否取0顆,若不行,就改一下吧
若可以,那就可以吧(不過樓主原碼是n = Int((Rnd * 4) + 1),那應該是不行吧...)
但畢竟每次電腦random不會那麼麼巧是0吧...所以球數還是會減少的,只是人擺爛...
------
而至於這程式解決方法,其實每個人都有不同見解
因為這類程式還不需用到特殊的資料結構
所以解決方法會是五花八門的
也建議多思考
------
總之還是建議樓主要多思考!
大家再多討論吧!
dc0001 wrote:
所以啊我有用if判斷...(恕刪)

這個遊戲規則是絕對不可以取0顆球的,要是可以取0顆球,那麼電腦是永遠贏不了的。
換個角度想想看,若不跟電腦玩而是兩個真人玩
那麼請問一下遊戲要怎麼進行呢?

球數 = 球數 - ( 球數 - 1 );
這一行代任何數下去結果都是1,那麼怎麼不乾脆寫成
球數 = 1;
就好了

acer790 wrote:
一個是在球數大於5的時候用隨機取球
到了5科的時候就電腦就選 sel -1

不用分成兩種情況,
這裡樓主的亂數是用錯地方了,
電腦想要贏,那麼取完後,剩下的球數一定要是5N+1,
因此取球數是可以算出來的,而不需要用亂數,
亂數 只 是用在要取哪幾顆而已。

假如一開始 人取了3顆球,剩下13顆,
那麼電腦就一定要取 (13-1) mod 5 = 2,
至於是哪兩顆,就用亂數去挑。

以上說的都是針對 人先取球的情形下,至於電腦先取的情形會複雜一點,
如果樓主有興趣可以自己想一下。
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?