freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

24點(diǎn)游戲的開發(fā)和實(shí)現(xiàn)—計(jì)算機(jī)畢業(yè)設(shè)計(jì)-在線瀏覽

2025-02-01 07:44本頁(yè)面
  

【正文】 1E6之外,則說明其結(jié)果為 24。只要我們的判別是如以上程序的,則此算式將輕易的解出。形 如 a+b 和 b+a 是一樣的,可以省略其中的一種。介紹了 24 點(diǎn)算法后,接下來我們來探討一下,一個(gè)有著紙牌圖形界面的 24 點(diǎn)游戲?qū)⒃鯓油瓿伞N覀冎肋f歸算法是通過調(diào)用一個(gè)遞歸函數(shù),將 n值依次減 1 到最小值為止。其主要思想就是對(duì) 4個(gè)數(shù)字的運(yùn)算順序和運(yùn)算符號(hào)通過遞歸逐一的算出各種表達(dá)式。顯然,其中已經(jīng)包括了24 點(diǎn)的所有算法,假如要輸出每種可能性進(jìn)性判別其優(yōu)化性,那就需要用到編譯原理的知識(shí)。我們拿 a+b+c+d為例子,我們知道在有括號(hào)的情況下,( a+b) +( c+d) 以及( a+b+c) +d 這 3種情況中,很明顯前一種是最簡(jiǎn)潔。這就需要對(duì)兩種算法進(jìn)行逆波蘭式的判別,我們將前 者寫成逆波蘭式,則為ab+c+d+,第 2 種寫成逆波蘭式為也為 ab+c+d+。但是很明顯,前者簡(jiǎn)潔。假如我們將左右括號(hào)定義為枚舉變量,接著掃描每個(gè)字符,假如字符串最短的則為最優(yōu)化的算法。但有些算式,通過前者是算不出來的,只能通過后者算出,則其也應(yīng)該算是優(yōu)化了的算法。如果,存在整數(shù)的算法,則要去掉其小數(shù)的算法。 24 點(diǎn)游戲輸入表達(dá)式的判別算法 討論了 24 點(diǎn)游戲的各種算法思想后,接著要考慮的是游戲的關(guān)鍵技術(shù),即是表達(dá)式的判別。何為表達(dá)式判別?所謂表達(dá)式的判別就是,你在對(duì)話框中輸入數(shù)字和字符的時(shí)候,是不是牌面所顯示的值,這是一個(gè)非常關(guān)鍵的重點(diǎn)。接著游戲截面顯示了,紅桃 A,黑桃 5,紅桃 5 和梅花 5 這 4 張牌,要求你算出 24點(diǎn)。那我們可以輕松的試出其正確與否。如果系統(tǒng)未提示任何錯(cuò)誤,反而彈出計(jì)算正確的提示。這就是所謂的表達(dá)式判別。表達(dá)式判別有簡(jiǎn)單有復(fù)雜,我們的目的是力爭(zhēng)簡(jiǎn)潔但實(shí)用。編譯原理是對(duì)計(jì)算機(jī)語言進(jìn)行文法分析,詞法分析的一種 學(xué)科。我們將在文本中輸入的一段字符串,將其進(jìn)性文法分析和語法判斷。對(duì)于表達(dá)式順序的問題更是簡(jiǎn)單,現(xiàn)在我們介紹一種方法叫逆波蘭式。例如我們?cè)诔绦蛑幸玫?a+b 則逆波蘭式為 ab+,要得到( a+b) *c則逆波蘭式為 ab+c*,更復(fù)雜的 a: =b*c+b*d 其逆波蘭式為 abc*bd*+: =。 我們拿上面最復(fù)雜的例子做分析,得出逆波蘭式子的思想。我們看,我們將第一個(gè)字符 a推入棧頂,接著推入第 2 字符,接著第 3, 4 一直將推如棧中。將 b, c 棧合并用于存放結(jié)果。依著以上的思想進(jìn)行運(yùn)算,就可以 實(shí)現(xiàn)語句 a: =b*c+b*d。我們將每個(gè)輸入的字符推入棧中,并且對(duì)其進(jìn)行判別,假如遇到的字符是除了如( 1— 9, +, , *, /,(,))等符號(hào)外的數(shù)據(jù),則說明輸入有誤,此算法完成了語法錯(cuò)誤的判別。我們對(duì)每次推入棧的數(shù)字和系統(tǒng)的數(shù)字進(jìn)行比較,假如有不同的則報(bào)“數(shù)字和系統(tǒng)提供的不相同”的錯(cuò)誤。然而在推入棧的時(shí)候碰到的第一個(gè)右括號(hào),我們令 a[0], count2++,接著和上面的步驟類似。通過逆波蘭式的原理,我們可以輕松完成 24 點(diǎn)游戲表達(dá)式的判別 。首先必須要有紙牌的界面。將一副標(biāo)準(zhǔn)撲克牌的 52 張牌面截下來,將其加入到 vc++的 res 文件夾中,也就是資源文件夾。比如,用 a 前綴代替紅桃, b 前綴代替黑桃, c 前綴代替梅花, d 前綴代替方塊。做好了牌面的截圖后就是對(duì)其進(jìn)行發(fā)牌。我們將其中的 52 個(gè)數(shù)設(shè)為數(shù)組行如: a[52] ,這樣 每張牌就對(duì)應(yīng)了數(shù)組中的一個(gè)變量。接著我們用一個(gè)隨即函數(shù)令其隨即的產(chǎn)生 4個(gè)數(shù),函數(shù)行如: b[1]=rand() b[2]=rand() b[3]=rand() b[4]=rand(),其函數(shù)的意思就是產(chǎn)生隨即數(shù)。這樣我們需要對(duì)產(chǎn)生的隨即數(shù)進(jìn)行處理。 此程序的關(guān)鍵就是隨即搜索牌面的路徑,通過牌面的搜索和刷新,形成一 組新的數(shù)字,根據(jù)此 4個(gè)數(shù)字生成 24點(diǎn)。此函數(shù)在使用之前,必須有個(gè)誘導(dǎo)函數(shù) srand()。假如將 52 張牌標(biāo)記成 0 到 51 的數(shù)字,那么我們可以通過對(duì)隨即函數(shù)求余的方法,找到每張牌。牌面在程序中將怎樣生成?首先我們要做的是截圖,所謂截圖就是從已有的紙牌游戲中截下相應(yīng)的 52張牌(不包括大,小王)。要注意在文件命名的時(shí)候是有講究的,因?yàn)榇撕笠阉髋频穆窂健=y(tǒng)一性就是我們可以將 4 種不同花色的牌分別命名以 a, b, c, d 開頭,區(qū)分性就是我們用每張牌面的數(shù)值來區(qū)分其不同行。這樣我們就將 52 張牌和 52 個(gè)有序的文件一 一對(duì)應(yīng)了。在面向?qū)ο蟮某绦蚓幊讨校?vc++中的圖形界面的設(shè)計(jì)可以在 API 中來完成。位置包含了很多屬性,包括一般的長(zhǎng),高等??梢杂靡韵潞瘮?shù)。 rectdate[0].=rectdate[0]. =rectdate[0].+height。 rectdate[0].=rectdate[0]. =rectdate[0].+width。 4張紙牌對(duì)應(yīng)于其中的 4個(gè)如上的函數(shù),其他三個(gè)同理可得。 存放位置編好了之后,接著就是在怎樣生成圖片了。 不發(fā)重復(fù)牌的算法 我們?cè)谕瓿杉埮朴螒蚪缑娴脑O(shè)計(jì)之后,接著要考慮的一個(gè)問題就是:因?yàn)槟阌玫降氖且桓迸?,如何?shí)現(xiàn)每次發(fā)牌的時(shí)候不產(chǎn)生相同的牌面。其實(shí),要完成此功能也極為簡(jiǎn)單。就如上面所提到的,用 52 個(gè)有著相同點(diǎn)又 有區(qū)別的圖形文件來區(qū)分其花色和大小。其中花色一樣的牌為一樣的順序,例如紅桃花色的牌存放在 a[0]a[12]中,黑桃的牌存放在 a[13]a[25]中,梅花花色為 a[26]a[38]中,方塊為 a[39]a[51]中。將花色進(jìn)行了分類后,我們可以對(duì)其進(jìn)行選擇判斷了。首先我們找出大小為 10 的值,我們知道有 4 個(gè),接著我們要找到紅桃花色,這只要我們做簡(jiǎn)單的判 斷,即數(shù)組的下標(biāo)(這里我們?cè)O(shè)它為 i) 0=i=12。我們知道一張牌有兩個(gè)要素組成,一個(gè)是大小,一個(gè)花色。因此只能采用以上方法以區(qū)分。我們知道游戲中重新開始是肯定要用到的,你不可能讓別人只算一次,這就失去了其實(shí)際意義,也得不到娛樂和益智的效果。在 API的編程中,我們使用了一個(gè)關(guān)鍵技術(shù),那就是刷新函數(shù)。 如下讓我們看看此 24游戲中,重新發(fā)牌的關(guān)鍵程序。 CPaintDC dc(this)。i4。bm1)。 ::SetStretchBltMode(hDesDC1,COLORONCOLOR)。 } 通過以上的函數(shù),我們就可以得到下一輪游戲的牌面。比如時(shí)間控制,開始和結(jié)束控制等。也是為游戲增添樂趣,提供思索空間所必需的。 void CWorkView::OnTimer(UINT nIDEvent) //定時(shí)器響應(yīng)程序 {CString temp。 temp=m_edit。 m_edit4=timercount。} if(timercount=0) {KillTimer(1) 。 (CButton*)CWnd::GetDlgItem(IDC_BUTTON5)EnableWindow(TRUE)。我們從他的拼寫可以看 到,其意思是消除時(shí)間。另外在時(shí)間控制下,其他一些控件也要實(shí)行相應(yīng)的變化。 游戲的開始和結(jié)束控制 每個(gè)游戲都有其游戲的開始控制和結(jié)束控制,當(dāng)然 24 點(diǎn)游戲也不例外。我們來看下其程序: void CWorkView::OnButton5() {if(istimer==false) {SetTimer(1,1000,NULL)。 (CButton*)CWnd::GetDlgItem(IDC_BUTTON3)EnableWindow(FALSE)。 (CButton*)CWnd::GetDlgItem(IDC_BUTTON4)EnableWindow(FALSE)。當(dāng)按下開始按鈕時(shí),我們將控件 BUTTTON3, 2, 4都灰化。 結(jié)束按鈕和開始按鈕大同小異,這里我們就不詳細(xì)介紹了。接著就是在程序上做簡(jiǎn)單的修改,查漏補(bǔ)缺。運(yùn)行沒有出錯(cuò),程序就運(yùn)行如下。有相應(yīng)的表達(dá)式輸入功能,查看結(jié)果功能,顯示正確答案功能,重新發(fā)牌,牌面設(shè)置以及定時(shí)控制。其中文件菜單中有開始和結(jié)束控制。 我們看到,在按下了設(shè)置牌面的時(shí)候,彈出一個(gè)牌面設(shè)置的窗口。 我們可以看到按照如上的 要求我們實(shí)現(xiàn)了牌面的自定義功能。我在如下一一都顯示出來。在第二個(gè)窗口中輸入了左括號(hào)后直接點(diǎn)擊“單機(jī)查看結(jié)果”鍵時(shí)彈出“括號(hào)不匹配”的錯(cuò)誤提示。以上我將所有的錯(cuò)誤信息都做了很好的圖文說明。我們?cè)谂泼嬖O(shè)置的時(shí)候輸入 5 5 5 1 4 個(gè)數(shù)字的時(shí)候,顯示正確結(jié)果的截面如下。 24 點(diǎn)算法的程序?qū)崿F(xiàn) //計(jì)算 24點(diǎn)的答案程序 BOOL Calc24(int iNum1, int iNum2, int iNum3, int iNum4, CStringamp。//定義一維數(shù)組 用于存放輸入的數(shù)值 iNumArr[0] = iNum1。 NumArr[2] = iNum3。 if (CalcArray1(iNumArr, strResult))//調(diào)用 CalcArray1 函數(shù)判斷其是否能算出24 { return TRUE。 } if (CalcArray3(iNumArr, strResult)) 調(diào)用 CalcArray3 函數(shù)判斷其是否能算出24 { return TRUE。 } if (CalcArray6(iNumArr, strResult)) 調(diào)用 CalcArray6 函數(shù)判斷其是否能算出 { return TRUE。 } return FALSE。 strResult)//沒有括號(hào)的一個(gè)函 //數(shù),類似的函數(shù)還有 6 個(gè),這里不另外寫上去了。//其中包括數(shù)值變量和運(yùn)算符號(hào)有 7 個(gè)字符 for(int i=0。i++)//循環(huán)語句判斷輸入的 4 個(gè)數(shù)字 { for(int j=0。j++) { if(j==i) { continue。k4。 } for(int l=0。l++) { if(l==i||l==j||l==k) { continue。//將數(shù)值存入數(shù)組中 iNumMaths[2][0]=iNumInput[j]。 iNumMaths[6][0]=iNumInput[l]。//將此字符代表數(shù)值還是運(yùn)算符號(hào)的值存入數(shù)組 iNumMaths[2][1]=eNumber。 iNumMaths[6][1]=eNumber。 oneOP = eDiv。 twoOP=eDiv。 threeOP=eDiv。//通過循環(huán)得到第一個(gè)字符的運(yùn)算符號(hào)先 /, *后 + , iNumMaths[1][1] = eOperator。 iNumMaths[3][1] = eOperator。 iNumMaths[5][1] = eOperator。 if(Equal24(dRes)) CombineResult(iNumMaths, 7, strResult)。 } } } }//end for (int oneOP } } } } return FALSE。//用于控制 if 語句的判斷 int total。//3 種錯(cuò)誤判斷和一種正確結(jié)果的變量 CString s。 s=m_edit。 int dd。 int nLength=()。 sz=(0)。 dd=eval_exp(sz)。 if(errorNum==0)// errorNum 有 4 個(gè)值,分別用以判斷出錯(cuò)信息和正確消息 { MessageBox(輸入語法錯(cuò)誤 )。 } else if(errorNum==3)//假如 errorNum 為 3則判斷其表達(dá)式的長(zhǎng)度 { for(j=0。j++) { int getatq=(j)。 if((getatq==39。)amp。(getath==39。)) { (j,39。)。 length=()。139。amp。139。b39。 (j+1,1)。 } if((getatq==39。)amp。(getath==39。)) { (j,39。)。 length=()。139。amp。339。d39。 (j+1,1)。 } } for(i=1。i++)//循環(huán)語句判斷輸入值和牌面給定的牌是否匹配 { temp=0。 while(temp!=(1)) { temp=(d[i],start)。 f(temp!=(1)) { a[i]++。i14。 } if(c[i]==m_iNum[1]) { a[i]。 } if(c[i]==m_iNum[3]) { a[i]。 if(total!=0) //利用 total 變量實(shí)現(xiàn)了數(shù)字匹配問題,假如 total 為 0則匹配正確 否則錯(cuò)誤 MessageBox(請(qǐng)注意輸入數(shù)值是否正確 )。 m_edit3=dd。 } else { MessageBox(
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1