版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 計算機程序設(shè)計基礎(chǔ)(C語言)課程設(shè)計題目:簡易五子棋軟件設(shè)計 院(系、部): 信息工程學(xué)院 姓 名: 班 級: 指導(dǎo)教師簽名 2011 年7月7 日·北京目錄任務(wù)書-第 3 頁總體設(shè)計-第 4 頁模塊劃分-第 4 頁算法說明-第 4 頁流程圖-第 5 頁程序測試-第 9 頁結(jié)論-第 22 頁體會及建議-第 22 頁參考文獻-第 23 頁任務(wù)書題目9 :簡易五子棋軟件設(shè)計一 設(shè)計目的:通過一個綜合應(yīng)用程序的開發(fā),掌握C語言程序設(shè)計的基本方法和常用算法,學(xué)會從實際應(yīng)用出發(fā)來分析問題,進行軟件規(guī)劃和算法設(shè)計,逐步求精,養(yǎng)成良好的編程風格,熟悉軟件設(shè)計的基本步驟,為后續(xù)課程的學(xué)習打下良好的
2、基礎(chǔ)。功能:在單機上通過操作鍵盤來進行二人對戰(zhàn),五個棋子連在一起時能顯示輸贏。二 基本要求:(1)鍵盤上事先設(shè)定8個按鍵,分作兩組,每組四個,分別代表兩個人用來控制棋子的上下左右鍵。(2) 盤,15條橫線,15條豎線,在直線交點處下棋子(實心圓形)。(3) 黑子先行,黑白交替下子,在棋盤上設(shè)定一個與棋盤格大小邊長相等的正方形,初始狀態(tài),正方形的中心位于期盼的中心點。當一方欲走棋的時候,應(yīng)用四個按鍵來控制所要下棋的位置,每按一次按鍵,正方形都要向相應(yīng)方向移動一個格,但不能讓其移出邊界。當按下回車鍵時,應(yīng)在正方形所在位置放下一個棋子,然后此組按鍵不能操作,換另一個人下棋,用另一組按鍵,規(guī)則同前。(
3、4) 當任何一方有五個棋子沿著橫,豎,斜連在一起時,系統(tǒng)自動判斷贏棋,并顯示黑方或白方勝利。棋局結(jié)束后,任何一方均不能繼續(xù)操作。相關(guān)知識:圖形繪制、音樂制作、鍵盤響應(yīng)功能擴充:(1)讓喇叭發(fā)出某種聲音,將要移出邊界時,發(fā)出另一種警告聲音 (2)其他自己定義的功能。三 總體設(shè)計本程序是為了實現(xiàn)運行簡易五子棋游戲的運行?;诮Y(jié)構(gòu)化設(shè)計思想的指導(dǎo),本程序在設(shè)計的同時,將各個功能分為多個自定義函數(shù)來實現(xiàn),最后在”main”函數(shù)里進行功能的整合。程序設(shè)計大體思路:由歡迎界面進入主程序,介紹游戲玩的方式,作者。若想進入游戲按y后回車,若想退出游戲按n即可。畫16*16的五子棋棋盤,進入游戲界面,當每次落子
4、時判斷是否當前棋子是否有同色的五個棋子,當棋子接近棋盤邊界時,有報警音樂響起,當有五個同色的棋子時,播放勝利的音樂并且顯示贏棋的玩家。音樂制作: 播放勝利的音樂,棋子每步的音樂及接近邊界的報警聲音。四 模塊劃分聲音模塊棋盤模塊圖形繪制圖形填充五 算法說明步驟1: 初始化顯示器,設(shè)置背景顏色和字體顏色及大小,輸出歡迎界面,等待用戶輸入y進入游戲界面。步驟2: 得到輸入鍵后,進入游戲界面,畫16*16的棋盤。步驟3: 根據(jù)”Key值,應(yīng)用”switch”語句進行選擇。步驟4: 判斷當前棋子是否獲勝。步驟5: 清除屏幕上的棋盤,播放勝利音樂,恭喜贏得玩家。六 流程圖主函數(shù) main( )Step1
5、調(diào)用welcomeinfo( )進行歡迎詞Step2 調(diào)用Drawboard( )畫棋盤Step3 調(diào)用show message( )顯示贏棋信息Step4 調(diào)用closegraph( )關(guān)閉圖形系統(tǒng)開始調(diào)用welcomeinfo()進行歡迎詞調(diào)用Drawboard()畫棋盤調(diào)用show message()顯示贏棋信息調(diào)用closegraph()關(guān)閉圖形系統(tǒng)退出程序函數(shù)welcomeinfo( )Step1 移動光標到指定位置Step2 顯示歡迎信息Step3 判斷是否要進入游戲開始移動光標到指定位置(x,y)顯示歡迎信息Do you want to enter game(y/n)Ch=n|c
6、h=N?進入程序Exit(0)10函數(shù)Drawboard( )Step1 定義X1,X2,Y1,Y2和背景Step1 畫16條豎線Step1 畫16條橫線開始X1=1,X2=16X1<=16X1+1=X1X1+Y1=1,Y2=16Y2<=16Y1+1=Y1Y1+結(jié)束00函數(shù)Alternation( )開始Int flag=1Flag=1Flag=2Flag=1結(jié) 束0函數(shù)music( )Step1 定義變量初值Step2 for 語句Step3 關(guān)閉聲音函數(shù)開 始Freq=50Freq<100Freq+=1Freq+結(jié)束 nosound01函數(shù)Resultcheck( )St
7、ep1 向八個方向數(shù)棋子Step2 判斷同一種棋子是否為5個Step3 退出函數(shù)開始Int j,k,n1=0,n2=0;While(1)J=x,k=yj>=1j-Statusjk=flag N1+n2-1>=5Return 1breakN1+breakJ=x,k=yJ<=15J+Statusjk=flagN2+break0001101011函數(shù)done ( )Step1:根據(jù)不同key值進行不同操作Step2:判斷下一步是否超邊界Step3:在空白的地方落棋子 開始Switch(key)leftRightDownUpEscEnter向左向右向下向上退出落棋出去運算結(jié)果結(jié)束七
8、程序測試#include<stdio.h>#include<stdlib.h>#include<graphics.h>#include<bios.h>#include<conio.h>#include<dos.h>/*編譯預(yù)處理,定義按鍵碼*/#define LEFT 0x4b00 /*左移-方向鍵left*/#define RIGHT 0x4d00 /*右移-方向鍵right*/#define DOWN 0x5000 /*下移-方向鍵down*/ #define UP 0x4800 /*上移-方向鍵up*/#define
9、 ENTER 0x1c0d /*ENTER鍵表示落子*/*若想在游戲中途退出, 可按 Esc 鍵*/#define ESC 0x011b /*設(shè)置偏移量*/#define OFFSET 20#define OFFSET_x 4#define OFFSET_y 3/*定義數(shù)組大小*/#define N 16/*定義全局變量*/int statusNN; /*定義的數(shù)組,保存狀態(tài)*/int step_x,step_y;/*行走的坐標*/int key ; /*獲取按下的鍵盤的鍵*/int flag; /*玩家標志*/*自定義函數(shù)原型*/void music();void WinMusic();vo
10、id DrawBoard();void DrawCircle(int x,int y,int color);void Alternation();void JudgePlayer(int x,int y);void Done();int ResultCheck(int x,int y);void WelcomeInfo();void ShowMessage();/*定義函數(shù)*/*顯示歡迎信息函數(shù)*/void WelcomeInfo() char ch ; /*移動光標到指定位置*/ gotoxy(12,4); /*顯示歡迎信息*/ printf("Welcome you to gob
11、ang word!"); gotoxy(12,6); printf("1.You can use the up,down,left and right key to move the chessman,"); gotoxy(12,8); printf(" and you can press ENTER key to enter after you move it !"); gotoxy(12,10); printf("2.You can use Esc key to exit the game too !"); gotoxy
12、(12,12); printf("3.Don not move the pieces out of the chessboard !"); gotoxy(12,14); printf("Game Producer: *Student Number:* school:BIPT"); gotoxy(12,16); printf("DO you want to continue ?(Y/N)"); ch=getchar(); /*判斷程序是否要繼續(xù)進行*/ if(ch='n'|ch='N') /*如果不繼續(xù)進
13、行,則推出程序*/ exit(0);/*走棋音樂*/void music()int freq;for(freq=50;freq<100;freq+=1)sound (freq);delay(1000);nosound();/*畫棋盤函數(shù)*/void DrawBoard() int x1,x2; int y1,y2; /*設(shè)置背景色*/ setbkcolor(2); /*設(shè)置線條顏色*/ setcolor(1); /*設(shè)置線條風格、寬度*/ setlinestyle(DOTTED_LINE,1,1); /*按照預(yù)設(shè)的偏移量開始畫棋盤*/ /*畫16條豎線*/ for(x1=1,y1=1,y
14、2=16;x1<=16;x1+)line(x1+OFFSET_x)*OFFSET-8.5,(y1+OFFSET_y)*OFFSET-8,(x1+OFFSET_x)*OFFSET-8.5,(y2+OFFSET_y)*OFFSET-8); /*畫16條橫線*/ for(x1=1,y1=1,x2=16;y1<=16;y1+) line(x1+OFFSET_x)*OFFSET-8.5,(y1+OFFSET_y)*OFFSET-8.5,(x2+OFFSET_x)*OFFSET-8.5,(y1+OFFSET_y)*OFFSET-8.5); /*將各個點的狀態(tài)設(shè)置為0*/ for(x1=1;x1
15、<=16;x1+) for(y1=1;y1<=16;y1+) statusx1y1=0; /*顯示幫助信息*/ setcolor(14); /*設(shè)置字體、大小*/ settextstyle(1,0,1); outtextxy(460,61," Player key:"); setcolor(9); settextstyle(3,0,1);outtextxy(460,84,"*"); setcolor(5); settextstyle(3,0,1); outtextxy(460,100,"play1 UP-up "); ou
16、ttextxy(460,130,"play1 DOWN-down "); outtextxy(460,160,"play1 LEFT-left"); outtextxy(460,190,"play1 RIGHT-right"); setcolor(6); settextstyle(3,0,1); outtextxy(460,210,"play2 UP-up "); outtextxy(460,240,"play2 DOWN-down"); outtextxy(460,270,"play
17、2 LEFT-left"); outtextxy(460,300,"play2 RIGHT-right"); setcolor(9); settextstyle(3,0,1); outtextxy(460,330,"ENTER-enter"); setcolor(9); settextstyle(3,0,1); outtextxy(460,360,"*"); setcolor(14); settextstyle(1,0,1); outtextxy(460,380," Exit:"); setcolor(9
18、); settextstyle(3,0,1); outtextxy(460,410," ESC"); setcolor(15); settextstyle(3,0,3); outtextxy(95,380,"Welcome to gobang word !"); outtextxy(95,420,"Student Number: ");/*畫圓函數(shù)*/void DrawCircle(int x,int y,int color) setcolor(color); /*設(shè)置畫圓線條的風格,寬度,這里設(shè)置為虛線*/ setlinestyle
19、(SOLID_LINE,0,1); x=(x+OFFSET_x)*OFFSET+0.5; y=(y+OFFSET_y)*OFFSET+0.5; /*以(x,y)為圓心,8為半徑畫圓*/ circle(x,y,8); setfillstyle(1,color); floodfill(x,y,color); music();/*勝利時放的音樂*/void WinMusic()int i,j;int fr=392,392,440,294,262,262,220,294,392,392, 440,532,440,392,262,262,220,294,392,294, 262,247,220,196,
20、392,294,330,294,262,262, 220,294,330,294,262,294,262,247,220,196;int tim=4,2,2,8,4,2,2,8,4,4,2,2,2,2,4,2,2,8,4,4, 4,2,2,4,4,4,2,2,4,2,2,2,2,2,2,2,2,2,2,12;for(i=0;i<40;i+) sound(fri); delay(timi*20000); nosound(); /*交換行棋方函數(shù)*/void Alternation() if(flag=1) flag=2 ; else flag=1 ; /*對不同的行棋方畫不同顏色的圓函數(shù)*
21、/void JudgePlayer(int x,int y) if(flag=1) DrawCircle(x,y,8); if(flag=2) DrawCircle(x,y,15);/*判斷當前行棋方是否獲勝函數(shù)*/int ResultCheck(int x,int y) int j,k; int n1,n2 ; while(1) /*對水平方向進行判斷是否有5個同色的圓*/ n1=0; n2=0; /*水平向左數(shù)*/ for(j=x,k=y;j>=1;j-) if(statusjk=flag) n1+; else break; /*水平向右數(shù)*/ for(j=x,k=y;j<=1
22、5;j+) if(statusjk=flag) n2+; else break; if(n1+n2-1>=5) return(1); /*對垂直方向進行判斷是否有5個同色的圓*/ n1=0; n2=0; /*垂直向上數(shù)*/ for(j=x,k=y;k>=1;k-) if(statusjk=flag) n1+; else break ; /*垂直向下數(shù)*/ for(j=x,k=y;k<=15;k+) if(statusjk=flag) n2+; else break ; if(n1+n2-1>=5) return(1); /*從左上方到右下方進行判斷是否有5個同色的圓*/
23、 n1=0; n2=0; /*向左上方數(shù)*/ for(j=x,k=y;(j>=1)&&(k>=1);j-,k-) if(statusjk=flag) n1+; else break; /*向右下方數(shù)*/ for(j=x,k=y;(j<=15)&&(k<=15);j+,k+) if(statusjk=flag) n2+; else break; if(n1+n2-1>=5) return(1); /*從右上方到左下方進行判斷是否有5個同色的圓*/ n1=0; n2=0; /*向右上方數(shù)*/ for(j=x,k=y;(j<=15)
24、&&(k>=1);j+,k-) if(statusjk=flag) n1+; else break; /*向左下方數(shù)*/ for(j=x,k=y;(j>=1)&&(k<=15);j-,k+) if(statusjk=flag) n2+; else break; if(n1+n2-1>=5) return(1); return(0); /*執(zhí)行下棋函數(shù)*/void Done() int i ; int j ; /*根據(jù)不同的key值進行不同的操作*/ switch(key) /*如果是向左移動的*/ case LEFT: /*如果下一步超出
25、棋盤左邊界則什么也不作*/ if(step_x-1<0) /*報警音樂*/ sound(1000); /*揚聲器的發(fā)生時間,為1秒鐘*/ delay(1000); nosound(); break ; else for(i=step_x-1,j=step_y;i>=1;i-) if(statusij=0) /*每移動一步畫一個圓,消除移動的過程*/ DrawCircle(step_x,step_y,2); break ; if(i<1) break ; step_x=i ; JudgePlayer(step_x,step_y); break ; /*如果是向右移動的*/ ca
26、se RIGHT : /*如果下一步超出棋盤右邊界則什么也不作*/ if(step_x+1>15) /*報警音樂*/ sound(1000); /*揚聲器的發(fā)生時間,為1秒鐘*/ delay(1000); nosound(); break ; else for(i=step_x+1,j=step_y;i<=15;i+) if(statusij=0) /*每移動一步畫一個圓,消除移動的過程*/ DrawCircle(step_x,step_y,2); break ; if(i>15)break ; step_x=i ; /*根據(jù)不同的行棋者畫不同顏色的圓*/ JudgePlay
27、er(step_x,step_y); /*顯示行棋一方是誰*/ break ; /*如果是向下移動的*/ case DOWN : /*如果下一步超出棋盤下邊界則什么也不作*/ if(step_y+1)>15) /*報警音樂*/ sound(1000); /*揚聲器的發(fā)生時間,為1秒鐘*/ delay(1000); nosound(); break ; else for(i=step_x,j=step_y+1;j<=15;j+) if(statusij=0) DrawCircle(step_x,step_y,2); break ; if(j>15)break ; step_y=
28、j ; JudgePlayer(step_x,step_y); break ; /*如果是向上移動的*/ case UP : /*報警音樂*/ if(step_y-1)<0) sound(1000); delay(1000); nosound(); break ; else for(i=step_x,j=step_y-1;j>=1;j-) if(statusij=0) DrawCircle(step_x,step_y,2); break ; if(j<1)break ; step_y=j ; JudgePlayer(step_x,step_y); break ; /*如果是退
29、出鍵*/case ESC :/*報警音樂*/ sound(500); /*揚聲器的發(fā)生時間,為1秒鐘*/ delay(1000); nosound(); break ; /*如果是確定鍵*/ case ENTER: /*如果操作是在棋盤之內(nèi)*/ if(step_x>=1&&step_x<=15&&step_y>=1&&step_y<=15) /*按下確定鍵后,如果棋子當前位置的狀態(tài)為0*/ if(statusstep_xstep_y=0) /*則更改棋子當前位置的狀態(tài)在flag,表示是哪個行棋者行的棋*/ statusst
30、ep_xstep_y=flag ; /*如果判斷當前行棋者獲勝*/ if(ResultCheck(step_x,step_y)=1) gotoxy(30,4); setbkcolor(BLUE); /*清除圖形屏幕*/ cleardevice(); /*為圖形輸出設(shè)置當前視口*/ setviewport(100,100,540,380,1); /*綠色實填充*/ setfillstyle(1,2); setcolor(YELLOW); /*畫矩形*/ rectangle(0,0,439,279); floodfill(50,50,14); setcolor(12); settextstyle(
31、1,0,5); /*三重筆劃字體, 水平放大5倍*/ outtextxy(20,20,"Congratulation !"); setcolor(15); settextstyle(3,0,4); /*如果是Player1獲勝,顯示獲勝信息*/ if(flag=1) /*無襯筆劃字體, 水平放大5倍*/ outtextxy(20,120,"Player1 win the game !"); WinMusic(); /*如果是Player1獲勝,顯示獲勝信息*/ if(flag=2) /*無襯筆劃字體, 水平放大5倍*/ outtextxy(20,120,
32、"Player2 win the game !"); WinMusic(); setcolor(14); settextstyle(2,0,8); getch(); exit(0); /*如果當前行棋者沒有獲勝,則交換行棋方*/ Alternation(); /*提示行棋方是誰*/ ShowMessage(); break; else break ; /*顯示行棋方函數(shù)*/void ShowMessage() /*輪到Player1行棋*/ if(flag=1) setcolor(2); settextstyle(1,0,1); gotoxy(100,30); /*覆蓋原有
33、的字跡*/ outtextxy(100,30,"It's turn to Player2 !"); setcolor(12); settextstyle(1,0,1); outtextxy(100,30,"It's turn to Player1 !"); /*輪到Player2行棋*/ if(flag=2) setcolor(2); settextstyle(1,0,1); /*覆蓋原有的字跡*/ outtextxy(100,30,"It's turn to Player1 !"); setcolor(12); settextstyle(1,0,1); gotoxy(100,20); outtextxy(100,30,"It's turn to Player2 !"); /*主函數(shù)*/int main() int gdriver; int gmode; int errorcode; /*清
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 溫州大學(xué)《小學(xué)音樂課程設(shè)計與實踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024新版?zhèn)€體勞動協(xié)議樣本版
- 2024監(jiān)理服務(wù)擴展合同標準文本一
- 2025年度新能源汽車充電樁采購安裝合同3篇
- 二零二五年科技園區(qū)PPP項目合同第三、四章技術(shù)創(chuàng)新與產(chǎn)業(yè)支持細則3篇
- 唐山科技職業(yè)技術(shù)學(xué)院《吉他(二)》2023-2024學(xué)年第一學(xué)期期末試卷
- 蘇州農(nóng)業(yè)職業(yè)技術(shù)學(xué)院《美國文學(xué)史與作品選讀》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度班主任班級管理師徒實踐合作協(xié)議3篇
- 事業(yè)單位專任人員2024河南聘用協(xié)議模板版
- 石家莊城市經(jīng)濟職業(yè)學(xué)院《制藥工程學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 垃圾焚燒發(fā)電環(huán)保培訓(xùn)
- 北京市朝陽區(qū)2024-2025學(xué)年高一(上)期末化學(xué)試卷(含答案)
- 中醫(yī)基礎(chǔ)學(xué)考試題(附答案)
- 2025貴州建筑安全員B證考試題庫附答案
- 2024年杭州師范大學(xué)附屬醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 2024-2025學(xué)年八年級歷史上冊期末復(fù)習課件
- 2025年云南省大理州事業(yè)單位招聘339人歷年高頻重點提升(共500題)附帶答案詳解
- 2024-2025學(xué)年度第一學(xué)期三年級數(shù)學(xué)寒假作業(yè) 有答案
- 大型起重機械現(xiàn)場管理手冊
- 2024年貴州省公務(wù)員錄用考試《行測》真題及答案解析
- 江蘇省南京市聯(lián)合體2024-2025學(xué)年九年級上學(xué)期期中學(xué)情分析化學(xué)試卷(無答案)
評論
0/150
提交評論