算法設(shè)計與分析課程設(shè)計報告五子棋_第1頁
算法設(shè)計與分析課程設(shè)計報告五子棋_第2頁
算法設(shè)計與分析課程設(shè)計報告五子棋_第3頁
算法設(shè)計與分析課程設(shè)計報告五子棋_第4頁
算法設(shè)計與分析課程設(shè)計報告五子棋_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、西 安 工 業(yè) 大 學計算機科學與工程學院算 法 設(shè) 計 與 分 析 課 程 設(shè) 計題 目: 五子棋 班 級: 050606 人 數(shù): 13人 成 員: 陳瑋 高謙 侯夕杰 馬濤 宋文彬 王偉 周仁文 邵文清趙瑞紅 李盈超 尉建明 陳建軍 張祥雄 學 號: 050606102 050606105 050606108 050606114 050606117 050606120 050606126 050606129 050606132 040609111 040606123 050606101 040610127時 間: 2008年元月16日 班級050606 學號題目五子棋完成時間1月16日指

2、導教師楊國梁、陳芳小組排名邵文清,趙瑞紅,李盈超,尉建明,周仁文,侯夕杰, 陳建軍 , 張祥雄 陳瑋,宋文彬 , 高謙 ,馬濤 , 王偉 小組成績個人得分第1名邵文清趙瑞紅貢獻細節(jié)設(shè)計,完成void draw_box();void change();void judgekey()的設(shè)計并完成實驗報告第2名李盈超尉建明貢獻主要負責程序的整體規(guī)劃,完成主函數(shù)的設(shè)及相關(guān)變量的定義,完成void attentoin()的設(shè)計第3名周仁文侯夕杰貢獻完成void judgewho(int x,int y)的設(shè)計第4名 陳建軍 張祥雄 貢獻完成void draw_cicle(int x,int y,int

3、color)的設(shè)計第5名陳瑋宋文彬 貢獻完成int judgeresult(int x,int y)的設(shè)計第6名高謙 ,馬濤 王偉 貢獻調(diào)試并運行程序備注考核標準:1. 個人文檔資料40%2. 軟件驗收40%3. 考勤20%-131. 課程設(shè)計報告1.1問題描述連珠(五子棋)是有兩個人在一盤棋上進行對抗的競技運動。在對局開始時,先由用戶選擇哪方先開局,先開局一方將一枚棋子落在一點上,然后由另一方在對方棋周圍的交叉點上落子,如此輪流落子,直到某一方首先在棋盤的直線、橫線或斜線上形成連續(xù)的五子則該方就算獲勝。此時,算法結(jié)束。當有任何一方想退出時,都可在算法中實現(xiàn)。 1.2需求分析 (1)、輸出游戲

4、規(guī)則并由用戶決定是否遵守并開局。 (2)、要求動態(tài)畫出棋盤大小。(3)、畫棋子并確定其顏色。 (4)、玩家輪流下棋。(5)、判斷鍵盤輸入哪個鍵按規(guī)則執(zhí)行操作 (6)、判斷誰先落棋。 (7)判斷贏家 開始西 安 工 業(yè) 大 學計算機科學與工程學院算 法 設(shè) 計 與 分 析 課 程 設(shè) 計題 目: 五子棋 班 級: 050606 人 數(shù): 13人 成 員: 陳瑋 高謙 侯夕杰 馬濤 宋文彬 王偉 周仁文 邵文清趙瑞紅 李盈超 尉建明 陳建軍 張祥雄 學 號: 時 間: 2008年元月16日 目 錄1課程設(shè)計報告-1 1.1問題描述-1 1.2需求分析-1 1.3概要設(shè)計-1 1.4詳細設(shè)計-頁碼

5、1.5調(diào)試分析-頁碼2源程序-頁碼3程序的說明文件-頁碼4課設(shè)總結(jié)-頁碼1. 課程設(shè)計報告1.1問題描述連珠(五子棋)是有兩個人在一盤棋上進行對抗的競技運動。在對局開始時,先由用戶選擇哪方先開局,先開局一方將一枚棋子落在一點上,然后由另一方在對方棋周圍的交叉點上落子,如此輪流落子,直到某一方首先在棋盤的直線、橫線或斜線上形成連續(xù)的五子則該方就算獲勝。此時,算法結(jié)束。當有任何一方想退出時,都可在算法中實現(xiàn)。 1.2需求分析 (1)、輸出游戲規(guī)則并由用戶決定是否遵守并開局。 (2)、要求動態(tài)畫出棋盤大小。(3)、畫棋子并確定其顏色。 (4)、玩家輪流下棋。(5)、判斷鍵盤輸入哪個鍵按規(guī)則執(zhí)行操作

6、(6)、判斷誰先落棋。 (7)判斷贏家1.3概要設(shè)計 流程圖:Y Y N Y N Y N Y 1.4詳細設(shè)計 1.5調(diào)試分析 運行結(jié)果:屏幕顯示:Please input who is first:1 or 2 當輸入1時,白棋先走;當輸入2時,紅棋先走。屏幕顯示:Please input the size of chessbox:從鍵盤輸入t值,則棋盤大小為t*t型。屏幕顯示:Left, Right, Up, Down KEY to move, Space to put, ESC-quit 及棋盤,棋子,用上下左右鍵控制棋子向,用空格鍵確定棋子的落點 。當白棋贏時,顯示The White W

7、in ! 當紅棋贏時,顯示The Red Win !遇到的問題:算法改進思想:將棋盤由原先的固定大小改進為可動態(tài)變化,由原來固定的白棋先走改進為讓用戶可以選擇哪方先落子。2源程序#include<stdio.h>#include<stdlib.h>#include<graphics.h>#include<bios.h>#include<conio.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b

8、#define SPACE 0x3920#define BILI 20#define JZ 4#define JS 3#define N 19int boxNN,s; /*落子點*/int step_x,step_y ;int key ;int flag,i,j ;void draw_box();void draw_cicle(int x,int y,int color);void change();void judgewho(int x,int y);void judgekey();int judgeresult(int x,int y);void attentoin();void atte

9、ntoin() /*游戲規(guī)則*/ char ch ; printf("Play attentoins:nn"); printf("1. Press Left,Right,Up,Down Key to move Piecenn"); printf("2. Press Space to place the Piecenn"); printf("3. DO NOT press Space outside of the draw_boxnn"); printf("Do you accept the above P

10、laying attentoins? Y/Other:"); while(1) ch=getche(); if(ch='Y'|ch='y') break ; else exit(0); printf("nnwhat size of the draw_box:"); scanf("%d",&s); printf("nnwho is the frist:1 or 2? "); while(1) scanf("%d",&flag); if(flag!=1&

11、&flag!=2) printf("Error!n"); else break; void draw_box() /*畫出棋盤*/ int x1,x2,y1,y2 ; setbkcolor(LIGHTBLUE); setcolor(YELLOW); gotoxy(7,2); printf("Left, Right, Up, Down KEY to move, Space to put, ESC-quit."); for(x1=1,y1=1,y2=s;x1<=s;x1+) line(x1+JZ)*BILI,(y1+JS)*BILI,(x1+J

12、Z)*BILI,(y2+JS)*BILI); for(x1=1,y1=1,x2=s;y1<=s;y1+) line(x1+JZ)*BILI,(y1+JS)*BILI,(x2+JZ)*BILI,(y1+JS)*BILI); for(x1=1;x1<=s;x1+) for(y1=1;y1<=s;y1+) boxx1y1=0 ;void draw_cicle(int x,int y,int color) /*棋子*/ setcolor(color); setlinestyle(SOLID_LINE,0,1); x=(x+JZ)*BILI ; y=(y+JS)*BILI ; circ

13、le(x,y,8);void judgekey() switch(key) case LEFT : if(step_x-1<0) break ; else for(i=step_x-1,j=step_y;i>=1;i-) if(boxij=0) draw_cicle(step_x,step_y,LIGHTBLUE); break ; if(i<1)break ; step_x=i ; judgewho(step_x,step_y); break ; case RIGHT : if(step_x+1>s) break ; else for(i=step_x+1,j=ste

14、p_y;i<=s;i+) if(boxij=0) draw_cicle(step_x,step_y,LIGHTBLUE); break ; if(i>s)break ; step_x=i ; judgewho(step_x,step_y); break ; case DOWN : if(step_y+1>s) break ; else for(i=step_x,j=step_y+1;j<=s;j+) if(boxij=0) draw_cicle(step_x,step_y,LIGHTBLUE);break ; if(j>s)break ; step_y=j ; j

15、udgewho(step_x,step_y); break ; case UP : if(step_y-1<0) break ; else for(i=step_x,j=step_y-1;j>=1;j-) if(boxij=0) draw_cicle(step_x,step_y,LIGHTBLUE); break ; if(j<1)break ; step_y=j ; judgewho(step_x,step_y); break ; case ESC : break ; case SPACE : if(step_x>=1&&step_x<=s&am

16、p;&step_y>=1&&step_y<=s) if(boxstep_xstep_y=0) boxstep_xstep_y=flag ; if(judgeresult(step_x,step_y)=1) sound(1000); delay(1000); nosound(); gotoxy(30,4); cleardevice(); if(flag=1) settextstyle(3,0,5); outtextxy(120,120,"The White Win !"); setcolor(14); if(flag=2) settexts

17、tyle(3,0,5); outtextxy(120,120,"The Red Win !"); setcolor(15); settextstyle(3,0,5); getch(); exit(0); change(); break ; else break ; void change() if(flag=1) flag=2 ; else flag=1 ;void judgewho(int x,int y) if(flag=1) draw_cicle(x,y,15); if(flag=2) draw_cicle(x,y,4);int judgeresult(int x,i

18、nt y) int j,k,n; while(1) n=0 ; for(j=x,k=y;j>=1;j-) /*水平向左數(shù)*/ if(boxjk=flag) n+; else break ; for(j=x,k=y;j<=s;j+) /*水平向右數(shù)*/ if(boxjk=flag) n+; else break ; if(n>5) return(1); n=0 ; for(j=x,k=y;k>=1;k-) /*垂直向上數(shù)*/ if(boxjk=flag) n+; else break ; for(j=x,k=y;k<=s;k+) /*垂直向下數(shù)*/ if(boxjk

19、=flag) n+; else break ; if(n>5) return(1); n=0 ; for(j=x,k=y;j>=1,k>=1;j-,k-) /*向左上方數(shù)*/ if(boxjk=flag) n+; else break ; for(j=x,k=y;j<=s,k<=s;j+,k+) /*向右下方數(shù)*/ if(boxjk=flag) n+; else break ; if(n>5) return(1); n=0 ; for(j=x,k=y;j<=s,k>=1;j+,k-) /*向右上方數(shù)*/ if(boxjk=flag) n+; el

20、se break ; for(j=x,k=y;j>=1,k<=s;j-,k+) /*向左下方數(shù)*/ if(boxjk=flag) n+; else break ; if(n>5) return(1); return(0); void main() int gdriver=VGA,gmode=VGAHI; clrscr(); attentoin(); initgraph(&gdriver,&gmode,"c:tc"); draw_box(); do step_x=0,step_y=0 ; judgewho(step_x-1,step_y-1)

21、; do while(bioskey(1)=0); key=bioskey(0); judgekey(); while(key!=SPACE&&key!=ESC); while(key!=ESC); closegraph();_3程序的說明文件 本程序中包含一個主函數(shù)和七個子函數(shù),它們的函數(shù)名及功能分別如下:void draw_box();畫棋盤void draw_cicle(int x,int y,int color);畫棋子并確定其顏色void change();改變玩家void judgewho(int x,int y);判斷誰落棋void judgekey();判斷鍵盤

22、輸入哪個鍵按規(guī)則執(zhí)行操作int judgeresult(int x,int y);判斷贏家void attentoin();顯示游戲規(guī)則4課設(shè)總結(jié) 從1月14日開始,我們進行了為期一周的算法課程設(shè)計。通過這次課程設(shè)計,我們拓寬了知識面,鍛煉了能力,綜合素質(zhì)得到較大提高。 本次課程設(shè)計,使我們對從五子棋設(shè)計方案到設(shè)計的基本過程的設(shè)計方法、步驟、思路、有一定的了解與認識。在課程設(shè)計過程中,我們基本能按照規(guī)定的程序進行,先針對五子棋的設(shè)計收集、調(diào)查有關(guān)資料,其間,同組成員之間進行幾次方案的討論、修改,再討論、再修改,最后定案。設(shè)計方案確定后,又在老師指導下進行擴充詳細設(shè)計,最終用c語言實現(xiàn)了可視化的

23、五子棋算法。整個過程周密有序,對我們按時高質(zhì)完成課程設(shè)計非常有利! 對我們計算機專業(yè)的本科生來說,實際能力的培養(yǎng)至關(guān)重要,而這種實際能力的培養(yǎng)單靠課堂教學是遠遠不夠的,必須從課堂走向?qū)嵺`。通過課程設(shè)計,讓我們找出自身狀況與實際需要的差距,并在以后的學習期間及時補充相關(guān)知識,為求職與正式工作做好充分的知識、能力準備,從而縮短從校園走向社會的心理轉(zhuǎn)型期。 課程設(shè)計達到了專業(yè)學習的預期目的。課程設(shè)計之后,我們普遍感到不僅實際動手能力有所提高,更重要的是進一步激發(fā)了我們對專業(yè)知識的興趣,并能夠結(jié)合實際存在的問題在專業(yè)領(lǐng)域內(nèi)進行更深入的學習。 1.3概要設(shè)計 流程圖:輸出游戲規(guī)則 Error!玩家遵守?

24、Y誰先下棋,輸入棋盤大小s Y畫出s*s大小的棋盤用戶決定誰先走白棋先走? N畫紅棋 畫白棋 Y 下棋 改變玩家 下棋 N橫豎斜有五個相同顏色的棋子相連? 白棋? Y N輸出:The red win!輸出:The white win! Y1.4詳細設(shè)計 本程序中包含一個主函數(shù)和七個子函數(shù),它們的函數(shù)名及功 能分別如下:void draw_box();畫棋盤,確定背景色和棋盤色按用戶輸入大小畫 出棋盤void draw_cicle(int x,int y,int color);畫棋子,確定棋子大小及顏色畫出棋子。void change();改變玩家,作戰(zhàn)雙方輪流下棋。void judgewho(

25、int x,int y);判斷誰落棋,是1則畫出白棋,是2則畫出紅棋。void judgekey();判斷鍵盤輸入哪個鍵按規(guī)則執(zhí)行操作,UP 鍵上移,DOWN鍵下移,LEFT鍵左移,RIGHT鍵右移,ESC鍵退出,SPACE鍵確定棋子落點。int judgeresult(int x,int y);判斷贏家,橫向豎向斜向夠5個相同顏色的棋子則為贏家。void attentoin();顯示游戲規(guī)則,按上下左右鍵移動棋子,按空格鍵確定棋子落點,不能在棋盤外按空格鍵。1.5調(diào)試分析 運行結(jié)果:屏幕顯示:Please input who is first:1 or 2 當輸入1時,白棋先走;當輸入2時,

26、紅棋先走。屏幕顯示:Please input the size of chessbox:從鍵盤輸入t值,則棋盤大小為t*t型。屏幕顯示:Left, Right, Up, Down KEY to move, Space to put, ESC-quit 及棋盤,棋子,用上下左右鍵控制棋子向,用空格鍵確定棋子的落點 。當白棋贏時,顯示The White Win ! 當紅棋贏時,顯示The Red Win !算法改進思想:將棋盤由原先的固定大小改進為可動態(tài)變化,由原來固定的白棋先走改進為讓用戶可以選擇哪方先落子。2源程序#include<stdio.h>#include<stdli

27、b.h>#include<graphics.h>#include<bios.h>#include<conio.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b#define SPACE 0x3920#define BILI 20#define JZ 4#define JS 3#define N 19int boxNN,s; /*落子點*/int step_x,step_y ;int key ;int flag,i

28、,j ;void draw_box();void draw_cicle(int x,int y,int color);void change();void judgewho(int x,int y);void judgekey();int judgeresult(int x,int y);void attentoin();void attentoin() /*游戲規(guī)則*/ char ch ; printf("Play attentoins:nn"); printf("1. Press Left,Right,Up,Down Key to move Piecenn&q

29、uot;);/*方向鍵移動棋子*/ printf("2. Press Space to place the Piecenn");/*空格鍵確定棋子落點*/ printf("3. DO NOT press Space outside of the draw_boxnn");/*棋盤外不能落棋*/ printf("Do you accept the above Playing attentoins? Y/Other:");/*是否遵守*/ while(1) ch=getche(); if(ch='Y'|ch='y&

30、#39;) break ; else exit(0); printf("nnwhat size of the draw_box:"); scanf("%d",&s); /*輸出棋盤大小*/ printf("nnwho is the frist:1 or 2? "); /*誰先落子*/ while(1) scanf("%d",&flag); if(flag!=1&&flag!=2) printf("Error!n"); else break; void draw_b

31、ox() /*畫出棋盤*/ int x1,x2,y1,y2 ; setbkcolor(LIGHTBLUE); /*背景色*/ setcolor(YELLOW); /*文本色*/ gotoxy(7,2); printf("Left, Right, Up, Down KEY to move, Space to put, ESC-quit."); for(x1=1,y1=1,y2=s;x1<=s;x1+) line(x1+JZ)*BILI,(y1+JS)*BILI,(x1+JZ)*BILI,(y2+JS)*BILI);/*畫豎線*/ for(x1=1,y1=1,x2=s;y

32、1<=s;y1+) line(x1+JZ)*BILI,(y1+JS)*BILI,(x2+JZ)*BILI,(y1+JS)*BILI); /*畫橫線*/ for(x1=1;x1<=s;x1+) for(y1=1;y1<=s;y1+) boxx1y1=0 ; /*棋盤初始化*/void draw_cicle(int x,int y,int color) /*棋子*/ setcolor(color); /*棋子顏色*/ setlinestyle(SOLID_LINE,0,1); /*線條類型*/ x=(x+JZ)*BILI ; y=(y+JS)*BILI ; circle(x,y,

33、8); /*畫半徑為8的棋子*/void judgekey() switch(key) case LEFT : /*左鍵控制棋子左移*/ if(step_x-1<0) break ; else for(i=step_x-1,j=step_y;i>=1;i-) if(boxij=0) draw_cicle(step_x,step_y,LIGHTBLUE); break ; if(i<1)break ; step_x=i ; judgewho(step_x,step_y); break ; case RIGHT : /*右鍵控制棋子右移*/ if(step_x+1>s) b

34、reak ; else for(i=step_x+1,j=step_y;i<=s;i+) if(boxij=0) draw_cicle(step_x,step_y,LIGHTBLUE); break ; if(i>s)break ; step_x=i ; judgewho(step_x,step_y); break ; case DOWN : /*下鍵控制棋子下移*/ if(step_y+1>s) break ; else for(i=step_x,j=step_y+1;j<=s;j+) if(boxij=0) draw_cicle(step_x,step_y,LIGH

35、TBLUE);break ; if(j>s)break ; step_y=j ; judgewho(step_x,step_y); break ; case UP : /*上鍵控制棋子上移*/ if(step_y-1<0) break ; else for(i=step_x,j=step_y-1;j>=1;j-) if(boxij=0) draw_cicle(step_x,step_y,LIGHTBLUE); break ; if(j<1)break ; step_y=j ; judgewho(step_x,step_y); break ; case ESC : break ; /*ESC鍵退出游戲*/ case SPACE : /*空格鍵控制落子*/ if(step_x>=1&&step_x<=s&&step_y>=1&&step_y<=s) if(boxstep_xstep_y=0) boxstep_xstep_y=flag ; if(judgeresult(step_x,step_y)=1) sound(1000); delay(1000); nosound(); gotoxy(30,4);

溫馨提示

  • 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

提交評論