JAVA課程設(shè)計21點撲克牌_第1頁
JAVA課程設(shè)計21點撲克牌_第2頁
JAVA課程設(shè)計21點撲克牌_第3頁
JAVA課程設(shè)計21點撲克牌_第4頁
JAVA課程設(shè)計21點撲克牌_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、通信專業(yè)課程設(shè)計一(論文) 太原科技大學太原科技大學 課課 程程 設(shè)設(shè) 計(論計(論 文)文) 設(shè)計設(shè)計( (論文論文) )題目:基于題目:基于 javajava 的的 2121 點撲克牌點撲克牌 姓姓 名名 學學 號號 班班 級級 學學 院院 指導教師指導教師 2011 年 12 月 23 日 太原科技大學課程設(shè)計(論文)任務書 學院(直屬系): 時間: 2011 年 月 日 學 生 姓 名指 導 教 師 設(shè)計(論文)題目基于 java 的 21 點撲克牌游戲設(shè)計 主要研 究內(nèi)容 1.java 語言的初級編程。 2.java 語言的 21 點撲克牌的編程及設(shè)計。 3.java 平臺軟件 ec

2、lipse 的使用。 研究方法 使用軟件 eclipse 對 21 點游戲進行編程,設(shè)計游戲算法,實現(xiàn)游 戲功能。 主要技術(shù) 指標(或研 究目標) 1. 21 點游戲的基本功能的實現(xiàn)。 2. 程序中勝負的判別方法。 3. 遞歸法的理解與使用。 教研室意 見 教研室(負責人)簽字: 年 月 日 邸偉:基于 java 的 21 點設(shè)計 - 3 - 目 錄 第一章 緒論 .- 4 - 1.1 java 工作平臺的簡介.- 4 - 1.2 本次設(shè)計的主要內(nèi)容 .- 4 - 第二章 設(shè)計任務的分析 .- 5 - 2.1 二十一點游戲介紹.- 5 - 2.2 實現(xiàn)以下功能:.- 5 - 第四章 程序的圖形

3、結(jié)果及分析 .- 10 - 第五章 小結(jié) .- 16 - 參考文獻 .- 17 - 附錄 .- 18 - 邸偉:基于 java 的 21 點設(shè)計 - 4 - 基于 java 的點撲克牌設(shè)計 第一章 緒論 1.1 java 工作平臺的簡介 java 不依賴平臺的特點使得它受到廣泛的關(guān)注,java 已成為網(wǎng)絡(luò)時代最重要的語言 之一。java 語言不僅是一門正在被廣泛使用的編程語言,而且已成為軟件設(shè)計開發(fā)者應 當掌握的一門基礎(chǔ)語言。目前,很多新的技術(shù)領(lǐng)域都涉及 java 語言,國內(nèi)外許多大學已 將 java 語言列入了本科教學計劃,掌握 java 已經(jīng)成為共識。java 是一種可以撰寫跨平 臺應用軟

4、件的面向?qū)ο蟮某绦蛟O(shè)計語言,是由 sun microsystems 公司于 1995 年 5 月推 出的 java 程序設(shè)計語言和 java 平臺(即 javase, javaee, javame)的總稱。java 技術(shù) 具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應用于個人 pc、數(shù)據(jù)中心、游 戲控制臺、科學超級計算機、移動電話和互聯(lián)網(wǎng),同時擁有全球最大的開發(fā)者專業(yè)社群。 在全球云計算和移動互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,java 更具備了顯著優(yōu)勢和廣闊前景。 1.2 本次設(shè)計的主要內(nèi)容 首先是 java 語言的初級編程。其次 java 語言的 21 點撲克牌的編程及設(shè)計。還有 java 平臺軟件

5、 eclipse 的使用。并且使用軟件 eclipse 對 21 點游戲進行編程,設(shè)計游戲 算法,實現(xiàn)游戲功能。本次設(shè)計的主要難點 1. 21 點游戲的基本功能的實現(xiàn)。2. 程序中 勝負的判別方法。3. 遞歸法的理解與使用。 邸偉:基于 java 的 21 點設(shè)計 - 5 - 第二章 設(shè)計任務的分析 2.1 二十一點游戲介紹 21 點游戲是一個古老的撲克游戲,游戲的規(guī)則是:各個 參與者設(shè)法使自己的牌達到 總分 21 而不超過這個數(shù)值。撲克牌的分值取它們的面值,a 充當 1 或者 11 分,j,q 和 k 人頭牌都是 10 分。 莊家 vs17 個玩家。在開局時,包括莊家在內(nèi)的所有參與者都有兩張

6、牌。玩家可以 看到他們的所有牌以及總分,而莊家有一張牌暫時是隱藏的。接下來,只要愿意,各個 玩家都有機會依次再拿一張牌。如果是玩家的總分超過了 21(稱為引爆),那么這個玩家 就輸了。在所有玩家都拿了額外的牌后,莊家將顯示隱藏的牌。只要莊家的總分等于或 小于 16,那么他就必須再拿牌。如果莊家引爆了,那么還沒有引爆的所有玩家都將獲勝, 引爆的玩家打成平局。否則,將余下的各玩家的總分與莊家的總分做比較,如果玩家的 總分大于莊家的總分,則玩家獲勝。如果二者的總分相同,則玩家與莊家打成平局中。 2.2 實現(xiàn)以下功能: 1) 洗牌; 2) 發(fā)牌; 3) 隱藏或顯示牌; 4) 計算總分; 5) 判斷勝負

7、。 邸偉:基于 java 的 21 點設(shè)計 - 6 - 第三章 本次設(shè)計的重點及難點 圖 3.1 21 點流程圖 給玩家發(fā)最初的三張牌,并顯 示出來 向玩家發(fā)額外的 牌并顯示牌和總分 顯示電腦的牌 平局 給電腦發(fā)最初的三張牌 并顯示牌和總分 玩家需要額外 的牌? 電腦需要額 外的牌? 向電腦發(fā)額外的 牌并顯示牌和總分 電腦引爆? 玩家贏 玩家引爆? 玩家總分電 腦? 洗牌 n y y n y y n n 玩家引爆? 玩家輸 yn 玩家贏 玩家輸 邸偉:基于 java 的 21 點設(shè)計 - 7 - 游戲勝負的判別方法: 本方法考慮了鬼牌的因素,由于所用到的撲克牌為 54 張, 將他們存放在數(shù)組,

8、且通過數(shù)組的下標來保證牌的唯一。由于數(shù)組中的計數(shù)方式是從 0 開始的,所以第 0-12 號為 13 張 1 組牌,12-25 號為下一組.以此類推,共 4 組到 51 號牌,所以第 52 號和 53 號及為鬼牌,且他們的作用是一樣的。 int judge(int a,int b,int num)/判斷電腦和玩家誰的點數(shù)更接近 21,如果有鬼牌就另行判 斷 int sum_a=0,sum_b=0; boolean joker_a=false,joker_b=false; for(int i=0;inum;i+) if(ai=14|ai=15)joker_a=true; else sum_a+=a

9、i; if(bi=14|bi=15)joker_b=true; else sum_b+=bi; if(joker_a)if(sum_a8)sum_a+=13;/鬼牌可以任意 1-13 else if(sum_a21)sum_a=21; if(joker_b)if(sum_b8)sum_b+=13; else if(sum_b21 if(sum_a21)return 1; if(math.abs(sum_a-21)math.abs(sum_b-21) return -1; if(judge(human,computer,n)=1) system.out.println(n 你贏了!); else

10、 if(judge(human,computer,n)=0) system.out.println(n 平局!); else if(judge(human,computer,n)=-1) system.out.println(n 你輸了!); system.out.println(*); 邸偉:基于 java 的 21 點設(shè)計 - 8 - 當玩家抽到鬼牌時,鬼牌可以頂替 1-13 任意大小的牌,抽到鬼牌時的判別方法為, 鬼牌存在,并且其余牌總和小于 8,那么現(xiàn)在加上 13 就是總和,如果除了鬼牌其余牌大 于 8 小于 21,那么總和就是 21,電腦和人判斷方法一樣。最后判斷大小,通過返回 1,

11、0,-1,分別表示人贏,平局,電腦贏;如:人的大于 21 并且電腦小于等于 21,則返 回-1,那么電腦贏,否則返回 1,即表示人嬴;當人和電腦的牌都大于 21 時,通過將人 和電腦的牌都減去 21 取絕對值的方法,然后比較得到的值,如果人得到的值小則返回 1,即人贏;相等則返回 0,即平局;電腦的值小則返回-1,即電腦贏。 遞歸法的使用: 本方法為了避免牌的重復而使用了遞歸法,其中的程序為: int nextone()/用遞歸確保返回的牌沒有重復 int n=(int)(math.random()*54);/通過隨機的方法產(chǎn)生數(shù) if(cardsn=0)/如果產(chǎn)生的那個數(shù)字曾經(jīng)沒有用過那么就

12、用,否則重新產(chǎn)生 cardsn=1;/用過的賦值為 1 if(n=52)/如果 n 的值為 52 return 14;/返回的值為 14 else if(n=53)/如果 n 的值為 53 return 15;/返回的值為 15 else return n%13+1;/這個數(shù)對 13 取模然后加 1 就是產(chǎn)生的牌 else return nextone();/重新隨機產(chǎn)生 所有牌的被定義在包含 54 個元素,且所有元素為 0 的數(shù)組中,即所有的牌的都通過 數(shù)組的下標 n 表示,且在數(shù)組中代表的元素被賦值為 0,當這張牌被使用時,通過元素的 下標,將此位置的元素從 0 改為 1。在調(diào)用本方法時,

13、首先 通過方法 int n=(int) (math.random()*54)獲得元素的下標 n,然后通過 if(cardsn=0)判斷,如果該位置的元 素為 0,則這個 n 代表的牌沒有使用過的的,將它在數(shù)組所指的牌從 0 賦值為 1 后,將這 個牌的下標取模后返回;否則,這張牌是被使用過的, 通過 return nextone(); 返 回到本方法的開始位置,重新執(zhí)行一遍本方法,直到隨機出的 n 所代表的牌,沒有被使 用過的牌 ,然后將 n 代表的牌返回后跳出本方法,繼續(xù)程序的運行。 邸偉:基于 java 的 21 點設(shè)計 - 9 - 表 3.1 程序中方法和類的說明 類名方法名描述 pla

14、y21start() 游戲開始 play21clear() 數(shù)組清零開始計數(shù) play21show() 顯示玩家或電腦的牌 play21ask() 詢問玩家或電腦是否要牌 play21nextone() 通過迭代的方式獲得牌 play21judge() 對比玩家和電腦的牌的大小 testmain() 程序的入口方法,通過這里 開始游戲 邸偉:基于 java 的 21 點設(shè)計 - 10 - 第四章 程序的圖形結(jié)果及分析 程序分析 本程序沒有采用傳統(tǒng)的 21 點的 52 張牌的規(guī)則,而是采用了 54 張牌全用的方法,大 小鬼牌也帶了進去,但鬼牌可以表示 1-13 的任意大小具體情況可有玩家自己決定

15、,當玩 家手里牌的總分小于等于 8 時,若抽到鬼牌可以頂替 13,當玩家手中的牌大于 8 時,鬼 牌可以成為任意一個,并且大小鬼牌作用相同。在游戲中為了防止抽到重復的牌而采用 了將牌存放在數(shù)組中,把沒用過的牌在數(shù)組中賦值為 0.用過的牌賦值為 1,且通過遞歸 方法來更好的避免了牌的重復。即所有牌的被定義在包含 54 個元素,且所有元素為 0 的 數(shù)組中,即所有的牌的都通過數(shù)組的下標 n 表示,且在數(shù)組中代表的元素被賦值為 0,當 這張牌被使用時,通過元素的下標,將此位置的元素從 0 改為 1。在調(diào)用本方法時,首先 通過方法 int n=(int)(math.random()*54)獲得元素的下

16、標 n,然后通過 if(cardsn=0)判 斷,如果該位置的元素為 0,則這個 n 代表的牌沒有使用過的的,將它在數(shù)組所指的牌從 0 賦值為 1 后,將這個牌的下標取模后返回;否則,這張牌是被使用過的, 通過 return nextone(); 返回到本方法的開始位置,重新執(zhí)行一遍本方法,直到隨機出的 n 所代表的牌,沒有被使用過的牌 ,然后將 n 代表的牌返回后跳出本方法,繼續(xù)程序的 運行。本程序也運用了比較簡單的數(shù)組結(jié)構(gòu)。數(shù)組是在程序設(shè)計中,為了處理方便, 把 具有相同類型的若干變量按有序的形式組織起來的一種形式。這些按序排列的同類數(shù)據(jù) 元素的集合稱為數(shù)組。數(shù)組屬于構(gòu)造數(shù)據(jù)類型。一個數(shù)組

17、可以分解為多個數(shù)組元素,這 些數(shù)組元素可以是基本數(shù)據(jù)類型或是構(gòu)造類型。因此按數(shù)組元素的類型不同,數(shù)組又可 分為數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結(jié)構(gòu)數(shù)組等各種類別。一個數(shù)組中的所有元素具 有相同的數(shù)據(jù)類型。當然,當數(shù)據(jù)類型為 variant 時,各個元素能夠包含不同種類的數(shù) 據(jù)(對象、 字符串 、數(shù)值等等) 。 邸偉:基于 java 的 21 點設(shè)計 - 11 - 圖 4.1 程序運行結(jié)果 圖 4.2 程序運行結(jié)果 邸偉:基于 java 的 21 點設(shè)計 - 12 - 程序中的部分注釋: 1. public void start()/開始游戲 system.out.println(*); syst

18、em.out.println(開始游戲!); int n=3; for(int i=0;i3;i+)/電腦和玩家先各抽 3 張 computeri=nextone(); humani=nextone(); while(n5)/牌數(shù)小于 5 時詢問是否再要牌 show(human,n,1);/顯示現(xiàn)在玩家的牌面 if(ask(human,n) /如果玩家要牌 computern=nextone();/電腦獲得一張牌 humann=nextone();/玩家獲得一張牌 n+;/n 的值自動加 1 else break;/如果不選擇加牌則跳出本循環(huán) 邸偉:基于 java 的 21 點設(shè)計 - 13

19、- 2. int nextone()/用遞歸確保返回的牌沒有重復 int n=(int)(math.random()*54);/通過隨機的方法產(chǎn)生數(shù) if(cardsn=0)/如果產(chǎn)生的那個數(shù)字曾經(jīng)沒有用過那么就用,否則重新產(chǎn)生 cardsn=1;/用過的賦值為 1 if(n=52)/如果 n 的值為 52 return 14;/返回的值為 14 else if(n=53)/如果 n 的值為 53 return 15;/返回的值為 15 else return n%13+1;/這個數(shù)對 13 取模然后加 1 就是產(chǎn)生的牌,正常情況下,除 13 后剩下的牌就是牌的值 但數(shù)組是從 0 開始計數(shù)的

20、所以加 1 0-12 為 13 張 1 組牌,12-25 下一組. 以此類推,共 4 組到 51 號牌 else return nextone();/重新隨機產(chǎn)生 邸偉:基于 java 的 21 點設(shè)計 - 14 - 3. int judge(int a,int b,int num)/判斷電腦和玩家誰的點數(shù)更接近 21,如果有鬼牌就另行 判斷 int sum_a=0,sum_b=0;/設(shè)置兩個變量為了計數(shù) boolean joker_a=false,joker_b=false;/分別代表人和電腦是否有鬼牌,true 代表有 for(int i=0;inum;i+)/這里把電腦和人的牌總和加起來

21、,如果有鬼牌就把 joker_a 或 joker_b 設(shè)為 true,再進一步判斷 if(ai=14|ai=15)joker_a=true;/14 為小鬼、15 為大鬼 else sum_a+=ai;/取和 if(bi=14|bi=15)joker_b=true; else sum_b+=bi; if(joker_a)if(sum_a8)sum_a+=13;/鬼牌可以任意 1-13,如果鬼牌存在,并且其余牌總和 小于 8,那么現(xiàn)在加上 13 就是總和 else if(sum_a21)sum_a=21;/如果除了鬼牌其余牌大于 8 小于 21,那么總和就是 21 if(joker_b)if(su

22、m_b8)sum_b+=13;/電腦和人判斷方法一樣 else if(sum_b21/最后判斷大小,如果人的大于 21 并且電腦小于等 于 21 那么電腦贏 if(sum_a21)return 1;/否則人贏 if(math.abs(sum_a-21)math.abs(sum_b-21) return -1;/否則電腦贏 邸偉:基于 java 的 21 點設(shè)計 - 16 - 第五章 小結(jié) 本次課程設(shè)計使我學會了許多的知識,首先就是本次設(shè)計所使用的數(shù)組結(jié)構(gòu),數(shù)組 是在程序設(shè)計中,為了處理方便, 把具有相同類型的若干變量按有序的形式組織起來的 一種形式。這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。數(shù)

23、組屬于構(gòu)造數(shù)據(jù)類型。其 次就是設(shè)計中的一些過程如利用遞歸法來使牌沒有重復,還有牌的大小的判別方法等許 多內(nèi)容。 在課程設(shè)計過程中,收獲知識,提高能力的同時,我也學到了很多人生的哲理,懂 得怎么樣去制定計劃,怎么樣去實現(xiàn)這個計劃,并掌握了在執(zhí)行過程中怎么樣去克服心 理上的不良情緒。因此在以后的生活和學習的過程中,我一定會把課程設(shè)計的精神帶到 生活中,不畏艱難,勇往直前! 邸偉:基于 java 的 21 點設(shè)計 - 17 - 參考文獻 1 譚浩強. java 程序設(shè)計教程m.北京:北京工業(yè)大學出版社,2001. 24-28 2 陳維新. java 面向?qū)ο蟪绦蛟O(shè)計m.北京:國防科技大學出版社,19

24、98. 33-35 3 林小茶. java 編程思想m.北京:北京航空學院出版社,2003. 105-108 4 王克宏. java 技術(shù)教程m.北京:中國信息科學出版社,1995. 63-66 5 呂志勇. java 核心技術(shù)m.北京:北京航空學院出版社,1996. 155-158 邸偉:基于 java 的 21 點設(shè)計 - 18 - 附錄 import java.util.*; class play21 int cards,computer,human;/定義一副 54 張牌,電腦 5 張,玩家 5 張 scanner sr=new scanner(system.in); public p

25、lay21() cards=new int54; arrays.fill(cards,0);/54 張牌全賦值零,一旦某一張牌被用了就賦 1 computer=new int5; arrays.fill(computer,0); human=new int5; arrays.fill(human,0); public void clear() arrays.fill(cards,0); arrays.fill(computer,0); arrays.fill(human,0); public void start() system.out.println(*); system.out.prin

26、tln(開始游戲!); int n=3; for(int i=0;i3;i+)/電腦和玩家先各抽 3 張 computeri=nextone(); humani=nextone(); while(n5)/牌數(shù)小于 5 時詢問是否再要牌 show(human,n,1);/顯示現(xiàn)在玩家的牌面 if(ask(human,n) computern=nextone(); humann=nextone(); n+; else break; show(human,n,1); show(computer,n,0); if(judge(human,computer,n)=1) system.out.printl

27、n(n 你贏了!); else if(judge(human,computer,n)=0) 邸偉:基于 java 的 21 點設(shè)計 - 19 - system.out.println(n 平局!); else if(judge(human,computer,n)=-1) system.out.println(n 你輸了!); system.out.println(*); void show(int a,int num,int c) if(c=1)system.out.println(n+(num-2)+:你現(xiàn)在的牌是:); else system.out.println(n+(num-2)+:

28、電腦現(xiàn)在的牌是:); for(int i=0;inum;i+) if(ai=1)system.out.print(a );continue; if(ai=11)system.out.print(j );continue; if(ai=12)system.out.print(q );continue; if(ai=13)system.out.print(k );continue; if(ai=14)system.out.print(小鬼 );continue; if(ai=15)system.out.print(大鬼 );continue; system.out.print(ai+ ); boolean ask(int a,int num)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論