版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 目錄</b></p><p><b> 前言1</b></p><p> 1.1關于C語言1</p><p> 1.2關于課程設計1</p><p> 1.3關于黑白棋2</p><p><b> 工程概況2<
2、/b></p><p> 2.1黑白棋的簡要:2</p><p> 2.2可行性分析2</p><p><b> 正文3</b></p><p><b> 3.1摘要3</b></p><p> 3.2設計目的和意義3</p><
3、p> 3.3設計目標與方案4</p><p><b> 3.4設計方法4</b></p><p><b> 3.5設計內容5</b></p><p><b> 3.6對戰(zhàn)函數(shù)9</b></p><p> 3.7 程序編寫中遇到的問題12</p&g
4、t;<p> 4.1運行結果13</p><p> 4.2設計創(chuàng)新與關鍵技術13</p><p> 4.3設計心得14</p><p><b> 有關說明15</b></p><p> 5.1軟件說明書15</p><p><b> 致謝16<
5、/b></p><p><b> 源程序16</b></p><p><b> 前言</b></p><p><b> 1.1關于C語言</b></p><p> C語言是國際上廣泛流行的計算機高級語言,它適合作為系統(tǒng)描述語言,即可以用來編寫系統(tǒng)軟件,也可以編寫
6、應用軟件。在早期的操作系統(tǒng)軟件主要是匯編語言編寫的,但匯編語言依賴于計算機硬件程序的可讀性和可移植性級語言,而C語言兼具一般語言優(yōu)點還能克服其他語言的缺點[1]。</p><p><b> 1.2關于課程設計</b></p><p> 學習計算機語言的唯一目的是應運,而應運要通過程序設計來體現(xiàn)的。進行程序設計,需要很強的邏輯思維能力,是一種極富創(chuàng)造性的智力勞動。這
7、樣可以認為,語言是一種技能,程序設計是一門科學[7]。</p><p> 課程設計作為集中實踐性教學環(huán)節(jié),應著重提高學生的自學能力,獨立分析、解決問題的能力和動手進行實驗的能力[7]。</p><p> 為了培養(yǎng)學生自學能力,對于設計或實驗中可能碰到的重點、難點,只要通過典型分析和講解,啟發(fā)學生的思路和自學的方法,以便達到舉一反三的作用。設計中還要教給學生查閱資料、使用工具書的方法,讓
8、他們遇到問題時,不是立刻找老師,而是通過獨立思考,查閱資料和書籍,自己尋找答案。</p><p><b> 1.3關于黑白棋</b></p><p> 通過做《黑白棋游戲》讓我初步學會了怎樣編寫程序,怎樣使一個程序運行,黑白棋的游戲是要在一個8*8的網(wǎng)格中進行,而數(shù)組屬于構造體類型,數(shù)組是具有相同數(shù)據(jù)類型的變量序列,序列中的每個變量成為元素,數(shù)組元素由一個統(tǒng)一標識
9、的數(shù)組名和順序好“下標”來表示。故需要在游戲中定義一個二維數(shù)從而實現(xiàn)游戲的走棋、落棋、判斷棋盤的變化等。同時加深了對各種函數(shù)的理解,通過這個課程設計,培養(yǎng)我們能夠遵循軟件開發(fā)過程的基本規(guī)范,運用結構化程序設計的方法,按照課程設計的題目要求,獨自地完成設計、編寫、調試和測試應用程序及編寫文檔的任務。</p><p><b> 工程概況</b></p><p> 2.
10、1黑白棋的簡要: </p><p> 黑白棋,又叫反棋(Reversi)、奧賽羅棋(Othello),蘋果棋,翻轉棋。黑白棋起源中世紀的英國,18世紀傳入日本,并在日本得到了發(fā)展。現(xiàn)在,黑白棋在西方和日本很流行。游戲通過相互翻轉對方的棋子,最后以棋盤上誰的棋子多來判斷勝負。</p><p> 它的游戲規(guī)則簡單,
11、因此上手很容易,但是它的變化又非常復雜。有一種說法是:只需要幾分鐘學會它,卻需要一生的時間去精通它。</p><p><b> “黑白棋規(guī)則”:</b></p><p> 1)兩人對弈,以輪流方式持黑子與白子。</p><p> 2)開辟新局者持白子,加入者持黑子, 之后以輪流方式將棋子置于棋盤格子中。若無地方可下子,則跳過一回,由對方
12、下子。</p><p> 3)在提示的格子中,選擇一個格子下子, 當下子的位置與離最近的同色旗子中, 若有其他棋子則中間的棋子變?yōu)榕c我方一樣顏色。</p><p> 4)當下滿64個棋子,棋子多者為勝。</p><p><b> 2.2可行性分析</b></p><p> 游戲不同于基于C語言的其他程序(如學生成
13、績管理系統(tǒng)、教務工作管理系統(tǒng)、圖書管理系統(tǒng)等)由于游戲本身的問地就在于緩解壓力,所以基于C語言設計的游戲需要一個良好的游戲界面,給游戲者以輕松和愉快的感覺。TURBO C提供了70多個圖形函數(shù),這些函數(shù)包括在圖形庫文件graphics.LIB中,他們被定義在graphics.h中。有如此強大的圖形處理能力,去設計一個良好的人機交流界面是可行的。</p><p> 由于此游戲采用的是“人人對戰(zhàn)”的模式,所以在游戲
14、時,需要倆個游戲者輪流下棋,棋手1走棋完畢后,經(jīng)過判斷棋盤變化過程后棋手2走棋,游戲過程需要在兩棋手間不斷進行轉化。在C語言中,提供了包括if……else,switch……case等分支語句,綜合運用這些分支語句,可以完成上述轉化。</p><p> 黑白棋游戲雙方共需要走棋60手,每次走棋后,都需要根據(jù)相同的標準判斷棋盤變化,來判斷旗子顏色的變化情況。顯然需要運用循環(huán)語句來簡化編程的長度。C語言中提供了whi
15、le \for等循環(huán)語句可以實現(xiàn)上述功能[5].</p><p> 游戲需要操作和輸出顯示游戲的結果,游戲的操作要由計算機的外部設備在人的操作下完成。C語言本身并不提供輸入和輸出語句,輸入和輸出的操作都是由函數(shù)來完成的,在C語言的標準庫函數(shù)中提供了一些輸入和輸出的函數(shù),這些函數(shù)的指針都是針對系統(tǒng)隱含指定的輸入和輸出設備的。綜合運用這些輸入和輸出的函數(shù)可以實現(xiàn)上述的功能。</p><p>
16、 經(jīng)濟可行性分析:本游戲的實現(xiàn),花費了很多時間,但沒有花費什么費用,而已這樣簡單但有一定難度的游戲更能激發(fā)游戲愛好者的興趣,因此黑白棋游戲可以滿足游戲市場的尋求.</p><p> 綜合上述,基于C語言的游戲黑白棋的設計是可行的。</p><p><b> 正文</b></p><p><b> 3.1摘要</b>
17、</p><p> 程序設計語言類課程的指導思想是:使學生通過學習即高級編程語言的知識、編程技術和基本算法,又掌握程序設計的思想和方法,更具備利用計算機求解實際問題的能力,能靈活運用高級語言進行程序設計[6]。 其實認真學習一門語言并不困難,關鍵要所追求的學習的方法和途徑。一條好的途徑便于快速掌握,熟悉運用語言。學習的目的在于應用,理論來源于實踐,如果在學習中能夠通過有效的途徑如自己動手設計一個功能比較
18、前大的開發(fā)系統(tǒng),借鑒于各種工具書,善于總結。定可以很好的效果。正是如此,使我們在這幾年中對語言學習有了很大提高。通過實踐的學習,我認到學好計算機要重視實踐操作,不僅僅是學習C語言,還是其它的語言,以及其它的計算機方面的知識都要重在實踐,所以后在學習過程中,我會更加注視實踐操作,使自己便好地學好計算機。</p><p> 關鍵字: 程序設計 掌握 編程語言的知識 編程技術 基本算法 思想和方法</p
19、><p> 3.1.1 方案論述及概述</p><p> C語言是在國內外廣泛使用的一種計算機語言。它適合作為系統(tǒng)描述語言,既可以用來編寫系統(tǒng)軟件,也可以編寫應用軟件[5]。</p><p> 3.2設計目的和意義</p><p> 這個程序是對編程基本功的一個訓練,將分支、循環(huán)、數(shù)組、函數(shù)綜合應用,而不僅限于編制獨立的小程序,能夠大大提
20、高編程水平。</p><p> 3.2.1設計目的:</p><p> 1.掌握和利用C語言進行程設計的能力;</p><p> 2.進一步理解和運用結構化程序設計的思想和方法;</p><p> 3.初步掌握開發(fā)一個小型實用系統(tǒng)的基本方法;</p><p> 4.學會調試一個較長程序的基本方法;</p
21、><p> 5.學會利用流程圖或N-S圖表示算法;</p><p><b> 3.2.2意義:</b></p><p> 通過編寫一個相對完整的《黑白棋游戲》程序,加強對C語言的認識,也是對這一學期C語言課程中學習到的各種C語言語法結構、編程方法和編程技巧進行綜合復習以達到鞏固和提高。實現(xiàn)《黑白棋游戲》游戲功能,首先是輸出游戲模式,然后是通過
22、按鍵的方式實現(xiàn)棋子的移動,所以程序主要由三大部分實現(xiàn),一部分功能是顯示棋盤,一部分是實現(xiàn)游戲功能.一部分是游戲計分. </p><p> 3.3設計目標與方案</p><p> 3.3.1 設計目標</p><p> 在這一周半的課程設計時間里,充分利用所學的C語言知識編出《黑白棋游戲》程序。并使它編譯運行,可以實現(xiàn)它的游戲功能.還要整理程序,分析程序.<
23、;/p><p> 3.3.2 工作進度安排</p><p> 本次課程設計歷時八天,在這八天的時間里我們應做到有計劃有安排與實際操作相結合,具體時間安排如下:</p><p> 1、前2天完成相關資料的收集整理,確立這實驗的可行性。</p><p> 2、資料收集整理之后開始編寫程序,調試程序。</p><p>
24、 3、進一步調試程序,并修改和完善程序,實現(xiàn)程序的可行性和美觀性。</p><p> 4、完成《課程設計說明書》。</p><p><b> 3.4設計方法</b></p><p> 游戲需要操作和輸出顯示游戲的結果,游戲的操作要由計算機的外部設備在人的操作下完成。C語言本身并不提供輸入和輸出語句,輸入和輸出的操作都是由函數(shù)來完成的,在C
25、語言的標準庫函數(shù)中提供了一些輸入和輸出的函數(shù),這些函數(shù)的指針都是針對系統(tǒng)隱含指定的輸入和輸出設備的。綜合運用這些輸入和輸出的函數(shù)可以實現(xiàn)上述的功能。</p><p><b> 3.4.1程序功能</b></p><p> 黑白棋游戲是一個深受人們喜愛的游戲,通常是人機對奕,本程序設計為人與人對奕,一方執(zhí)黑棋,一方執(zhí)白棋,輪流走棋,每方都試圖在游戲結束前讓自己棋子的
26、數(shù)目多于對方。按鍵盤上的方向鍵可以上下左右移動棋子,按回車鍵可以擺放棋子。</p><p> 游戲黑白棋的總體設想</p><p> 在主函數(shù)中,通過調用繪制棋盤、棋手對戰(zhàn),判斷棋盤變化、改變棋子顏色等函數(shù)的調用來實現(xiàn)主函數(shù)的相應的功能</p><p> 3.4.2用到的函數(shù)</p><p> 1.main()主函數(shù)</p>
27、;<p> 在主函數(shù)中,棋盤狀態(tài)用數(shù)組a[8][8],初值為0,表示空格。用圖形系統(tǒng)畫出棋盤,調用playtoplay()人人對弈函數(shù)開始游戲,一旦游戲結束后,關閉圖形系統(tǒng),程序結束。</p><p> 2.DrawQp()畫棋盤函數(shù)</p><p> 背景顏色設為藍色,從坐標(100,100)開始每隔40個單位用白色畫一條水平直線,一條垂直線,構成棋盤,用循環(huán)語句實現(xiàn)
28、。函數(shù)setfillstyle()可以設置填充模式和填充顏色,fillellipse(int x,int y,xradius,int yradius)以x和y為圓心,xradius和yradius為水平和垂直軸畫一填充橢圓,當xradius和yradius相等時,則畫出的是圓,用它表示棋子。</p><p> 3.SetPlayColor()設置棋子的顏色</p><p> 函數(shù)的參數(shù)
29、為整型變量t,根據(jù)t的值來設計填充棋子的當前顏色,值為1代表白棋,值為2代表黑棋。</p><p> 4.MoveColor()恢復原來格子的狀態(tài)</p><p> 由于棋手在走棋的時候,他的棋子總是首先出現(xiàn)在棋盤的左上角,棋手要通過移動光標走到要落子的位置,在經(jīng)過的路程上顯示當前棋子,就會覆蓋原來的棋盤狀態(tài),所以一旦棋子走過后,就應恢復原來的狀態(tài),是空格的依然顯示空格,是棋子的就顯示
30、原來棋子的顏色。因為棋子移動過程并沒有改變數(shù)組元素的值,所以可以根據(jù)數(shù)組元素的值判定原來的狀態(tài),如果值是1,就恢復白色棋子,值是2則恢復黑色棋子,否則恢復藍色空格。</p><p> 5.playtoplay()人人對戰(zhàn)函數(shù)</p><p> 這是游戲進行的函數(shù),主要是接收棋手的按鍵消息,其處理過程如下:</p><p> 按Esc鍵程序可以隨時結束。<
31、/p><p> 按上下左右光標鍵,則改變棋子移動的坐標值。</p><p><b> 按回車鍵后判斷。</b></p><p> 6..QpChange()判斷棋盤變化</p><p> 當棋手按回車鍵落子后,就要分別往8個方向判斷是否包圍住對方棋子,如果是,則改變棋盤,也就是棋盤上黑白棋子的個數(shù)要發(fā)生變化。如果所有
32、方向都判斷過,并且沒有引起棋盤的變化,則棋盤變化標志值yes為0,返回yes,結束本函數(shù)。</p><p> ftp://kylinftp.vicp.net/常用軟件/編程開發(fā)/wintc172.exe根據(jù)當前數(shù)組元素的值判斷分數(shù),也就是各方棋子的個數(shù),如果數(shù)組元素值為1,白棋棋子數(shù)累加;如果數(shù)組元素值為2,則黑棋棋子數(shù)累加。</p><p> 7.PrintScore()輸出成績&l
33、t;/p><p> 利用設置實體填充模式填充矩形條清除掉前次的成績,再利用sprintf()函數(shù)將整數(shù)轉換為字符串的形式,再利用outtextxy()函數(shù)將成績輸出。</p><p> 8.playWin()輸出勝利者結果</p><p> 根據(jù)分數(shù)值score1和score2的大小得出下棋的結果,輸出贏者信息。</p><p><b
34、> 3.5設計內容</b></p><p> 設計一個《黑白棋游戲程序》,使之編譯,連接及運行,實現(xiàn)它的游戲功能。</p><p> 3.5.1課程設計使用設備和軟件</p><p><b> 1.硬件:PC機</b></p><p> 2.軟件:Turbo C2.0/Turbo C++ 3.
35、0</p><p><b> 3.5.2設計步驟</b></p><p> 3.5.2.1總體設計</p><p><b> 1.主函數(shù)模塊</b></p><p><b> 2.子函數(shù)模塊</b></p><p> 以下是有關于主函數(shù)的流程圖
36、。</p><p><b> 圖3-1 流程圖</b></p><p> 3.5.3子函數(shù)功能一覽表</p><p><b> 子函數(shù)功能一覽表</b></p><p><b> 3.5.4棋盤函數(shù)</b></p><p><b>
37、繪制過程總括:</b></p><p> 圖3-2 棋盤繪制樹</p><p> 3.5.5圖形庫文件</p><p><b> 詳細介紹:</b></p><p> #include "graphics.h"</p><p> TURBO C提供了70多
38、個圖形函數(shù),這些函數(shù)包括在圖形庫文件graphics.LIB中,他們被定義在graphics.h中。編寫圖形程序的時候,一定高包口頭文件graphics.h。</p><p> 3.5.6圖形初始化函數(shù)</p><p> int gd=DETECT,gr</p><p> 圖形初始化函數(shù)initgraph(&driver,&mode,“路徑”)
39、</p><p> 功能:裝入圖形驅動程序</p><p> 參數(shù)DRIVER指圖形適配器驅動軟件,用宏名或數(shù)字來表示,它實際上是一個枚舉變量。當不知道所用的顯示器是什么名稱的時候,可將driver設置成DETECT,它將自動的檢測所用的適培器的型號,并獎相應的驅動程序裝入,調節(jié)到最高分辨顯示模式。</p><p> 參數(shù)MODE是每一種圖形適配器的代碼,可以
40、是宏名或是數(shù)字,參數(shù)MODE不用指具體的值,系統(tǒng)將采用最高的分辨率。</p><p> 3.5.7設置背景顏色</p><p> Setbkcolor(color)——設置背景顏色。若不設置,則背景的顏色為黑色</p><p> Setcolor(color)——設置畫線的顏色或者是調色板的顏色。如果不設置,則系統(tǒng)指定為白色,其中COLOR為顏色的控制號或是顏
41、色的宏名,為整形,設置的顏色保存到程序中遇到下一個設置顏色是為止。</p><p> 在本程序中,設置的的北京顏色為藍色,setbkcolor(BLUE),根據(jù)上述可知,此時,游戲界面的底色為藍色。setcolor(0)將線的顏色設置為黑色,由此是為了取消圓形周圍的東西。</p><p><b> 3.5.8畫線</b></p><p>
42、 Line(x1,y1,x2,y2)</p><p> 從點(X1,Y1)到點(X2,Y2)畫一條直線,顏色為當前的顏色,當前的位置是畫線前的位置。</p><p> for(i=100;i<=420;i+=40)</p><p><b> {</b></p><p> line(100,i,420,i);
43、/*畫水平線*/</p><p> line(i,100,i,420); /*畫垂直線*/</p><p><b> }</b></p><p> 在本程序中,使用上述源代碼實現(xiàn)繪制棋盤的功能,也就是以40為一個步增,以(100,100)為起點,以(100,420)、(420,100)(420,420)為頂點畫出棋盤,棋盤大下為320*3
44、20,由于步增是40,所以,棋盤上自然出現(xiàn)8*8的格子,由于畫線的時候,沒有定義線的顏色,所以線的顏色是默認的白色,所以最終出現(xiàn)了蘭色的底面上以白色畫格子的棋盤。</p><p> 3.5.9設置填充模式和顏色</p><p> Setfillstyle(pattern,color)——設置填充模式和顏色</p><p> 其中:pattern=SOLID_F
45、ILL為填充實心充色</p><p> Color為顏色號碼。</p><p> Ellipse為畫橢圓</p><p> Ellipse——用當前顏色以(X,Y)為中心,X、Y為兩半徑</p><p> FILLELLIPSE(X,Y ,RX,RY)</p><p> 以(X,Y)為中心,以RX、RY為半徑
46、畫橢圓,并以設置或者是默認的顏色來涂色</p><p> setfillstyle(SOLID_FILL,15);/*白色實體填充模式*/</p><p> fillellipse(500,200,15,15); /*在顯示得分的位置畫棋*/</p><p> setfillstyle(SOLID_FILL,8); /*黑色實體填充模式*/</p>
47、<p> setfillstyle(SOLID_FILL,WHITE);</p><p> 在本程序中,使用的上述的代碼來繪制棋子,棋子為半徑為15的圓,,顏色分別為代碼為15和8的深灰色和白色兩種棋子,分別由兩位旗手來使用。</p><p> a[3][3]=a[4][4]=1;/*初始兩個黑棋*/</p><p> a[3][4]=a[4]
48、[3]=2;/*初始兩個白棋*/</p><p> setfillstyle(SOLID_FILL,WHITE);</p><p> fillellipse(120+3*40,120+3*40,15,15);</p><p> fillellipse(120+4*40,120+4*40,15,15);</p><p> setfill
49、style(SOLID_FILL,8);</p><p> fillellipse(120+3*40,120+4*40,15,15);</p><p> fillellipse(120+4*40,120+3*40,15,15);</p><p> 開局是在8*8的棋盤的四個位置上分別設置四個棋子,位置分別為(3,3)|(4,4)兩個白子,(3,4)、(4,3)
50、兩個個黑子,也就是要在棋盤的(120+3*40,120+3*40)和(120+4*40,120+4*40)位置繪制半徑為15的倆個白球,在(120+3*40,120+4*40),(120+4*40,120+3*40)倆個位置繪制倆個黑色棋子。</p><p><b> 附表:顏色代號</b></p><p><b> 3.6對戰(zhàn)函數(shù)</b>&
51、lt;/p><p><b> 方向操作</b></p><p> 在主程序前,使用宏定義將 UP、DOWN 、LEFT 、RIGHT,做了相應的定義,因此,在對戰(zhàn)函數(shù)當中可以使用已經(jīng)進行過定義的以上四個進行操作,在操作的時候,由于所畫的棋盤的沒一個格子的大小是40*40,所以,每次鍵盤操作后,棋子移動的距離是向相應的方向移動40,這樣才能保證每次落子的位置都在棋盤沒個
52、格子的中心處,保證了操作的有效性,也使得在棋子在棋盤上移動的過程中,如故和已經(jīng)落子的棋子有重疊,當上訪旗子移走后不會在下方棋子的周圍留下其他的顏色。每次移動后,在屏幕上顯示的都是一個以15為半徑的圓形。</p><p> 同時,為了滿足這一點就要在棋子每次走棋的初始位置上有所考慮:x=120,y=80每次棋子一開始出來的坐標,x為行坐標,y為列坐標,設定每次走棋的初始位置為(120,80),每次步增為40,以向
53、下移動一次為例子:向下移動一次以后,中心位置變?yōu)椋?20,120),格子的邊際的Y坐標為100,一個格子的大小為40*40,所以,此時格子的中心坐標也是(120,120),倆個坐標吻合,保證了棋子落在棋盤位置的中央。</p><p> 由于走棋時,每個格子不能重復落子,所以,需要判斷棋手要落子的地方是不是已經(jīng)有了棋子,if(y!=80&&a[(x-120)/40][(y-120)/40]!=1&
54、amp;&a[(x-120)/40][(y-120)/40]!=2),當要落子的地方已經(jīng)有棋子的時候,也就是此時的棋子將要放置的位置的X和是Y坐標已經(jīng)和以前棋手1或者是2的棋子有重復,重復的時候則不能放置棋子。</p><p> 3.6.1落棋位置判斷</p><p> 對戰(zhàn)函數(shù)的主體部分,也就是倆棋手的輪換走棋。其中,T是已經(jīng)落下的棋子數(shù),當?shù)谝粋€人走時,T的值為1、3、5、
55、7等,當?shù)诙€人走棋時T的值為2、4、6、8等,所以,當T%2=0的時候,也就是T的值為2、4、6、8的時候,判定是棋手2在走棋,同時,將棋子設定為黑色,反之則為棋手1在走棋,棋的顏色也相應的變?yōu)榘咨?lt;/p><p> 走棋后,判斷棋盤的變化情況,將棋子途徑的地方恢復為空格狀態(tài),并且開始統(tǒng)計棋手的嘗試次數(shù),當一個棋手在一次走棋的過程中嘗試的次數(shù)超過空格的個數(shù)的時候,取消該棋手的本次走棋,改為下個旗手走棋,也就
56、是跳出本次循環(huán),進行下一次的循環(huán)。如果常識的次數(shù)沒有超過空格的個數(shù),而是落棋的位置無效,則旗手可以繼續(xù)嘗試,知道到達嘗試次數(shù)。</p><p> if(key==ESC)/*結束游戲*/</p><p><b> break;</b></p><p> if((score1+score2)==64||score1==0||score2==
57、0)/*格子已經(jīng)占滿或一方棋子為0判斷勝負*/</p><p><b> {</b></p><p> playWin();/*輸出最后結果*/</p><p> 當某次走棋后,接受的按鍵的值為ESC的時候,則退出游戲,當落子后在判定棋盤的變化時,一方的棋子為0,或者是雙方已經(jīng)下滿60手,則執(zhí)行 playWin 函數(shù),輸出游戲的結果
58、。</p><p> 3.6.2判斷棋盤的變化和改變棋子的顏色</p><p><b> 棋子顏色變化:</b></p><p> a[i][j]=1\2\?</p><p><b> 白色</b></p><p><b> 黑色</b><
59、;/p><p><b> 蘭色(背景)顏色</b></p><p><b> =1</b></p><p><b> 不為1或2</b></p><p><b> =2</b></p><p> 通過判斷數(shù)a[i][j]的值來
60、判斷棋子的顏色,已經(jīng)定義當a[i][j]=1的時候,棋子為白色,當a[i][j]=2的時候棋子為黑色,當a[i][j]的值不為1和2的時候,則此時恢復為背景。以下為走棋后改變棋子顏色的函數(shù)流程圖,根據(jù)游戲的游戲方法,在走棋后如果倆個己方棋子中間有對放棋子的話,那么對方棋子要改變?yōu)楹图悍较嗤念伾捎谂袛嘞嗯R棋子要向上、下、左、右、左上、左下、右上、右下八個方向判斷,所以在落子后需要判斷八次。</p><p>&
61、lt;b> 計算i j 值</b></p><p><b> 向8個方向逐一判斷</b></p><p> int i,j,k,kk,ii,jj,yes;</p><p><b> yes=0;</b></p><p> i=(x-120)/40; /*計算數(shù)組元素的行下
62、標*/</p><p> j=(y-120)/40; /*計算數(shù)組元素的列下標*/</p><p> 根據(jù)以上的式子計算數(shù)組的下標的值,由于第一次的落子走棋位置是在(120,120),所以在判斷位置是否在棋盤的范圍內的時候要在X、Y的值的基礎上分別減去120,每個格子的大小是40*40,所以,做減法后所得的值的大小除120后得到當前格子的信息。</p><p>
63、 根據(jù)黑白奇的游戲規(guī)則,在上,下,左,右,左上,左下,右上,右下的八個方向上,只要有己方的倆個棋子將對手的棋子圍住的話,則對方的棋子就要改變顏色,變?yōu)楹图悍筋伾恢?。所以在判斷棋盤的變化的時候,需要以新落子的位置為中心向八個方向進行判斷,現(xiàn)在以向右判斷為例,具體解釋:</p><p> if(j<6)/*往右邊*/</p><p><b> {</b>&l
64、t;/p><p> for(k=j+1;k<8;k++)</p><p> if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格結束*/</p><p><b> break;</b></p><p> if(a[i][k]!=0&&k<8)</p
65、><p><b> {</b></p><p> for(kk=j+1;kk<k&&k<8;kk++)/*判斷右邊*/</p><p><b> {</b></p><p> a[i][kk]=a[i][j]; /*改變棋子顏色*/</p><p&
66、gt; fillellipse(120+i*40,120+kk*40,15,15);</p><p><b> }</b></p><p> if(kk!=j+1) /*條件成立則有棋子改變過顏色*/</p><p><b> yes=1;</b></p><p><b> }&
67、lt;/b></p><p><b> }</b></p><p> 當以中心向右側判斷的時候,以現(xiàn)在所在的位置為起點,逐一向右尋找,當遇到自己的棋子或者是空格的時候則停止向右查找,當倆個己方的棋子的X坐標值相等的時候a[i][kk]=a[i][j],改變倆子之間的對手棋子顏色,,改變顏色后,意味著己方棋子以延伸到a[i][kk+1],則此時繼續(xù)向右判斷一次
68、,以此類推。</p><p> 將上述過程向八個方向分別做判斷。</p><p><b> 第四節(jié) 成績輸出</b></p><p><b> 清空成績</b></p><p> a[i][j]==1/2?</p><p><b> Score2++<
69、;/b></p><p><b> Score1++</b></p><p> Score2++>Score1++?</p><p><b> ?。?lt;/b></p><p><b> 黑色勝利</b></p><p><b>
70、 全部勝利</b></p><p><b> =?</b></p><p><b> 白色勝利</b></p><p><b> 3.7.3輸出成績</b></p><p> void PrintScore(int playnum)/*輸出成績*/<
71、/p><p><b> {</b></p><p> if(playnum==1)/*清除以前的成績*/</p><p><b> {</b></p><p> setfillstyle(SOLID_FILL,BLUE);</p><p> bar(550,100,64
72、0,400);</p><p><b> }</b></p><p> setcolor(RED);</p><p> settextstyle(0,0,4);/*設置文本輸出樣式*/</p><p> if(playnum==1)/*判斷輸出哪個棋手的分,在不同的位置輸出*/</p><p&
73、gt;<b> {</b></p><p> sprintf(playone,"%d",score1);</p><p> outtextxy(550,200,playone);</p><p><b> }</b></p><p><b> else<
74、/b></p><p><b> {</b></p><p> sprintf(playtwo,"%d",score2);</p><p> outtextxy(550,300,playtwo);</p><p><b> }</b></p><
75、p> setcolor(0);</p><p><b> }</b></p><p> 上述程序段的功能是在判定游戲接受后,將倆人的分數(shù)分別輸出。</p><p> bar(x1,y1,x2,y2)——畫一個方塊,無邊框,用當前顏色填充。</p><p> Outtextxy——在(X,Y)位置上輸出文本
76、文件</p><p> Settextstyle——設置輸出的字型、大小和方向</p><p> 在統(tǒng)計完得分后,分別在(550,200)和(550,300)倆個地方輸出參與游戲的倆個人的分數(shù)信息。</p><p> 3.7.4輸出最后的勝利者結果</p><p> void playWin()/*輸出最后的勝利者結果*/</p
77、><p><b> {</b></p><p> settextstyle(0,0,4);</p><p> setcolor(12);</p><p> if(score2>score1)/*開始判斷最后的結果*/</p><p> outtextxy(100,50,"bl
78、ack win!");</p><p><b> else</b></p><p> if(score2<score1)</p><p> outtextxy(100,50,"white win!");</p><p><b> else</b></
79、p><p> outtextxy(60,50,"you all win!");</p><p><b> }</b></p><p> 上述代碼是根據(jù)前述的統(tǒng)計得分的信息比較以后,得出勝利者,如果第二個人的得分高,則說明是黑子勝利,在(100,50)的位置上輸出black win,如果是得分一高,則說明是白子獲得勝利,在(
80、100,50)的位置上輸出“white win”,當出現(xiàn)得分相同的情況時,在(60,50)的位置上輸出“you all win!”。</p><p> 3.7 程序編寫中遇到的問題</p><p><b> 3.7.1宏定義</b></p><p> #define LEFT 0x4b00 /*光標左鍵值*/</p><
81、;p> #define RIGHT 0x4d00 /*光標右鍵值*/</p><p> #define DOWN 0x5000 /*光標下鍵值*/</p><p> #define UP 0x4800 /*光標上鍵值*/</p><p> #define ESC 0x011b /* ESC鍵值*/</p><p> #defi
82、ne ENTER 0x1c0d /* 回車鍵值*/</p><p> #define 宏名 宏體</p><p> #define是宏定義的命令,宏名是一個標識符,宏體是一個字符序列。</p><p> 功能:用指定的的宏名代替宏體。</p><p> 在預編譯的時候,編譯程序用宏名代替所有的宏體,這個過程成為宏展開。</p&g
83、t;<p> 說明:宏體要大寫,方便閱讀</p><p><b> 宏名倆側要有空格</b></p><p><b> 不能在行尾加分號</b></p><p> 取消宏定義用#undef</p><p><b> 宏定義可以嵌套使用</b></p
84、><p> 在此程序中,由于要使用鍵盤對游戲進行操作,使用鍵盤上的上、下、左、右四個方向鍵,所以在使用前,必須對其進行宏定義,使用相應的值來代替四個方向,這樣在操作中,系統(tǒng)接受的是一個值而不是方向,系統(tǒng)可以識別。 </p><p> 3.7.2 void</p><p> void playtoplay(void);/*人人對戰(zhàn)函數(shù)*/</p>&l
85、t;p> void DrawQp(void);/*畫棋盤函數(shù)*/</p><p> void SetPlayColor(int x);/*設置棋子第一次的顏色*/</p><p> void MoveColor(int x,int y);/*恢復原來棋盤狀態(tài)*/</p><p> void DoScore(void);/*處理分數(shù)*/</p>
86、;<p> void PrintScore(int n);/*輸出成績*/</p><p> void playWin(void);/*輸出勝利者信息*/</p><p> void對象的值(不存在)不能以任何方式使用,也不能被顯示或隱示的轉化為任何非空</p><p> 的形式。因為void表達式表達的是一個不存在的值,這樣的表達式要用在不需
87、要具體值的地方[6]。</p><p> 大多數(shù)的表達式語句為賦值語句,表達式所引起的作用在下一條語句執(zhí)行前結束。沒有表達式的語句是空語句,空語句常常為循環(huán)提供一個空的循環(huán)體或者是設置標號。</p><p> 在此程序的主程序前,定義了各個子函數(shù),由于只是定語了子函數(shù)的名稱,而沒有具體的語句,所以,此時的語句也相當于空語句,所以,在此給它們設定為void. </p>&l
88、t;p><b> 4.1運行結果</b></p><p> 4.2設計創(chuàng)新與關鍵技術</p><p><b> 4.2.1設計創(chuàng)新</b></p><p> 這個黑白棋游戲原程序的最大特點是采用了在主函數(shù)中調用子函數(shù)思想,每一種功能都是用子函數(shù)的辦法來進行處理,簡潔,清晰,方便,不容易出現(xiàn)錯誤。 在輸入錯誤
89、時本來想用一種警告的鈴聲來提醒用戶,由于所學的知識不多,自己的編程經(jīng)驗不足,按現(xiàn)有的知識水平有些東西暫時還無法解決,還有待于在以后的學習中不斷提高和改進!</p><p> 功能上的統(tǒng)一保證了面向對象設計的可擴展性。比如我要加入悔棋的功能,如果要改動面向過程的設計,那么從輸入到判斷到顯示這一連串的步驟都要改動,甚至步驟之間的循序都要進行大規(guī)模調整。如果是面向對象的話,只用改動棋盤對象就行了,棋盤系統(tǒng)保存了黑白雙
90、方的棋譜,簡單回溯就可以了,而顯示和規(guī)則判斷則不用顧及,同時整個對對象功能的調用順序都沒有變化,改動只是局部的。</p><p><b> 4.2.2結論</b></p><p> 本次設計的黑白棋游戲程序相對簡單,對用戶的要求不高,所以對任何人都適用,也就是說游戲是一個面向大眾化的程序。</p><p> 通過本次C程序課程設計,我覺得
91、對自己提高很大:克服了的偷懶的毛病,這在我以后的學習和工作中的心理定位與調節(jié)有很大的幫助。我感受到了編程是一項非常煩瑣周密的活動,他不但需要一個人周密的思考問題的能力,處理問題的能力,還需要有足夠的耐心和嚴謹治學的作風,來不得半點馬虎。</p><p> 通過本次論文設計,我初步學會了論文設計的基本方法,學會了怎樣去借鑒別人的方法和經(jīng)驗,知道如何去查找資料和整合處理這些資料的能力,這為以后的大學畢業(yè)設計論文打下
92、了一個初步的基礎使我收益最大的是享受到了一種成功的喜悅,在這兩個星期之中從開始的確定論文題目,然后是上網(wǎng)和上圖書館查找資料,編寫C語言原程序,然后是進行編譯,這個環(huán)節(jié)是一個非常痛苦和艱難的,常常會因為一小點的錯誤而在編譯失敗與再次修改的漫漫循環(huán)之路中,但失敗的越多,對人的考驗就越多,在編譯運行成功之后的享受成功的喜悅也就越多,另外在調試程序的過程中不斷的思考和運用已經(jīng)學到的知識,這對于自己是有很大的提高的。在這次程序中應用到了各種函數(shù)都
93、是通過老師的細心講解和大量的查閱資料而編寫出來的[1]。通過這次的課程設計使我對學過的函數(shù)有了更深的了解,對沒學過的函數(shù)有了初步的了解。最終我們編寫一個相對完整的計算器程序,是對C語言的一種更為特別的認識,也是對這一學期C語言課程中學習到的各種C語言語法結構、編程方法和編程技巧進行綜合復習以達到鞏固和提高的目的</p><p><b> 4.3設計心得</b></p><
94、;p> 經(jīng)過幾天的努力,終于快完成這次C程序課程設計,雖然這幾天太累了,但感覺卻真的很好,通過這次課程設計,自己對C語言有了新的認識,對整體的程序設計方法也有了全新的認識。</p><p> 在這次課程設計中,我深深地感受到了C語言的博大精深,從中知道了好多之前不知的知識。比如,用C語言還可以制作出有圖形化,有色彩的界面,之前都只是以為C語言制作出來的程序的運行界面是一片黑屏,沒有什么有趣的東西,老想著
95、那個黑屏下能做出什么方便用戶操作的界面呢?但通過這次課程設計,我清楚地得到了答案,用C語言做出的程序是很實用的,運行效率是很高的。</p><p> 在這次課程設計過程中,遇到了很多麻煩。首先,還是由于粗心大意造成的錯誤,比如寫少或寫多了一些字符,使程序編譯出現(xiàn)了錯誤,這些問題相信隨著以后實踐的加深會慢慢克服,還有一些致命的錯誤,就是出現(xiàn)邏輯上的問題,那些小小的錯誤都使得程序運行時各個功能之間調用出現(xiàn)了問題,使
96、程序運行得不到預期的結果,這些錯誤需要我們花費較長的時間去檢測,查看思路存在哪些錯誤。要克服這些困難就要求我們在設計程序過程中要保持邏輯的思維,多做一些實踐。</p><p> 通過這次課程設計,我學到了很多新的知識。例如,A.學會了如何利用設置繼點對程序進行檢測,查找程序錯誤,使對程序的錯誤檢查效率大大地提高了,使程序的一些不知如何霧里查找的錯誤被很快清查出來,克服了以往編程過程中一遇到錯誤就束手無策的缺點。
97、B.學會更多的庫函數(shù)的使用,比如一些屏幕操作函數(shù),光標定位函數(shù),時間函數(shù),這些都是以前沒有使用過的,也不曾認識的函數(shù)。C.學會了利用流程圖表示算法,在做程序設計的電子文檔時,深深地體會到了流程圖表示算法的重要性,通過流程圖可以將設計思想很清晰地表示出來,方便其它人查看,也方便自已寫程序。D.通過這次設計,基本掌握開發(fā)一個小型實用系統(tǒng)的基本方法,對運用和理解結構化程序設計的思想和方法進一步加深。</p><p>
98、 在這次課程設計中,我對程序做了一些擴展:A.采用類似圖形化的界面,運用一些屏幕操作函數(shù)對程序運行界面進行一些美化,使程序運行時會出現(xiàn)歡迎界面,運行界面,退出界面,在運行界面中,有輸入、輸出窗口,還有菜單窗口、操作信息提示窗口、這些窗口在程序運行過程中的位置是固定的,使信息可以在相對應的窗口內進行輸入、輸出,改變了以往程序運行界面從上到下進行輸入或輸出信息的單一窗口界面形式。使程序運行時出現(xiàn)了多窗口。B.在程序中調用一個時間函數(shù),使程序
99、運行窗口的右上角顯示出了當前的系統(tǒng)時間。</p><p> 在這次設計中,學到的知識很多,但要學知識也很多。在以后的學習中,我會努力地擴展C語言,加深對C語言的學習。</p><p><b> 有關說明</b></p><p><b> 5.1軟件說明書</b></p><p> TC一般安
100、裝在C盤下。</p><p><b> 游戲說明規(guī)則:</b></p><p> ESC 退出總游戲。</p><p> 用上下左右鍵來分別控制棋子的移動,移動到所定的位置后,按Enter表示下棋。</p><p> 棋子只能出現(xiàn)8*8的棋盤內,除了那些已經(jīng)有了棋子的地方不能走以外,不能吃子的地方也不能下子。&l
101、t;/p><p> 下子要求下在與對方棋子相鄰的空位上,要求所下的棋子和原有的已方棋子夾住對方的至少一個棋子(橫豎斜夾均可),然后把被夾住的子變成己方的顏色。下棋過程中,任何棋子既不會從棋盤上拿走,也不會從一個格子移到另一個格子,吃子時,不會發(fā)生連鎖反應,吃進的棋子不能再夾吃其他的子。當雙方都無棋可下,或者方格全部占滿后,棋局結束,子多的一方為勝方。</p><p><b> 參
102、考文獻:</b></p><p> [1] 譚浩強. 《C程序設計(第三版)》. 北京,清華大學出版社.2005,7</p><p> [2] 譚浩強. 《解放思想 勇于實踐 開創(chuàng)計算機基礎教育新局面》. 北京,清華大學出版社. 2002,7</p><p> [3] 唐全. 《計算機基礎教育的目標定位與實施》. 南京:藥學教育. 2001,
103、第2期</p><p> [4] 陳清華. 《 C語言課程設計案例精選與編程指導》. 南京:東南大學出版社, 2003</p><p> [5] 吳鴻雁.關于《計算機語言教學方法探討》江南大學信息學院學術論文集.2004.5[6] 譚浩強. 《C程序設計》.北京:清華大學出版社,2002,6</p><p> [7] 高福成 《C程序設計》.南京:
104、南開大學,2001,1</p><p><b> 致謝 </b></p><p> 完成本次課程設計,首先感謝zz老師,zz老師和zz老師的傾心指導,在設計中我們也遇到問題,這些問題都是在他們的幫助下才得到解決的,并且在對界面美觀度和程序系統(tǒng)可行性方面都給予了我們很多寶貴的建議。在程序的設計方面,老師花出自己很多時間來給我們講解決問題方法,讓我們能夠很順利的完成程
105、序的設計。同時感謝學校能夠給予我們這種機會,讓我們可以用所學知識用于實踐,無疑通過這次鍛煉,不論是對現(xiàn)在的學習還是今后的工作都有很大的幫助。</p><p> 另外,通過這次設計我從指導老師身上學到了很多東西。老師認真負責的工作態(tài)度,嚴謹?shù)闹螌W精神和深厚的理論水平都使我受益匪淺。無論在理論上還是在實踐中,都給與我很大的幫助,使我得到不少的提高這對于我以后的工作和學習都有一種巨大的幫助,感謝他們耐心的輔導。我非常
106、感謝我的老師。與此同時還有同學同樣給與我不少幫助,大家一起學習,一起探討、互相幫助、共同進步,讓我徹底認識了團結的力量,在以后的日子了,我要努力的學習,不辜負老師們的希望。</p><p><b> 附錄</b></p><p><b> 源程序</b></p><p> /*3.3.4 源程序*/</p>
107、;<p> #include "graphics.h" /*圖形系統(tǒng)頭文件*/</p><p> #define LEFT 0x4b00 /*光標左鍵值*/</p><p> #define RIGHT 0x4d00 /*光標右鍵值*/</p><p> #define DOWN 0x5000 /*光標下鍵值*/<
108、/p><p> #define UP 0x4800 /*光標上鍵值*/</p><p> #define ESC 0x011b /* ESC鍵值*/</p><p> #define ENTER 0x1c0d /* 回車鍵值*/</p><p> int a[8][8]={0},key,score1,score2;/*具體分數(shù)以及按鍵與存
109、放棋子的變量*/</p><p> char playone[3],playtwo[3];/*兩個人的得分轉換成字符串輸出*/</p><p> void playtoplay(void);/*人人對戰(zhàn)函數(shù)*/</p><p> void DrawQp(void);/*畫棋盤函數(shù)*/</p><p> void SetPlayColo
110、r(int x);/*設置棋子第一次的顏色*/</p><p> void MoveColor(int x,int y);/*恢復原來棋盤狀態(tài)*/</p><p> int QpChange(int x,int y,int z);/*判斷棋盤的變化*/</p><p> void DoScore(void);/*處理分數(shù)*/</p><p&
111、gt; void PrintScore(int n);/*輸出成績*/</p><p> void playWin(void);/*輸出勝利者信息*/</p><p> /******主函數(shù)*********/</p><p> void main(void)</p><p><b> {</b></p&
112、gt;<p> int gd=DETECT,gr;</p><p> initgraph(&gd,&gr,"c:\\tc"); /*初始化圖形系統(tǒng)*/</p><p> DrawQp();/*畫棋盤*/</p><p> playtoplay();/*人人對戰(zhàn)*/</p><p>&l
113、t;b> getch();</b></p><p> closegraph();/*關閉圖形系統(tǒng)*/</p><p><b> }</b></p><p> void DrawQp()/*畫棋盤*/</p><p><b> {</b></p><p&
114、gt;<b> int i,j;</b></p><p> score1=score2=0;/*棋手一開始得分都為0*/</p><p> setbkcolor(BLUE);</p><p> for(i=100;i<=420;i+=40)</p><p><b> {</b><
115、;/p><p> line(100,i,420,i);/*畫水平線*/</p><p> line(i,100,i,420); /*畫垂直線*/</p><p><b> }</b></p><p> setcolor(0);/*取消圓周圍的一圈東西*/</p><p> setfillst
116、yle(SOLID_FILL,15);/*白色實體填充模式*/</p><p> fillellipse(500,200,15,15); /*在顯示得分的位置畫棋*/</p><p> setfillstyle(SOLID_FILL,8); /*黑色實體填充模式*/</p><p> fillellipse(500,300,15,15);</p>
117、<p> a[3][3]=a[4][4]=1;/*初始兩個黑棋*/</p><p> a[3][4]=a[4][3]=2;/*初始兩個白棋*/</p><p> setfillstyle(SOLID_FILL,WHITE);</p><p> fillellipse(120+3*40,120+3*40,15,15);</p><
118、;p> fillellipse(120+4*40,120+4*40,15,15);</p><p> setfillstyle(SOLID_FILL,8);</p><p> fillellipse(120+3*40,120+4*40,15,15);</p><p> fillellipse(120+4*40,120+3*40,15,15);</
119、p><p> score1=score2=2; /*有棋后改變分數(shù)*/</p><p> DoScore();/*輸出開始分數(shù)*/</p><p><b> }</b></p><p> void playtoplay()/*人人對戰(zhàn)*/</p><p><b> {</b&
120、gt;</p><p> int x,y,t=1,i,j,cc=0;</p><p> while(1)/*換棋手走棋*/</p><p><b> {</b></p><p> x=120,y=80;/*每次棋子一開始出來的坐標,x為行坐標,y為列坐標*/</p><p> while
121、(1) /*具體一個棋手走棋的過程*/</p><p><b> {</b></p><p> PrintScore(1);/*輸出棋手1的成績*/</p><p> PrintScore(2);/*輸出棋手2的成績*/</p><p> SetPlayColor(t);/*t變量是用來判斷棋手所執(zhí)棋子的顏色*/
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- c語言課程設計--黑白棋游戲
- 黑白棋游戲課程設計
- c語言課程設計報告--黑白棋
- vb黑白棋游戲課程設計報告
- c語言程序設計課程設計(論文)-黑白棋
- 黑白棋游戲數(shù)據(jù)結構課程設計
- 黑白棋游戲畢業(yè)設計
- 黑白棋畢業(yè)論文---黑白棋游戲設計與開發(fā)(含外文翻譯)
- 基于qt的黑白棋游戲
- 黑白棋游戲畢業(yè)論文
- 嵌入式wince課程設計報告(黑白棋)
- 黑白棋游戲設計與開發(fā)畢業(yè)論文
- 基于qt的黑白棋游戲開發(fā)(論文)
- 計算機技術基礎課程設計---黑白棋
- 基于Qt的黑白棋游戲(終稿).doc
- 基于java me的黑白棋游戲設計及實現(xiàn)畢業(yè)設計
- 基于java me的黑白棋游戲設計及實現(xiàn)畢業(yè)設計
- 基于Alpha-Btea剪枝算法的黑白棋游戲的設計與開發(fā).pdf
- c語言課程設計-數(shù)組游戲
- c語言小游戲課程設計
評論
0/150
提交評論