久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

C語言程序設(shè)計冒泡排序教學(xué)案例 楊進

時間:2019-05-12 23:12:00下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《C語言程序設(shè)計冒泡排序教學(xué)案例 楊進》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《C語言程序設(shè)計冒泡排序教學(xué)案例 楊進》。

第一篇:C語言程序設(shè)計冒泡排序教學(xué)案例 楊進

C語言程序設(shè)計冒泡排序教學(xué)案例

永川職業(yè)教育中心

楊進

【案例背景】

排序是計算機學(xué)科中一項復(fù)雜而重要的技術(shù),在各種軟件中使用頻率都很高,因此專家們研究了各種排序算法。在中職類設(shè)計課程教學(xué)中,常以冒泡排序來講解排序的原理,它簡單,但過程繁瑣,傳統(tǒng)教學(xué)很難激發(fā)學(xué)生興趣,學(xué)生不易理解,也很難編寫掌握冒泡排序。因此,如何合理設(shè)計教學(xué)過程,讓學(xué)生掌握冒泡排序的思想和編程方法,又能發(fā)散思維,擴充知識,進而激發(fā)學(xué)生對編程課程的興趣,是一個關(guān)鍵問題。

1、學(xué)情分析

學(xué)生已學(xué)習(xí)了程序設(shè)計的三種結(jié)構(gòu),學(xué)習(xí)使用了數(shù)組。但在學(xué)習(xí)排序算法的過程中學(xué)生可能會對數(shù)組變量的變化在理解上存在一定困難,在排序算法中,對雙重循環(huán)內(nèi)外層的作用及有關(guān)循環(huán)參數(shù)的設(shè)置可能會產(chǎn)生一些不合理或是錯誤,需要通過實踐的體驗進行強化使用規(guī)范。

2、教學(xué)目標(biāo)

知識目標(biāo):掌握冒泡排序的原理;能結(jié)合冒泡排序的原理看懂冒泡排序的主要代碼;理解冒泡排序的流程圖;

能力目標(biāo):學(xué)會使用冒泡排序思想設(shè)計解決簡單排序問題的算法;進一步理解程序設(shè)計的基本方法,進一步體會算法與程序?qū)崿F(xiàn)的關(guān)系;

情感目標(biāo):培養(yǎng)學(xué)生分析問題、發(fā)現(xiàn)規(guī)律的能力,激發(fā)學(xué)生學(xué)習(xí)熱情;培養(yǎng)良好的讀程習(xí)慣;

3、教學(xué)重點、難點

重點:冒泡排序算法的基本思想,雙重循環(huán)應(yīng)用

難點:雙重循環(huán)程序的解讀,冒泡排序算法實現(xiàn)后對程序的理解

4、教學(xué)策略與手段

以循序漸進、層層深入為教學(xué)的指導(dǎo)方針,采用講解法、演示法、討論合作、分析歸納法引導(dǎo)學(xué)生參與思考,由特殊到一般,有效地突出重點突破難點,逐步深化對冒泡算法、循環(huán)思想和執(zhí)行過程的理解。

5、課前準(zhǔn)備

PPT課件、冒泡排序的視頻文件。【案例描述】

師:在前面的學(xué)習(xí)中,我們學(xué)過了用EXCEL進行一些簡單的數(shù)據(jù)處理方法,請同學(xué)們說說看你是怎么對同學(xué)的成績排次序的?

生:先選好數(shù)后,點排序就行了。

師:是的。只要用EXCEL的排序功能就可以了,點點鼠標(biāo)就能完成。在前面的學(xué)習(xí)中,我們已經(jīng)解開了很多單擊鼠標(biāo)就可以完成某一個任務(wù)的秘密,今天我們就來探訪一下排序的秘密。

師:先讓我們來做個舞蹈視頻,同時要求同學(xué)們談?wù)効春蟮淖约旱南敕ā2⒁垘孜煌瑢W(xué)模擬示范。

這段真人編排的排序算法的舞蹈視頻,非常生動有趣,能充分吸引學(xué)生的眼球,極大激發(fā)了學(xué)生的興趣。

播放完畢,老師提問:請同學(xué)們說說你們看到了什么? 生:議論并說自己的想法。(冒泡排序的過程)

由于視頻播放相對較快,為了讓學(xué)生更好理解與參與,老師還根據(jù)具體情況請了四位涌躍分子來作下一個游戲。

請四位同學(xué)從前到后坐好并拿好老師給你們的數(shù)字,然后從后面開始兩個兩個比較你們手中的數(shù),如果后面的同學(xué)數(shù)小的話就和前面的同學(xué)換一下座位,直到拿到最小數(shù)的同學(xué)坐在第一個位子為止。

現(xiàn)在開始,請其他同學(xué)注意觀察。請同學(xué)們說說你們看到了什么? 生:議論并說自己的想法

師:我聽到了同學(xué)們的發(fā)言了,你們都看到了最小數(shù)已經(jīng)在最前面了,并且是經(jīng)過了3次的比較。想一想,如果要讓拿第二小的數(shù)的同學(xué)坐上第二個座位,還要進行幾次的比較呢?(注意只能從后開始兩兩比較)請拿數(shù)的同學(xué)演示一下。幾次?

生:兩次

師:對了,是兩次,比第一次少了一次。請四位同學(xué)回到座位。剛才我們通過四位

同學(xué)的演示其實給我們展示了一種數(shù)據(jù)排序的方法---冒泡法。那么什么是冒泡排序法呢?

冒泡排序法:是指把n個要排序的數(shù)看成一垂直列,從最下面的數(shù)開始兩兩比較相鄰的兩個數(shù),把小的數(shù)向上換,經(jīng)過n-1次處理以達到排序目的的一種排序方法。(課件展示)

分析總結(jié)學(xué)生的演示:(課件展示)第1次冒泡排序時 j 從 4 開始到2:

第2次冒泡排序時 j 從 4 開始到3:

第3次冒泡排序時 j 從 4 開始到4

如果用偽代碼可表示為:

第1次冒泡排序時 j 從 4 開始到2: for(j=4;j>=2 ,j--)if(d[j]

for(j=4;j>=3 ,j--)if(d[j]=4 ,j--)if(d[j]

問:如果我們用一個變i(值分別為1,2,3)來記錄冒泡的次數(shù),請問能否將上述的三次代碼合并成一段通用的代碼呢?

生:能(學(xué)生講偽代碼)for(j= 4,j>=i+1,j--)if(d[j]

歸納分析引入核心代碼: 當(dāng)i=1到3時:(課件展示)for(j= 4;j>=i+1;j--)if(d[j]

那么,我們用我們學(xué)過的循環(huán)語句就可以把某一次的比較表示為:(課件展示)for(j= 4;j>=i+1;j--)if(d[j]

生:思考

師:其實,我們可以在剛才的循環(huán)外再加一層循環(huán),使i也參與變化,以達到對次數(shù)的控制(課件展示)

for(i=1;i<4;i++)for(j=4;j>= i+1;j--)if(d[j]

剛才我們已經(jīng)講解了4個數(shù)冒泡排序的代碼,那么有n個數(shù)呢?(課件展示)for(i=1;i

for(j=n;j>= i+1;j--)if(d[j]

分析冒泡排序的源程序(用tc編輯器演示分析)為了進一步檢驗學(xué)生的情況,老師作了問題延伸:

編寫一個評分系統(tǒng)的代碼段:有10個評委,最后得分為去掉一個最高分與一個最低分后的平均分。(提示:排序后要將最小和最大的數(shù)去除,再累加其余各數(shù)并除以8)。

【案例反思】

1、本課時采用通過對冒泡排序的基本方法進行分析,利用視頻、游戲等多種教學(xué)手段,采用正向講解算法思想,總結(jié)規(guī)律,歸納算法等方法,一方面使學(xué)生順利從排序的思想過渡到偽代碼并到代碼的書寫,逐步引出雙循環(huán)和冒泡排序的程序?qū)崿F(xiàn),另一方面培養(yǎng)學(xué)生觀察算法,分析算法和使用算法的雙向思維意識和發(fā)散思維能力,提高學(xué)生自覺能力和獨立思考能力,體現(xiàn)了在課程教學(xué)中培養(yǎng)學(xué)生綜合素質(zhì)的教育思想。

2、老師要注意講授時間,要能及時調(diào)節(jié)課堂氣氛,防止學(xué)生課內(nèi)思維疲勞。

第二篇:《C語言循環(huán)程序設(shè)計for語句》教學(xué)案例

《C語言循環(huán)程序設(shè)計—for語句》教學(xué)案例

漠河縣職業(yè)技術(shù)學(xué)校 塵威威 《C語言循環(huán)程序設(shè)計—for語句》教學(xué)案例

漠河縣職業(yè)技術(shù)學(xué)校 塵威威

C語言基礎(chǔ)是中職計算機專業(yè)的一門必修課,也是要求計算機專業(yè)學(xué)生學(xué)習(xí)、掌握的一門重點課程,這門課程核心內(nèi)容就是要讓學(xué)生掌握一門編程的語言,學(xué)會編寫簡單的程序,能讀懂C語言源程序。

案例背景:

在計算機應(yīng)用專業(yè)教學(xué)中,C語言是一門理論與實踐結(jié)合得比較緊的課程。要掌握和使用好這門語言,既要求學(xué)生有比較扎實的理論基礎(chǔ),又要具備較強的應(yīng)用實踐能力。如果只是按照傳統(tǒng)的知識體系照本宣科,讓學(xué)生理解這些枯燥的概念都難,更不要說達到良好的教學(xué)效果,而且易挫傷學(xué)生學(xué)習(xí)編程的積極性。因此,在教學(xué)中可以改為從案例入手,通過給學(xué)生演示、讓學(xué)生模仿,在實際應(yīng)用中去探究和領(lǐng)悟這些概念,并適時地加以歸納總結(jié)和進行概念的延伸,讓學(xué)生在輕松愉快的氣氛中學(xué)習(xí)新知識。所以從課程內(nèi)容而言,案例教學(xué)是適用的,是切合學(xué)生的。

循環(huán)結(jié)構(gòu)是程序設(shè)計三種基本結(jié)構(gòu)的重中之重,而循環(huán)中的for循環(huán)是程序中運用最多的,也是較靈活的語句之一,它既是前面知識的延續(xù),又是后面知識的基礎(chǔ),在知識構(gòu)架中起著重要的銜接作用,如果不采用一些恰當(dāng)有效的方法,學(xué)生在學(xué)習(xí)過程中會難以掌握。在教學(xué)過程中教師應(yīng)結(jié)合一些有趣的程序,提高學(xué)生的學(xué)習(xí)興趣,引導(dǎo)學(xué)生全身心地投入課堂。本文針對學(xué)生的實際情況,具體闡述for循環(huán)語句在具體編程時的靈活應(yīng)用。

教學(xué)目標(biāo)確定

(一)知識與技能

1、領(lǐng)會程序設(shè)計中構(gòu)成循環(huán)的方法

2、能使用for循環(huán)語句編寫C語言語句,并能運用for循環(huán)語句編寫出正確的程序。

(二)過程與方法

C語言程序設(shè)計中for循環(huán)語句教學(xué)以行動導(dǎo)向教學(xué)為主線,通過“提出問題―分析問題―解決問題―問題擴展―討論―總結(jié)歸納―實踐”的程序,過渡到知識應(yīng)用和練習(xí)。

本課采用多媒體課件進行教學(xué),通過課件把文字和圖片有機的結(jié)合,使學(xué)生在學(xué)習(xí)過程中更加容易理解,學(xué)習(xí)效率高。在課堂討論和實踐過程中,教師適當(dāng)引導(dǎo),學(xué)生主動探究、歸納總結(jié)學(xué)習(xí)內(nèi)容,既有利于領(lǐng)會掌握新知識點,又能充分發(fā)揮學(xué)生的主體作用。在重點的突破上,采用范例比較教學(xué)法,給出具體的案例,讓學(xué)生通過典型的例子掌握知識,同時通過用while、do while語句的所編寫的程序進行比較,加深學(xué)生印象,讓學(xué)生快速的掌握for循環(huán)語句的基本結(jié)構(gòu)及使用方法。

(三)情感與價值觀

1.讓學(xué)生在自主解決問題的過程中培養(yǎng)成就感,為今后自主學(xué)習(xí)打下良好的基礎(chǔ)。

2、培養(yǎng)學(xué)生學(xué)習(xí)的主動性,激發(fā)學(xué)生學(xué)習(xí)熱情,以及培養(yǎng)團隊合作的精神、自主探究,合作交流的學(xué)習(xí)方法,觀察,樂于分析的學(xué)習(xí)態(tài)度。

教學(xué)重難點確定

C語言程序設(shè)計中for循環(huán)語句的重點是“for語句的結(jié)構(gòu)”,分析題目意圖(即算法分析),并用讓學(xué)生便于理解的方式描述,學(xué)生掌握語句的結(jié)構(gòu)和用法并不困難,難的是在實際的應(yīng)用中那些時候該使用哪種循環(huán)來解決問題比較簡潔、高效,所以我把本節(jié)課的難點確定為“for語句的應(yīng)用”。

學(xué)情分析:本節(jié)課我主要針對計算機專業(yè)高三高考班的學(xué)生,在學(xué)這節(jié)課之前他們應(yīng)準(zhǔn)確掌握《C語言程序設(shè)計》中關(guān)于實現(xiàn)循環(huán)結(jié)構(gòu)語句,如 for 或 while,do-while。并擁有能分析并描述簡單算法如求累加,累乘的能力。

案例描述

案例1:教師將一張空白A4紙向?qū)W生展示,跟同學(xué)們說,今天老師給大家做個試驗,讓你們來猜一猜(學(xué)生的興趣和精神一下就提起來了),然后老師邊演示邊講解,將這張紙對折一下后幾張?學(xué)生都能回答: 2張。繼續(xù)發(fā)問,對折兩下幾張?學(xué)生:4張。對折三下呢?學(xué)生:8張。(這個時候?qū)W生充滿疑惑,老師想干嘛呢,問這么簡單的問題)接著老師提出問題:如果紙理想化的大,對折42下,這些紙的厚度將會多高?

這個教室一下就熱鬧起來了,學(xué)生們紛紛給出自己想像的答案,有些同學(xué)比劃出手勢:伸開雙手說:有那么高,有人說桌子那么高的,有說房子那么高的。又有人馬上否定,哪有那么高。有些同學(xué)拿起筆就開始算,算著算著就不知道該從哪兒下手了。

這個時候老師組織安靜課堂,叫同學(xué)分組給出自己心里傾向的答案,可以估計,可不說理由。

四個小組分別給出的答案是:1:書桌那么高(大概50cm)。2:人的高度(大概170cm)。3:樓房的高度(大概3000cm)。4:大概10厘米。

老師不說哪一組對,只是問同學(xué)們,這個高度該怎么算? 接下來和同學(xué)一起分析得出以下結(jié)論:

1、紙張的厚度h?

2、有多少張紙n?

3、高度=h*n.解決問題1:同學(xué)自行測量(4組同學(xué)各自準(zhǔn)備100頁紙,測出總高度/100,取4個小組的平均值)。最后得出一張紙的厚度約=0.1mm。

這個環(huán)節(jié)的主要目的是讓每個學(xué)生動手,鍛煉他們的動手實踐,合作交流的集體合作精神。

解決問題2:有多少張紙?2的42次方。接下來利用循環(huán)語句來做(即有42個2相乘)。

編寫源程序

所用方法:學(xué)生自己編寫,小組同學(xué)相互交流。

目的:培養(yǎng)并鍛煉學(xué)生將心中已明確的算法落實到具體的程序語句上。

教師活動 這個時候巡查教室,檢查并了解學(xué)生完成情況,對部分有小問題的同學(xué)給予及時幫助。

組上有成績比較好的同學(xué)很快就把程序編寫完畢,我看了一下,選了一個同學(xué)到教室機給大家調(diào)試展示。該同學(xué)給出的程序如下:

main(){ int i,k=1;float s;for(i=1;i<=42;i++)k=k*2;/* k是紙張的張數(shù) */ s=k*0.1*1.0e-6;/* 將mm轉(zhuǎn)換成km */ printf(“將一張紙折42下的高度為:%.2f公里”,s);} 調(diào)試結(jié)果:將一張紙折42下的高度為:0.00公里.這個時候老師提問:為什么會出現(xiàn)0.00的情況?請同學(xué)們?yōu)樗赋鰡栴}。同學(xué)們思考了一會無人作答。這個時候老師提醒:k的值將會很大.結(jié)果部分同學(xué)作恍然大悟狀態(tài),有同學(xué)馬上舉手:老師,變量k的值不能定義為int,應(yīng)定義為long;問他為什么?他說:int類型的取值范圍是:32767,裝不下k。老師微笑表揚:方向?qū)α恕8暮茫{(diào)試,結(jié)果還是0.00公里。這個時候又有同學(xué)發(fā)言了:老師,不會定義為long都裝不下k吧。這個時候老師提問:如果整型數(shù)據(jù)long都裝不下的數(shù)據(jù)該定義為什么?學(xué)生回答:實型float。

改好,調(diào)試,Ok,成功!源程序如下 main(){ int i;float s,k=1;for(i=1;i<=42;i++)k=k*2;/* k是紙張的張數(shù) */ s=k*0.1*1.0e-6;/* 將mm轉(zhuǎn)換成km */ printf(“將一張紙折42下的高度為:%.2f公里”,s);} 調(diào)試結(jié)果:調(diào)試結(jié)果:將一張紙折42下的高度為:439804.66公里.全班同學(xué)的臉上都露出成功的喜悅。可同學(xué)們看到結(jié)果,表示不太相信,問老師,是不是算錯了,有這么高呀。老師作肯定的答復(fù):沒錯,就有這么高。比地球到月亮的距離(384,401公里)都還要高。這里可以告誡學(xué)生,科學(xué)不是憑想像,實踐出真知。

問題延伸:已知太陽離地球有1.5億公里,如果理想化的去折紙,最多折多少下有這么高?

學(xué)生分組討論,用什么語句最恰當(dāng)。得出結(jié)論。(用 do while語句)給同學(xué)們五分鐘,請同學(xué)們給出程序并且調(diào)試出結(jié)果。教師點評學(xué)生的程序,指出程序中容易出現(xiàn)錯誤的地方。源程序如下:

main(){ int i,k=1;float s;do { k=k*2;S=k*0.1*1.0e-6;i++;} while(s<=1.5e8);printf(“最多可折%d下有地球到太陽那么高”,i);} 案例反思:

通過這案例教學(xué)也給我留下了很多啟示:

1、根據(jù)C語言的學(xué)科特點,和學(xué)生的現(xiàn)狀,特別是根據(jù)學(xué)生平時厭理論而樂操作、解決實際問題能力較差的特點,采用案例教學(xué)可以充分調(diào)動學(xué)生學(xué)習(xí)C語言的興趣和積極性,使學(xué)生處于精神集中的狀態(tài),確保學(xué)生將知識真正學(xué)到手。通過新鮮的案例引領(lǐng)課堂,平時上課精神不集中的學(xué)生都認真分析問題了,個別平時打瞌睡的學(xué)生精神也集中了。

2、學(xué)生編程的信心需要老師去引導(dǎo)和激發(fā)。因為C語言程序?qū)τ谥新殞W(xué)生來講有些難度,部分學(xué)生一看到編程就放棄了,想都不會去想。這個時候老師就要從案例中去引導(dǎo)學(xué)生,和學(xué)生一起從案例去分析解決這個問題的算法,激發(fā)他們編程的嘗試。隨著程序的成功調(diào)試,信心就有了。一個人有了足夠的自信,他將有無窮的力量去面對將來的學(xué)習(xí)和生活。

第三篇:C語言程序設(shè)計教學(xué)安排

C語言程序設(shè)計教學(xué)安排

本課程的任務(wù)是結(jié)合一般數(shù)值計算向?qū)W生介紹計算機程序設(shè)計的基本知識,使學(xué)生掌握C語言的基本內(nèi)容及程序設(shè)計的基本方法與編程技巧,了解進行科學(xué)計算的一般思路,培養(yǎng)學(xué)生應(yīng)用計算機解決和處理實際問題的思維方法與基本能力,為進一步學(xué)習(xí)和應(yīng)用計算機打下基礎(chǔ)。本課程學(xué)時總計32學(xué)時。

二、課程內(nèi)容、基本要求與學(xué)時分配

㈠ C語言的基本概念

3學(xué)時

1.了解C語言的特點及發(fā)展

2.掌握程序的基本結(jié)構(gòu)與書寫格式

3.掌握頭文件、數(shù)據(jù)說明、函數(shù)的開始和結(jié)束標(biāo)志。

㈡ 數(shù)據(jù)類型及其運算

2學(xué)時

1.掌握數(shù)據(jù)類型(基本類型、構(gòu)造類型、指針類型、空類型)及其定義方法。

2.掌握運算符的種類、運算優(yōu)先級、結(jié)合性。

3.掌握不同類型數(shù)據(jù)間的轉(zhuǎn)換與運算。

4.掌握表達式類型(賦值表達式、算術(shù)表達式、關(guān)系表達式、邏輯表達式、條件表達式、逗號表達式)和求值規(guī)則。

㈢ 基本語句

2學(xué)時

1.掌握表達式語句、空語句、復(fù)合語句。

2.掌握數(shù)據(jù)的輸入/輸出和輸入/輸出函數(shù)。

3.掌握go to 語句和語句標(biāo)號的使用。

㈣ 選擇結(jié)構(gòu)

2學(xué)時

1.掌握用if語句實現(xiàn)選擇結(jié)構(gòu)。

2.掌握用switch語句實現(xiàn)多分支選擇結(jié)構(gòu)。

㈤ 循環(huán)結(jié)構(gòu)

4學(xué)時

1.掌握for循環(huán)結(jié)構(gòu)。

2.掌握while和do while循環(huán)結(jié)構(gòu)。

3.掌握continue、break、return語句。

4.掌握循環(huán)的嵌套。

㈥ 數(shù)組的定義和引用

4學(xué)時

1.掌握一維數(shù)組和多維數(shù)組的定義、初始化和引用。

2.掌握字符串與字符數(shù)組。

㈦函數(shù)

6學(xué)時

1.掌握庫函數(shù)的正確調(diào)用。

2.掌握函數(shù)的定義方法。

3.掌握函數(shù)的類型和返回值。

4.掌握形式參數(shù)與實在參數(shù)的區(qū)別,參數(shù)值的傳遞。

5.掌握函數(shù)的一般調(diào)用和嵌套調(diào)用,學(xué)會遞歸調(diào)用。

6.掌握局部變量和全局變量。

7.掌握變量的存儲類型(自動、靜態(tài)、寄存器、外部),變量的作用域和生存期。

8.了解內(nèi)部函數(shù)和外部函數(shù)。

㈧編譯預(yù)處理

1學(xué)時

1.掌握編譯預(yù)處理的概念和特點

2.了解帶參數(shù)的宏定義及其使用,掌握不帶參數(shù)的宏定義及其使用。

3.掌握“文件包含”的概念和使用。

㈨指針

8學(xué)時

1.掌握指針的概念及指針的定義。

2.掌握指針運算。

3.掌握指向變量、數(shù)組、字符串、函數(shù)的指針變量。

4.掌握用指針作函數(shù)參數(shù)。

5.掌握指針數(shù)組和指向指針的指針的概念及其定義方法,了解main函數(shù)的命令行參數(shù)。

㈩結(jié)構(gòu)與聯(lián)合 2學(xué)時

1.掌握結(jié)構(gòu)和聯(lián)合類型數(shù)據(jù)的定義方法。

2.掌握結(jié)構(gòu)和聯(lián)合類型數(shù)據(jù)的引用方法。3.掌握指向結(jié)構(gòu)體的指針變量。3.了解用typedef 定義類型的方法。

(十一)文件操作

2學(xué)時

1.掌握文件類型指針(file類型指針)。

2.掌握文件的打開與關(guān)閉(fopen和fclose函數(shù))。

3.掌握文件的讀與寫(fprintf和fscanf函數(shù))。

三、說明

本課程的先修課程為《計算機文化基礎(chǔ)》和《高等數(shù)學(xué)》

四、課程使用的教材和主要參考書

使用的教材:《C程序設(shè)計》

潭浩強 著

清華大學(xué)出版社

主要參考書:《C語言程序設(shè)計》 王樹義 錢達源 編著 大連理工大學(xué)出版社

第四篇:編游戲 C語言程序設(shè)計案例精編

編游戲 C語言程序設(shè)計案例精編.txt讓人想念而死,是謀殺的至高境界,就連法醫(yī)也鑒定不出死因。。。C語言 編游戲案例精編 案例一 貪吃蛇游戲 #define N 200 #include #include #include #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b int i,key;int score=0;/*得分*/ int gamespeed=50000;/*游戲速度自己調(diào)整*/ struct Food { int x;/*食物的橫坐標(biāo)*/ int y;/*食物的縱坐標(biāo)*/ int yes;/*判斷是否要出現(xiàn)食物的變量*/ }food;/*食物的結(jié)構(gòu)體*/ struct Snake { int x[N];int y[N];int node;/*蛇的節(jié)數(shù)*/ int direction;/*蛇移動方向*/ int life;/* 蛇的生命,0活著,1死亡*/ }snake;void Init(void);/*圖形驅(qū)動*/ void Close(void);/*圖形結(jié)束*/ void DrawK(void);/*開始畫面*/ void GameOver(void);/*結(jié)束游戲*/ void GamePlay(void);/*玩游戲具體過程*/ void PrScore(void);/*輸出成績*/ /*主函數(shù)*/ void main(void){ Init();/*圖形驅(qū)動*/ DrawK();/*開始畫面*/ GamePlay();/*玩游戲具體過程*/ Close();/*圖形結(jié)束*/ } /*圖形驅(qū)動*/ void Init(void){ int gd=DETECT,gm;initgraph(&gd,&gm,“c: c”);cleardevice();} /*開始畫面,左上角坐標(biāo)為(50,40),右下角坐標(biāo)為(610,460)的圍墻*/ void DrawK(void){ /*setbkcolor(LIGHTGREEN);*/ setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設(shè)置線型*/ for(i=50;i<=600;i+=10)/*畫圍墻*/ { rectangle(i,40,i+10,49);/*上邊*/ rectangle(i,451,i+10,460);/*下邊*/ } for(i=40;i<=450;i+=10){ rectangle(50,i,59,i+10);/*左邊*/ rectangle(601,i,610,i+10);/*右邊*/ } } /*玩游戲具體過程*/ void GamePlay(void){ randomize();/*隨機數(shù)發(fā)生器*/ food.yes=1;/*1表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物*/ snake.life=0;/*活著*/ snake.direction=1;/*方向往右*/ snake.x[0]=100;snake.y[0]=100;/*蛇頭*/ snake.x[1]=110;snake.y[1]=100;snake.node=2;/*節(jié)數(shù)*/ PrScore();/*輸出得分*/ while(1)/*可以重復(fù)玩游戲,壓ESC鍵結(jié)束*/ { while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/ { if(food.yes==1)/*需要出現(xiàn)新食物*/ { food.x=rand()%400+60;food.y=rand()%350+60;while(food.x%10!=0)/*食物隨機出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才可以讓蛇吃到*/

food.x++;while(food.y%10!=0)

food.y++;

food.yes=0;/*畫面上有食物了*/ } if(food.yes==0)/*畫面上有食物了就要顯示*/ { setcolor(GREEN);rectangle(food.x,food.y,food.x+10,food.y-10);} for(i=snake.node-1;i>0;i--)/*蛇的每個環(huán)節(jié)往前移動,也就是貪吃蛇的關(guān)鍵算法*/ { snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];} /*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/ switch(snake.direction){ case 1:snake.x[0]+=10;break;case 2: snake.x[0]-=10;break;case 3: snake.y[0]-=10;break;case 4: snake.y[0]+=10;break;} for(i=3;i595||snake.y[0]<55|| snake.y[0]>455)/*蛇是否撞到墻壁*/ { GameOver();/*本次游戲結(jié)束*/ snake.life=1;/*蛇死*/ } if(snake.life==1)/*以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開始*/ break;if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/ { setcolor(0);/*把畫面上的食物東西去掉*/ rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node]=-20;snake.y[snake.node]=-20;/*新的一節(jié)先放在看不見的位置,下次循環(huán)就取前一節(jié)的位置*/ snake.node++;/*蛇的身體長一節(jié)*/ food.yes=1;/*畫面上需要出現(xiàn)新的食物*/ score+=10;PrScore();/*輸出新得分*/ } setcolor(4);/*畫出蛇*/ for(i=0;i

snake.direction=2;else

if(key==DOWN&&snake.direction!=3)

snake.direction=4;}/*endwhile(1)*/ } /*游戲結(jié)束*/ void GameOver(void){ cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4);outtextxy(200,200,“GAME OVER”);getch();} /*輸出成績*/ void PrScore(void){ char str[10];setfillstyle(SOLID_FILL,YELLOW);bar(50,15,220,35);setcolor(6);settextstyle(0,0,2);sprintf(str,“score:%d”,score);outtextxy(55,20,str);} /*圖形結(jié)束*/ void Close(void){ getch();closegraph();}

案例二 計算器

#include /*DOS接口函數(shù)*/ #include /*數(shù)學(xué)函數(shù)的定義*/ #include /*屏幕操作函數(shù)*/ #include /*I/O函數(shù)*/ #include /*庫函數(shù)*/ #include /*變量長度參數(shù)表*/ #include /*圖形函數(shù)*/ #include /*字符串函數(shù)*/ #include /*字符操作函數(shù)*/ #define UP 0x48 /*光標(biāo)上移鍵*/ #define DOWN 0x50 /*光標(biāo)下移鍵*/ #define LEFT 0x4b /*光標(biāo)左移鍵*/ #define RIGHT 0x4d /*光標(biāo)右移鍵*/ #define ENTER 0x0d /*回車鍵*/ void *rar;/*全局變量,保存光標(biāo)圖象*/ struct palettetype palette;/*使用調(diào)色板信息*/ int GraphDriver;/* 圖形設(shè)備驅(qū)動*/ int GraphMode;/* 圖形模式值*/ int ErrorCode;/* 錯誤代碼*/ int MaxColors;/* 可用顏色的最大數(shù)值*/ int MaxX, MaxY;/* 屏幕的最大分辨率*/ double AspectRatio;/* 屏幕的像素比*/ void drawboder(void);/*畫邊框函數(shù)*/ void initialize(void);/*初始化函數(shù)*/ void computer(void);/*計算器計算函數(shù)*/ void changetextstyle(int font, int direction, int charsize);/*改變文本樣式函數(shù)*/ void mwindow(char *header);/*窗口函數(shù)*/ int specialkey(void);/*獲取特殊鍵函數(shù)*/ int arrow();/*設(shè)置箭頭光標(biāo)函數(shù)*/ /*主函數(shù)*/ int main(){ initialize();/* 設(shè)置系統(tǒng)進入圖形模式 */ computer();/*運行計算器 */ closegraph();/*系統(tǒng)關(guān)閉圖形模式返回文本模式*/ return(0);/*結(jié)束程序*/ } /* 設(shè)置系統(tǒng)進入圖形模式 */ void initialize(void){ int xasp, yasp;/* 用于讀x和y方向縱橫比*/ GraphDriver = DETECT;/* 自動檢測顯示器*/ initgraph(&GraphDriver, &GraphMode, “");/*初始化圖形系統(tǒng)*/ ErrorCode = graphresult();/*讀初始化結(jié)果*/ if(ErrorCode!= grOk)/*如果初始化時出現(xiàn)錯誤*/ { printf(”Graphics System Error: %sn“, grapherrormsg(ErrorCode));/*顯示錯誤代碼*/ exit(1);/*退出*/ } getpalette(&palette);/* 讀面板信息*/ MaxColors = getmaxcolor()+ 1;/* 讀取顏色的最大值*/ MaxX = getmaxx();/* 讀屏幕尺寸 */ MaxY = getmaxy();/* 讀屏幕尺寸 */ getaspectratio(&xasp, &yasp);/* 拷貝縱橫比到變量中*/ AspectRatio =(double)xasp/(double)yasp;/* 計算縱橫比值*/ } /*計算器函數(shù)*/ void computer(void){ struct viewporttype vp;/*定義視口類型變量*/ int color, height, width;int x, y,x0,y0, i, j,v,m,n,act,flag=1;float num1=0,num2=0,result;/*操作數(shù)和計算結(jié)果變量*/ char cnum[5],str2[20]={”“},c,temp[20]={”“};char str1[]=”1230.456+-789*/Qc=^%“;/* 定義字符串在按鈕圖形上顯示的符號 */ mwindow(”Calculator“);/* 顯示主窗口 */ color = 7;/*設(shè)置灰顏色值*/ getviewsettings(&vp);/* 讀取當(dāng)前窗口的大小*/ width=(vp.right+1)/10;/* 設(shè)置按鈕寬度 */ height=(vp.bottom-10)/10;/*設(shè)置按鈕高度 */ x = width /2;/*設(shè)置x的坐標(biāo)值*/ y = height/2;/*設(shè)置y的坐標(biāo)值*/ setfillstyle(SOLID_FILL, color+3);bar(x+width*2, y, x+7*width, y+height);/*畫一個二維矩形條顯示運算數(shù)和結(jié)果*/ setcolor(color+3);/*設(shè)置淡綠顏色邊框線*/ rectangle(x+width*2, y, x+7*width, y+height);/*畫一個矩形邊框線*/ setcolor(RED);/*設(shè)置顏色為紅色*/ outtextxy(x+3*width,y+height/2,”0.“);/*輸出字符串”0.“*/ x =2*width-width/2;/*設(shè)置x的坐標(biāo)值*/ y =2*height+height/2;/*設(shè)置y的坐標(biāo)值*/ for(j=0;j<4;++j)/*畫按鈕*/ { for(i=0;i<5;++i){ setfillstyle(SOLID_FILL, color);setcolor(RED);bar(x, y, x+width, y+height);/*畫一個矩形條*/ rectangle(x, y, x+width, y+height);sprintf(str2,”%c“,str1[j*5+i]);/*將字符保存到str2中*/ outtextxy(x+(width/2), y+height/2, str2);x =x+width+(width / 2);/*移動列坐標(biāo)*/ } y +=(height/2)*3;/* 移動行坐標(biāo)*/ x =2*width-width/2;/*復(fù)位列坐標(biāo)*/ } x0=2*width;y0=3*height;x=x0;y=y0;gotoxy(x,y);/*移動光標(biāo)到x,y位置*/ arrow();/*顯示光標(biāo)*/ putimage(x,y,rar,XOR_PUT);m=0;n=0;strcpy(str2,”“);/*設(shè)置str2為空串*/ while((v=specialkey())!=45)/*當(dāng)壓下Alt+x鍵結(jié)束程序,否則執(zhí)行下面的循環(huán)*/ { while((v=specialkey())!=ENTER)/*當(dāng)壓下鍵不是回車時*/ { putimage(x,y,rar,XOR_PUT);/*顯示光標(biāo)圖象*/ if(v==RIGHT)/*右移箭頭時新位置計算*/ if(x>=x0+6*width)/*如果右移,移到尾,則移動到最左邊字符位置*/ {

x=x0;

m=0;} else {

x=x+width+width/2;

m++;} /*否則,右移到下一個字符位置*/ if(v==LEFT)/*左移箭頭時新位置計算*/ if(x<=x0){

x=x0+6*width;

m=4;} /*如果移到頭,再左移,則移動到最右邊字符位置*/ else {

x=x-width-width/2;

m--;} /*否則,左移到前一個字符位置*/ if(v==UP)/*上移箭頭時新位置計算*/ if(y<=y0){

y=y0+4*height+height/2;

n=3;} /*如果移到頭,再上移,則移動到最下邊字符位置*/ else { y=y-height-height/2;n--;} /*否則,移到上邊一個字符位置*/ if(v==DOWN)/*下移箭頭時新位置計算*/ if(y>=7*height){

y=y0;n=0;} /*如果移到尾,再下移,則移動到最上邊字符位置*/ else {

y=y+height+height/2;

n++;} /*否則,移到下邊一個字符位置*/ putimage(x,y,rar,XOR_PUT);/*在新的位置顯示光標(biāo)箭頭*/ } c=str1[n*5+m];/*將字符保存到變量c中*/ if(isdigit(c)||c=='.')/*判斷是否是數(shù)字或小數(shù)點*/ { if(flag==-1)/*如果標(biāo)志為-1,表明為負數(shù)*/ { strcpy(str2,”-“);/*將負號連接到字符串中*/ flag=1;} /*將標(biāo)志值恢復(fù)為1*/ sprintf(temp,”%c“,c);/*將字符保存到字符串變量temp中*/ strcat(str2,temp);/*將temp中的字符串連接到str2中*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,str2);/*顯示字符串*/ } if(c=='+'){ num1=atof(str2);/*將第一個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=1;/*做計算加法標(biāo)志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='-'){ if(strcmp(str2,”“)==0)/*如果str2為空,說明是負號,而不是減號*/ flag=-1;/*設(shè)置負數(shù)標(biāo)志*/ else { num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=2;/*做計算減法標(biāo)志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);/*畫矩形*/ outtextxy(5*width,height,”0.“);/*顯示字符串*/ } } if(c=='*'){ num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=3;/*做計算乘法標(biāo)志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='/'){ num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=4;/*做計算除法標(biāo)志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='^'){ num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=5;/*做計算乘方標(biāo)志值*/ setfillstyle(SOLID_FILL,color+3);/*設(shè)置用淡綠色實體填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*畫矩形*/ outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='%'){ num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=6;/*做計算模運算乘方標(biāo)志值*/ setfillstyle(SOLID_FILL,color+3);/*設(shè)置用淡綠色實體填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*畫矩形*/ outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='='){ num2=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ switch(act)/*根據(jù)運算符號計算*/ { case 1:result=num1+num2;break;/*做加法*/ case 2:result=num1-num2;break;/*做減法*/ case 3:result=num1*num2;break;/*做乘法*/ case 4:result=num1/num2;break;/*做除法*/ case 5:result=pow(num1,num2);break;/*做x的y次方*/ case 6:result=fmod(num1,num2);break;/*做模運算*/ } setfillstyle(SOLID_FILL,color+3);/*設(shè)置用淡綠色實體填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆蓋結(jié)果區(qū)*/ sprintf(temp,”%f“,result);/*將結(jié)果保存到temp中*/ outtextxy(5*width,height,temp);/*顯示結(jié)果*/ } if(c=='c'){ num1=0;/*將兩個操作數(shù)復(fù)位0,符號標(biāo)志為1*/ num2=0;flag=1;strcpy(str2,”“);/*將str2清空*/ setfillstyle(SOLID_FILL,color+3);/*設(shè)置用淡綠色實體填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆蓋結(jié)果區(qū)*/ outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='Q')exit(0);/*如果選擇了q回車,結(jié)束計算程序*/ } putimage(x,y,rar,XOR_PUT);/*在退出之前消去光標(biāo)箭頭*/ return;/*返回*/ } /*窗口函數(shù)*/ void mwindow(char *header){ int height;cleardevice();

/* 清除圖形屏幕 */ setcolor(MaxColors1);/*設(shè)置當(dāng)前顏色為白色 */ setlinestyle(SOLID_LINE, 0, NORM_WIDTH);/*設(shè)置畫線方式*/ getviewsettings(&vp);/*將當(dāng)前視口信息裝入vp所指的結(jié)構(gòu)中*/ rectangle(0, 0, vp.right-vp.left, vp.bottom-vp.top);/*畫矩形邊框*/ } /*設(shè)計鼠標(biāo)圖形函數(shù)*/ int arrow(){ int size;int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4};/*定義多邊形坐標(biāo)*/ setfillstyle(SOLID_FILL,2);/*設(shè)置填充模式*/ fillpoly(8,raw);/*畫出一光標(biāo)箭頭*/ size=imagesize(4,4,16,16);/*測試圖象大小*/ rar=malloc(size);/*分配內(nèi)存區(qū)域*/ getimage(4,4,16,16,rar);/*存放光標(biāo)箭頭圖象*/ putimage(4,4,rar,XOR_PUT);/*消去光標(biāo)箭頭圖象*/ return 0;} /*按鍵函數(shù)*/ int specialkey(void){ int key;while(bioskey(1)==0);/*等待鍵盤輸入*/ key=bioskey(0);/*鍵盤輸入*/ key=key&0xff? key&0xff:key>>8;/*只取特殊鍵的掃描值,其余為0*/ return(key);/*返回鍵值*/ }

案例三 黑白棋游戲

#include ”graphics.h“ /*圖形系統(tǒng)頭文件*/ #define LEFT 0x4b00 /*光標(biāo)左鍵值*/ #define RIGHT 0x4d00 /*光標(biāo)右鍵值*/ #define DOWN 0x5000 /*光標(biāo)下鍵值*/ #define UP 0x4800 /*光標(biāo)上鍵值*/ #define ESC 0x011b /* ESC鍵值*/ #define ENTER 0x1c0d /* 回車鍵值*/ int a[8][8]={0},key,score1,score2;/*具體分數(shù)以及按鍵與存放棋子的變量*/ char playone[3],playtwo[3];/*兩個人的得分轉(zhuǎn)換成字符串輸出*/ void playtoplay(void);/*人人對戰(zhàn)函數(shù)*/ void DrawQp(void);/*畫棋盤函數(shù)*/ void SetPlayColor(int x);/*設(shè)置棋子第一次的顏色*/ void MoveColor(int x,int y);/*恢復(fù)原來棋盤狀態(tài)*/ int QpChange(int x,int y,int z);/*判斷棋盤的變化*/ void DoScore(void);/*處理分數(shù)*/ void PrintScore(int n);/*輸出成績*/ void playWin(void);/*輸出勝利者信息*/ /******主函數(shù)*********/ void main(void){ int gd=DETECT,gr;initgraph(&gd,&gr,”c: c“);/*初始化圖形系統(tǒng)*/ DrawQp();/*畫棋盤*/ playtoplay();/*人人對戰(zhàn)*/ getch();closegraph();/*關(guān)閉圖形系統(tǒng)*/ } void DrawQp()/*畫棋盤*/ { int i,j;score1=score2=0;/*棋手一開始得分都為0*/ setbkcolor(BLUE);for(i=100;i<=420;i+=40){ line(100,i,420,i);/*畫水平線*/ line(i,100,i,420);/*畫垂直線*/ } setcolor(0);/*取消圓周圍的一圈東西*/ setfillstyle(SOLID_FILL,15);/*白色實體填充模式*/ fillellipse(500,200,15,15);/*在顯示得分的位置畫棋*/ setfillstyle(SOLID_FILL,8);/*黑色實體填充模式*/ fillellipse(500,300,15,15);a[3][3]=a[4][4]=1;/*初始兩個黑棋*/ a[3][4]=a[4][3]=2;/*初始兩個白棋*/ setfillstyle(SOLID_FILL,WHITE);fillellipse(120+3*40,120+3*40,15,15);fillellipse(120+4*40,120+4*40,15,15);setfillstyle(SOLID_FILL,8);fillellipse(120+3*40,120+4*40,15,15);fillellipse(120+4*40,120+3*40,15,15);score1=score2=2;/*有棋后改變分數(shù)*/ DoScore();/*輸出開始分數(shù)*/ } void playtoplay()/*人人對戰(zhàn)*/ { int x,y,t=1,i,j,cc=0;while(1)/*換棋手走棋*/ { x=120,y=80;/*每次棋子一開始出來的坐標(biāo),x為行坐標(biāo),y為列坐標(biāo)*/ while(1)/*具體一個棋手走棋的過程*/ { PrintScore(1);/*輸出棋手1的成績*/ PrintScore(2);/*輸出棋手2的成績*/ SetPlayColor(t);/*t變量是用來判斷棋手所執(zhí)棋子的顏色*/ fillellipse(x,y,15,15);key=bioskey(0);/*接收按鍵*/ if(key==ESC)/*跳出游戲*/ break;else if(key==ENTER)/*如果按鍵確定就可以跳出循環(huán)*/ { if(y!=80&&a[(x-120)/40][(y-120)/40]!=1 &&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置沒有棋子*/ { if(t%2==1)/*如果是棋手1移動*/

a[(x-120)/40][(y-120)/40]=1;else/*否則棋手2移動*/

a[(x-120)/40][(y-120)/40]=2;if(!QpChange(x,y,t))/*落子后判斷棋盤的變化*/ { a[(x-120)/40][(y-120)/40]=0;/*恢復(fù)空格狀態(tài)*/ cc++;/*開始統(tǒng)計嘗試次數(shù)*/ if(cc>=64-score1-score2)/*如果嘗試超過空格數(shù)則停步*/ {

MoveColor(x,y);

fillellipse(x,y,15,15);

break;} else

continue;/*如果按鍵無效*/ } DoScore();/*分數(shù)的改變*/ break;/*棋盤變化了,則輪對方走棋*/ } else/*已經(jīng)有棋子就繼續(xù)按鍵*/ continue;} else /*四個方向按鍵的判斷*/ if(key==LEFT&&x>120)/*左方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x-=40;fillellipse(x,y,15,15);} else if(key==RIGHT&&x<400&&y>80)/*右方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x+=40;fillellipse(x,y,15,15);} else if(key==UP&&y>120)/*上方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y-=40;fillellipse(x,y,15,15);} else if(key==DOWN&&y<400)/*下方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y+=40;fillellipse(x,y,15,15);} } if(key==ESC)/*結(jié)束游戲*/ break;if((score1+score2)==64||score1==0||score2==0)/*格子已經(jīng)占滿或一方棋子為0判斷勝負*/ { playWin();/*輸出最后結(jié)果*/ break;} t=t%2+1;/*一方走后,改變棋子顏色即輪對方走*/ cc=0;/*計數(shù)值恢復(fù)為0*/ } /*endwhile*/ } void SetPlayColor(int t)/*設(shè)置棋子顏色*/ { if(t%2==1)setfillstyle(SOLID_FILL,15);/*白色*/ else setfillstyle(SOLID_FILL,8);/*灰色*/ } void MoveColor(int x,int y)/*走了一步后恢復(fù)原來格子的狀態(tài)*/ { if(y<100)/*如果是從起點出發(fā)就恢復(fù)藍色*/ setfillstyle(SOLID_FILL,BLUE);else/*其他情況如果是1就恢復(fù)白色棋子,2恢復(fù)黑色棋子,或恢復(fù)藍色棋盤*/ switch(a[(x-120)/40][(y-120)/40]){ case 1: setfillstyle(SOLID_FILL,15);break;/*白色*/ case 2: setfillstyle(SOLID_FILL,8);break;/*黑色*/ default: setfillstyle(SOLID_FILL,BLUE);/*藍色*/ } } int QpChange(int x,int y,int t)/*判斷棋盤的變化*/ { int i,j,k,kk,ii,jj,yes;yes=0;i=(x-120)/40;/*計算數(shù)組元素的行下標(biāo)*/ j=(y-120)/40;/*計算數(shù)組元素的列下標(biāo)*/ SetPlayColor(t);/*設(shè)置棋子變化的顏色*/ /*開始往8個方向判斷變化*/ if(j<6)/*往右邊*/ { for(k=j+1;k<8;k++)if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格結(jié)束*/ break;if(a[i][k]!=0&&k<8){ for(kk=j+1;kk1)/*判斷左邊*/ { for(k=j-1;k>=0;k--)if(a[i][k]==a[i][j]||!a[i][k])break;if(a[i][k]!=0&&k>=0){ for(kk=j-1;kk>k&&k>=0;kk--){ a[i][kk]=a[i][j];fillellipse(120+i*40,120+kk*40,15,15);} if(kk!=j-1)yes=1;} } if(i<6)/*判斷下邊*/ { for(k=i+1;k<8;k++)if(a[k][j]==a[i][j]||!a[k][j])break;if(a[k][j]!=0&&k<8){ for(kk=i+1;kk1)/*判斷上邊*/ { for(k=i-1;k>=0;k--)if(a[k][j]==a[i][j]||!a[k][j])break;if(a[k][j]!=0&&k>=0){ for(kk=i-1;kk>k&&k>=0;kk--){ a[kk][j]=a[i][j];fillellipse(120+kk*40,120+j*40,15,15);} if(kk!=i-1)yes=1;} } if(i>1&&j<6)/*右上*/ { for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]&&k>=0&&kk<8){ for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++){ a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);} if(ii!=i-1)yes=1;} } if(i<6&&j>1)/*左下*/ { for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k<8&&kk>=0){ for(ii=i+1,jj=j-1;ii1&&j>1)/*左上*/ { for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k>=0&&kk>=0){ for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--){ a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);} if(ii!=i-1)yes=1;} } if(i<6&&j<6)/* 右下*/ { for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&kk<8&&k<8){ for(ii=i+1,jj=j+1;iiscore1)/*開始判斷最后的結(jié)果*/ outtextxy(100,50,”black win!“);else if(score2

案例四 迷宮問題

#include #include #include #include #include #define N 20/*迷宮的大小,可改變*/ int oldmap[N][N];/*遞歸用的數(shù)組,用全局變量節(jié)約時間*/ int yes=0;/*yes是判斷是否找到路的標(biāo)志,1找到,0沒找到*/ int way[100][2],wayn=0;/*way數(shù)組是顯示路線用的,wayn是統(tǒng)計走了幾個格子*/ void Init(void);/*圖形初始化*/ void Close(void);/*圖形關(guān)閉*/ void DrawPeople(int *x,int *y,int n);/*畫人工探索物圖*/ void PeopleFind(int(*x)[N]);/*人工探索*/ void WayCopy(int(*x)[N],int(*y)[N]);/*為了8個方向的遞歸,把舊迷宮圖拷貝給新數(shù)組*/ int FindWay(int(*x)[N],int i,int j);/*自動探索函數(shù)*/ void MapRand(int(*x)[N]);/*隨機生成迷宮函數(shù)*/ void PrMap(int(*x)[N]);/*輸出迷宮圖函數(shù)*/ void Result(void);/*輸出結(jié)果處理*/ void Find(void);/*成功處理*/ void NotFind(void);/*失敗處理*/ void main(void)/*主函數(shù)*/ { int map[N][N];/*迷宮數(shù)組*/ char ch;clrscr();printf(”n Please select hand(1)else auton“);/*選擇探索方式*/ scanf(”%c“,&ch);Init();/*初始化*/ MapRand(map);/*生成迷宮*/ PrMap(map);/*顯示迷宮圖*/ if(ch=='1')PeopleFind(map);/*人工探索*/ else FindWay(map,1,1);/*系統(tǒng)自動從下標(biāo)1,1的地方開始探索*/ Result();/*輸出結(jié)果*/ Close();} void Init(void)/*圖形初始化*/ { int gd=DETECT,gm;initgraph(&gd,&gm,”c: c“);} void DrawPeople(int *x,int *y,int n)/*畫人工控制圖*/ {/*如果將以下兩句注釋掉,則顯示人工走過的路徑,*/ setfillstyle(SOLID_FILL,WHITE);/*設(shè)置白色實體填充樣式*/ bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);/*恢復(fù)原通路*/ switch(n)/*判斷x,y的變化,8個方向的變化*/ { case 1:(*x)--;break;/*上*/ case 2:(*x)--;(*y)++;break;/*右上*/ case 3:(*y)++;break;/*右*/ case 4:(*x)++;(*y)++;break;/*右下*/ case 5:(*x)++;break;/*下*/ case 6:(*x)++;(*y)--;break;/*左下*/ case 7:(*y)--;break;/*左*/ case 8:(*x)--;(*y)--;break;/*左上*/ } setfillstyle(SOLID_FILL,RED);/*新位置顯示探索物*/ bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);} void PeopleFind(int(*map)[N])/*人工手動查找*/ { int x,y;char c=0;/*接收按鍵的變量*/ x=y=1;/*人工查找的初始位置*/ setcolor(11);line(500,200,550,200);outtextxy(570,197,”d“);line(500,200,450,200);outtextxy(430,197,”a“);line(500,200,500,150);outtextxy(497,130,”w“);line(500,200,500,250);outtextxy(497,270,”x“);line(500,200,450,150);outtextxy(445,130,”q“);line(500,200,550,150);outtextxy(550,130,”e“);line(500,200,450,250);outtextxy(445,270,”z“);line(500,200,550,250);outtextxy(550,270,”c“);/*以上是畫8個方向的控制介紹*/ setcolor(YELLOW);outtextxy(420,290,”Press 'Enter' to end“);/*壓回車鍵結(jié)束*/ setfillstyle(SOLID_FILL,RED);bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);/*入口位置顯示*/ while(c!=13)/*如果按下的不是回車鍵*/ { c=getch();/*接收字符后開始各個方向的探索*/ if(c=='w'&&map[x-1][y]!=1)DrawPeople(&x,&y,1);/*上*/ else if(c=='e'&&map[x-1][y+1]!=1)DrawPeople(&x,&y,2);/*右上*/ else if(c=='d'&&map[x][y+1]!=1)DrawPeople(&x,&y,3);/*右*/ else if(c=='c'&&map[x+1][y+1]!=1)

DrawPeople(&x,&y,4);/*右下*/ else

if(c=='x'&&map[x+1][y]!=1)

DrawPeople(&x,&y,5);/*下*/

else

if(c=='z'&&map[x+1][y-1]!=1)

DrawPeople(&x,&y,6);/*左下*/

else

if(c=='a'&&map[x][y-1]!=1)

DrawPeople(&x,&y,7);/*左*/

else if(c=='q'&&map[x-1][y-1]!=1)

DrawPeople(&x,&y,8);/*左上*/ } setfillstyle(SOLID_FILL,WHITE);/*消去紅色探索物,恢復(fù)原迷宮圖*/ bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);if(x==N-2&&y==N-2)/*人工控制找成功的話*/ yes=1;/*如果成功標(biāo)志為1*/ } void WayCopy(int(*oldmap)[N],int(*map)[N])/*拷貝迷宮數(shù)組 */ { int i,j;for(i=0;i=0;i--){ bar(100+way[i][1]*15-6,50+way[i][0]*15-6,100+ way[i][1]*15+6,50+way[i][0]*15+6);sleep(1);/*控制顯示時間*/ } bar(100+(N-2)*15-6,50+(N-2)*15-6,100+(N-2)*15+6,50+(N-2)*15+6);/*在目標(biāo)點標(biāo)紅色*/ setcolor(GREEN);settextstyle(0,0,2);/*設(shè)置字體大小*/ outtextxy(130,400,”Find a way!“);} void NotFind(void)/*沒找到通路*/ { setcolor(GREEN);settextstyle(0,0,2);/*設(shè)置字體大小*/ outtextxy(130,400,”Not find a way!“);} void Result(void)/*結(jié)果處理*/ { if(yes)/*如果找到*/ Find();else/*沒找到路*/ NotFind();getch();} void Close(void)/*圖形關(guān)閉*/ { closegraph();}

案例五 掃地雷游戲 #include #include #include #define LEFTPRESS 0xff01 #define LEFTCLICK 0xff10 #define LEFTDRAG 0xff19 #define MOUSEMOVE 0xff08 struct { int num;/*格子當(dāng)前處于什么狀態(tài),1有雷,0已經(jīng)顯示過數(shù)字或者空白格子*/ int roundnum;/*統(tǒng)計格子周圍有多少雷*/ int flag;/*右鍵按下顯示紅旗的標(biāo)志,0沒有紅旗標(biāo)志,1有紅旗標(biāo)志*/ }Mine[10][10];int gameAGAIN=0;/*是否重來的變量*/ int gamePLAY=0;/*是否是第一次玩游戲的標(biāo)志*/ int mineNUM;/*統(tǒng)計處理過的格子數(shù)*/ char randmineNUM[3];/*顯示數(shù)字的字符串*/ int Keystate;int MouseExist;int MouseButton;int MouseX;int MouseY;void Init(void);/*圖形驅(qū)動*/ void MouseOn(void);/*鼠標(biāo)光標(biāo)顯示*/ void MouseOff(void);/*鼠標(biāo)光標(biāo)隱藏*/ void MouseSetXY(int,int);/*設(shè)置當(dāng)前位置*/ int LeftPress(void);/*左鍵按下*/ int RightPress(void);/*鼠標(biāo)右鍵按下*/ void MouseGetXY(void);/*得到當(dāng)前位置*/ void Control(void);/*游戲開始,重新,關(guān)閉*/ void GameBegain(void);/*游戲開始畫面*/ void DrawSmile(void);/*畫笑臉*/ void DrawRedflag(int,int);/*顯示紅旗*/ void DrawEmpty(int,int,int,int);/*兩種空格子的顯示*/ void GameOver(void);/*游戲結(jié)束*/ void GameWin(void);/*顯示勝利*/ int MineStatistics(int,int);/*統(tǒng)計每個格子周圍的雷數(shù)*/ int ShowWhite(int,int);/*顯示無雷區(qū)的空白部分*/ void GamePlay(void);/*游戲過程*/ void Close(void);/*圖形關(guān)閉*/ void main(void){ Init();Control();Close();} void Init(void)/*圖形開始*/ { int gd=DETECT,gm;initgraph(&gd,&gm,”c: c“);} void Close(void)/*圖形關(guān)閉*/ { closegraph();} void MouseOn(void)/*鼠標(biāo)光標(biāo)顯示*/ { _AX=0x01;geninterrupt(0x33);} void MouseOff(void)/*鼠標(biāo)光標(biāo)隱藏*/ { _AX=0x02;geninterrupt(0x33);} void MouseSetXY(int x,int y)/*設(shè)置當(dāng)前位置*/ { _CX=x;_DX=y;_AX=0x04;geninterrupt(0x33);} int LeftPress(void)/*鼠標(biāo)左鍵按下*/ { _AX=0x03;geninterrupt(0x33);return(_BX&1);} int RightPress(void)/*鼠標(biāo)右鍵按下*/ { _AX=0x03;geninterrupt(0x33);return(_BX&2);} void MouseGetXY(void)/*得到當(dāng)前位置*/ { _AX=0x03;geninterrupt(0x33);MouseX=_CX;MouseY=_DX;} void Control(void)/*游戲開始,重新,關(guān)閉*/ { int gameFLAG=1;/*游戲失敗后判斷是否重新開始的標(biāo)志*/ while(1){ if(gameFLAG)/*游戲失敗后沒判斷出重新開始或者退出游戲的話就繼續(xù)判斷*/ { GameBegain();/*游戲初始畫面*/ GamePlay();/*具體游戲*/ if(gameAGAIN==1)/*游戲中重新開始*/ { gameAGAIN=0;continue;} } MouseOn();gameFLAG=0;if(LeftPress())/*判斷是否重新開始*/ { MouseGetXY();if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85){ gameFLAG=1;continue;} } if(kbhit())/*判斷是否按鍵退出*/ break;} MouseOff();} void DrawSmile(void)/*畫笑臉*/ { setfillstyle(SOLID_FILL,YELLOW);fillellipse(290,75,10,10);setcolor(YELLOW);setfillstyle(SOLID_FILL,BLACK);/*眼睛*/ fillellipse(285,75,2,2);fillellipse(295,75,2,2);setcolor(BLACK);/*嘴巴*/ bar(287,80,293,81);} void DrawRedflag(int i,int j)/*顯示紅旗*/ { setcolor(7);setfillstyle(SOLID_FILL,RED);bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);setcolor(BLACK);line(198+j*20,95+i*20,198+j*20,95+i*20+10);} void DrawEmpty(int i,int j,int mode,int color)/*兩種空格子的顯示*/ { setcolor(color);setfillstyle(SOLID_FILL,color);if(mode==0)/*沒有單擊過的大格子*/ bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);else if(mode==1)/*單擊過后顯示空白的小格子*/ bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);} void GameBegain(void)/*游戲開始畫面*/ { int i,j;cleardevice();if(gamePLAY!=1){ MouseSetXY(290,70);/*鼠標(biāo)一開始的位置,并作為它的初始坐標(biāo)*/ MouseX=290;MouseY=70;} gamePLAY=1;/*下次按重新開始的話鼠標(biāo)不重新初始化*/ mineNUM=0;setfillstyle(SOLID_FILL,7);bar(190,60,390,290);for(i=0;i<10;i++)/*畫格子*/ for(j=0;j<10;j++)DrawEmpty(i,j,0,8);setcolor(7);DrawSmile();/*畫臉*/ randomize();for(i=0;i<10;i++)/*100個格子隨機賦值有沒有地雷*/ for(j=0;j<10;j++){ Mine[i][j].num=random(8);/*如果隨機數(shù)的結(jié)果是1表示這個格子有地雷*/ if(Mine[i][j].num==1)mineNUM++;/*現(xiàn)有雷數(shù)加1*/ else Mine[i][j].num=2;Mine[i][j].flag=0;/*表示沒紅旗標(biāo)志*/ } sprintf(randmineNUM,”%d“,mineNUM);/*顯示這次總共有多少雷數(shù)*/ setcolor(1);settextstyle(0,0,2);outtextxy(210,70,randmineNUM);mineNUM=100-mineNUM;/*變量取空白格數(shù)量*/ MouseOn();} void GameOver(void)/*游戲結(jié)束畫面*/ { int i,j;setcolor(0);for(i=0;i<10;i++)for(j=0;j<10;j++)if(Mine[i][j].num==1)/*顯示所有的地雷*/ { DrawEmpty(i,j,0,RED);setfillstyle(SOLID_FILL,BLACK);fillellipse(200+j*20,100+i*20,7,7);} } void GameWin(void)/*顯示勝利*/ { setcolor(11);settextstyle(0,0,2);outtextxy(230,30,”YOU WIN!“);} int MineStatistics(int i,int j)/*統(tǒng)計每個格子周圍的雷數(shù)*/ { int nNUM=0;if(i==0&&j==0)/*左上角格子的統(tǒng)計*/ { if(Mine[0][1].num==1)nNUM++;if(Mine[1][0].num==1)nNUM++;if(Mine[1][1].num==1)nNUM++;} else if(i==0&&j==9)/*右上角格子的統(tǒng)計*/ { if(Mine[0][8].num==1)nNUM++;if(Mine[1][9].num==1)nNUM++;if(Mine[1][8].num==1)nNUM++;} else if(i==9&&j==0)/*左下角格子的統(tǒng)計*/ { if(Mine[8][0].num==1)nNUM++;if(Mine[9][1].num==1)nNUM++;if(Mine[8][1].num==1)nNUM++;} else

if(i==9&&j==9)/*右下角格子的統(tǒng)計*/ { if(Mine[9][8].num==1)nNUM++;if(Mine[8][9].num==1)nNUM++;if(Mine[8][8].num==1)nNUM++;} else if(j==0)/*左邊第一列格子的統(tǒng)計*/ { if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j+1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;} else if(j==9)/*右邊第一列格子的統(tǒng)計*/ { if(Mine[i][j-1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j-1].num==1)nNUM++;if(Mine[i+1][j-1].num==1)nNUM++;} else if(i==0)/*第一行格子的統(tǒng)計*/ { if(Mine[i+1][j].num==1)nNUM++;if(Mine[i][j-1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j-1].num==1)

nNUM++;if(Mine[i+1][j+1].num==1)

nNUM++;} else if(i==9)/*最后一行格子的統(tǒng)計*/ { if(Mine[i-1][j].num==1)

nNUM++;if(Mine[i][j-1].num==1)

nNUM++;if(Mine[i][j+1].num==1)

nNUM++;if(Mine[i-1][j-1].num==1)

nNUM++;if(Mine[i-1][j+1].num==1)

nNUM++;} else/*普通格子的統(tǒng)計*/ { if(Mine[i-1][j].num==1)

nNUM++;if(Mine[i-1][j+1].num==1)

nNUM++;if(Mine[i][j+1].num==1)

nNUM++;if(Mine[i+1][j+1].num==1)

nNUM++;if(Mine[i+1][j].num==1)

nNUM++;if(Mine[i+1][j-1].num==1)

nNUM++;if(Mine[i][j-1].num==1)

nNUM++;if(Mine[i-1][j-1].num==1)

nNUM++;} return(nNUM);/*把格子周圍一共有多少雷數(shù)的統(tǒng)計結(jié)果返回*/ } int ShowWhite(int i,int j)/*顯示無雷區(qū)的空白部分*/ { if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有紅旗或該格處理過就不對該格進行任何判斷*/ return;mineNUM--;/*顯示過數(shù)字或者空格的格子就表示多處理了一個格子,當(dāng)所有格子都處理過了表示勝利*/ if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*顯示空格*/ { DrawEmpty(i,j,1,7);Mine[i][j].num=0;} else if(Mine[i][j].roundnum!=0)/*輸出雷數(shù)*/ { DrawEmpty(i,j,0,8);sprintf(randmineNUM,”%d“,Mine[i][j].roundnum);setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);Mine[i][j].num=0;/*已經(jīng)輸出雷數(shù)的格子用0表示已經(jīng)用過這個格子*/ return;} /*8個方向遞歸顯示所有的空白格子*/ if(i!=0&&Mine[i-1][j].num!=1)ShowWhite(i-1,j);if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)ShowWhite(i-1,j+1);if(j!=9&&Mine[i][j+1].num!=1)ShowWhite(i,j+1);if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)ShowWhite(i+1,j+1);if(i!=9&&Mine[i+1][j].num!=1)ShowWhite(i+1,j);if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)ShowWhite(i+1,j-1);if(j!=0&&Mine[i][j-1].num!=1)ShowWhite(i,j-1);if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)ShowWhite(i-1,j-1);} void GamePlay(void)/*游戲過程*/ { int i,j,Num;/*Num用來接收統(tǒng)計函數(shù)返回一個格子周圍有多少地雷*/ for(i=0;i<10;i++)for(j=0;j<10;j++)Mine[i][j].roundnum=MineStatistics(i,j);/*統(tǒng)計每個格子周圍有多少地雷*/ while(!kbhit()){ if(LeftPress())/*鼠標(biāo)左鍵盤按下*/ {

*/

*/

MouseGetXY();if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新來*/ { MouseOff();gameAGAIN=1;break;} if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當(dāng)前鼠標(biāo)位置在格子范圍內(nèi) { j=(MouseX-190)/20;/*x坐標(biāo)*/ i=(MouseY-90)/20;/*y坐標(biāo)*/ if(Mine[i][j].flag==1)/*如果格子有紅旗則左鍵無效*/ continue;if(Mine[i][j].num!=0)/*如果格子沒有處理過*/ { if(Mine[i][j].num==1)/*鼠標(biāo)按下的格子是地雷*/ { MouseOff();GameOver();/*游戲失敗*/ break;} else/*鼠標(biāo)按下的格子不是地雷*/ { MouseOff();Num=MineStatistics(i,j);if(Num==0)/*周圍沒地雷就用遞歸算法來顯示空白格子*/ ShowWhite(i,j);else/*按下格子周圍有地雷*/ { sprintf(randmineNUM,”%d“,Num);/*輸出當(dāng)前格子周圍的雷數(shù)*/ setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);mineNUM--;} MouseOn();Mine[i][j].num=0;/*點過的格子周圍雷數(shù)的數(shù)字變?yōu)?表示這個格子已經(jīng)用過 if(mineNUM<1)/*勝利了*/ { GameWin();break;} } } } } if(RightPress())/*鼠標(biāo)右鍵鍵盤按下*/ { MouseGetXY();if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當(dāng)前鼠標(biāo)位置在格子范圍內(nèi)*/ { j=(MouseX-190)/20;/*x坐標(biāo)*/ i=(MouseY-90)/20;/*y坐標(biāo)*/ MouseOff();if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本來沒紅旗現(xiàn)在顯示紅旗*/ { DrawRedflag(i,j);Mine[i][j].flag=1;} else if(Mine[i][j].flag==1)/*有紅旗標(biāo)志再按右鍵就紅旗消失*/ { DrawEmpty(i,j,0,8);Mine[i][j].flag=0;} } MouseOn();sleep(1);} } }

案例六 速算24 #define N 20 #define COL 100 #define ROW 40 #include ”stdio.h“ #include ”time.h“ /*系統(tǒng)時間函數(shù)*/ #include ”graphics.h“ /*圖形函數(shù)*/ #include ”alloc.h“/*動態(tài)地址分配函數(shù)*/ #include ”stdlib.h“ /*庫函數(shù)*/ #include ”string.h“ /*字符串函數(shù)*/ #include ”ctype.h“ /*字符操作函數(shù)*/ char p[4][13]={ {'A','2','3','4','5','6','7','8','9','0','J','Q','K'},/*撲克牌,10用0來表示*/ {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}};typedef struct node { int data;struct node *link;}STACK1;/*棧1*/ typedef struct node2 { char data;struct node2 *link;}STACK2;/*棧2*/ void init(void);/*圖形驅(qū)動*/ void close(void);/*圖形關(guān)閉*/ void play(void);/*發(fā)牌的具體過程*/ void rand1(int j);/*隨機發(fā)牌函數(shù)*/ void change(char *e,char *a);/*中綴變后綴函數(shù)*/ int computer(char *s);/*后綴表達式計算函數(shù)*/ STACK1 *initstack1(STACK1 *top);/*棧1初始化*/ STACK1 *push(STACK1 *top,int x);/*棧1入棧運算*/ STACK1 *pop(STACK1 *top);/*棧1刪除棧頂元素*/ int topx(STACK1 *top);/*棧1讀棧頂元素*/ STACK1 *ptop(STACK1 *top,int *x);/*棧1讀出棧頂元素值并刪除棧頂元素*/ int empty(STACK1 *top);/*判棧1是否為空函數(shù)*/ STACK2 *initstack2(STACK2 *top);/*棧2初始化*/ STACK2 *push2(STACK2 *top,char x);/*棧2入棧運算*/ STACK2 *pop2(STACK2 *top);/*棧2刪除棧頂元素*/ char topx2(STACK2 *top);/*棧2讀棧頂元素*/ STACK2 *ptop2(STACK2 *top,char *x);/*棧2讀出棧頂元素值并刪除棧頂元素*/ int empty2(STACK2 *top);/*判棧2是否為空函數(shù)* int text1(char *s);/*顯示文本*/ main(){ char s[N],s1[N],ch;int i,result;int gdriver, gmode;clrscr();/*清屏*/ init();/*初始化函數(shù)*/ while(1){ setbkcolor(BLACK);/*設(shè)置背景顏色*/ cleardevice();/*清屏*/ play();/*發(fā)牌*/ gotoxy(1,15);/*移動光標(biāo)*/ printf(”--------------------Note-------------------n“);printf(” Please enter express accroding to above four numbern“);/*提示信息*/ printf(” Format as follows:2.*(5.+7.)n“);/*提示輸入字符串格式*/ printf(”---------------n“);scanf(”%s%c“,s1,&ch);/*輸入字符串壓回車鍵*/ change(s1,s);/*調(diào)用change函數(shù)將中綴表達式s1轉(zhuǎn)換為后綴表達式s*/ result=computer(s);/*計算后綴表達式的值,返回結(jié)果result */ if(result==24)/*如果結(jié)果等于24*/ text1(”very good“);/*調(diào)用函數(shù)text1顯示字符串”very good“*/ else text1(”wrong!!“);/*否則函數(shù)text1顯示字符串”wrong!!“*/ printf(”Continue(y/n)?n“);/*提示信息,是否繼續(xù)*/ scanf(”%c“,&ch);/*輸入一字符*/ if(ch=='n'||ch=='N')/*如果該字符等于n或N*/ break;/*跳出循環(huán),程序結(jié)束*/ } /*否則,開始下一輪循環(huán)*/ close();return;/*返回*/ } void rand1(int j)/*隨機發(fā)牌函數(shù)*/ { int kind,num;char str[3],n;randomize();while(1)/*循環(huán)直到有牌發(fā)*/ { kind=random(4);/*花色隨機數(shù)*/ num=random(13);/*大小隨機數(shù)*/ if(p[kind][num]!=-1)/*該數(shù)未取過*/ { n=p[kind][num];/*取相應(yīng)位置的撲克牌數(shù)*/ p[kind][num]=-1;/*牌發(fā)好以后相應(yīng)位置的元素置-1*/ break;} } switch(kind)/*花式的判斷*/ { case 0:setcolor(RED);sprintf(str,”%c“,3);break;/*紅桃*/ case 1:setcolor(BLACK);sprintf(str,”%c“,3);break;/*黑桃*/ case 2:setcolor(RED);sprintf(str,”%c“,4);break;/*方片*/ case 3:setcolor(BLACK);sprintf(str,”%c“,5);break;/*草花*/ } settextstyle(0,0,2);outtextxy(COL+j*100-30,ROW+100-46,str);/*顯示左上角花色*/ outtextxy(COL+j*100+16,ROW+100+32,str);/*顯示右下角花色*/ if(n!='0')/*輸出其他牌*/ { settextstyle(0,0,3);sprintf(str,”%c“,n);outtextxy(COL+j*100-5,ROW+100-5,str);/*顯示牌的大小*/ } else/*輸出10的時候*/ { sprintf(str,”%d“,10);outtextxy(COL+j*100-6,ROW+100-5,str);} } void play(void)/*發(fā)牌的具體過程*/ { int j;for(j=0;j<4;j++){ bar(COL+j*100-35,ROW+100-50,COL+j*100+35,ROW+1*100+50);/*畫空牌*/ setcolor(BLUE);rectangle(COL+j*100-32,ROW+100-48,COL+j*100+32,ROW+100+48);/*畫矩形框*/ rand1(j);/*隨機取牌*/ delay(10000);/*延時顯示*/ } } void init(void)/*圖形驅(qū)動*/ { int gd=DETECT,gm;initgraph(&gd,&gm,”c: c“);cleardevice();} void close(void)/*圖形關(guān)閉*/ { closegraph();} void change(char *e,char *a)/*中綴字符串e轉(zhuǎn)后綴字符串a(chǎn)函數(shù)*/ { STACK2 *top=NULL;/* 定義棧頂指針*/ int i,j;char w;i=0;j=0;while(e[i]!='

主站蜘蛛池模板: 女同久久精品国产99国产精品| 小12萝8禁在线喷水观看| 五月狠狠亚洲小说专区| av在线观看地址| 人妻精品久久久久中文字幕69| 欲香欲色天天天综合和网| 国产精品美女久久久久久久久| 欧美成妇人吹潮在线播放| 男女性爽大片视频| 国产3p露脸普通话对白| 亚洲精品卡2卡三卡4卡2卡乱码| 欧美成人精品三级网站视频| 久久综合精品国产一区二区三区无| 国产日韩精品中文字无码| 黑人强伦姧人妻久久| av国产传媒精品免费| 又粗又大内射免费视频小说| 无码aⅴ精品一区二区三区浪潮| 华人在线亚洲欧美精品| 无码国内精品人妻少妇蜜桃视频| 精品一区二区三区波多野结衣| 久久中文字幕人妻av熟女| 欧美另类精品xxxx| 亚洲第一成人网站| 国产av无码一区二区二三区j| 精产国品一区二区三产区| 人妻少妇中文字幕乱码| 人妻夜夜爽天天爽爽一区| 免费观看又色又爽又湿的视频软件| 人妻少妇伦在线无码专区视频| 亚洲不卡av不卡一区二区| 国产互换人妻xxxx69| 欧美大片aaaaa免费观看| 亚洲伊人久久成人综合网| 亚洲女女女同性video| 久久精品国产一区二区三区肥胖| 国产成人麻豆精品午夜福利在线| 无码精品尤物一区二区三区| 欧洲无码一区二区三区在线观看| 69天堂人成无码麻豆免费视频| 国产精一品亚洲二区在线播放|