c語言報告五子棋_第1頁
c語言報告五子棋_第2頁
c語言報告五子棋_第3頁
c語言報告五子棋_第4頁
c語言報告五子棋_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、C語言課程設(shè)計報告題目: 簡單的c五子棋 設(shè)計者: 方陽 專業(yè)班級: 軟件工程1303班 學(xué)號: 311309060324 指導(dǎo)老師: 劉潔 所屬系部: 計算機(jī)學(xué)院 2014年6月25日河南理工大學(xué)1、設(shè)計任務(wù)書1.1、 題目與要求:本人計劃編寫一個簡單的c五子棋,應(yīng)用C語言編寫程序可以在計算機(jī)上實現(xiàn)二人對弈五子棋功能。二人對弈五子棋程序由圖像生成、光標(biāo)移動與落子、判斷勝負(fù)和系統(tǒng)幫助等子程序構(gòu)成;程序中應(yīng)用了結(jié)構(gòu)體、數(shù)組、全局變量、按鍵處理和圖形編程等元素和語句。程序通過棋盤和棋子圖像生成、二人移子與落子和判斷勝負(fù)等功能的實現(xiàn),在計算機(jī)上實現(xiàn)了二人五子棋對弈。1.2、 本系統(tǒng)涉及的知識點:結(jié)構(gòu)

2、、數(shù)組、循環(huán)、函數(shù)、分支、2、功能設(shè)計根據(jù)功能需求,將程序分為圖形顯示、玩家控制、勝負(fù)判斷和玩家計分四個模塊,以下分析各模塊的需求。圖形顯示模塊:程序開始運(yùn)行時,給出歡迎及幫助界面;游戲開始后要求生成19×19的棋盤圖像,并在棋盤上方提示當(dāng)前落子方棋子顏色,游戲進(jìn)行過程中,要求實時顯示棋盤上已落下的棋子;分出勝負(fù)后,要求給出游戲結(jié)束畫面。玩家控制模塊:程序開始時,需玩家確定而后開始游戲;游戲過程中,兩個玩家通過不同的按鍵移動光標(biāo),選擇落子;游戲結(jié)束時,有玩家選擇是否開始新棋局。勝負(fù)判斷模塊:實時監(jiān)測棋盤上棋子,一旦某一色棋子出現(xiàn)五子連線,終止游戲程序,并著色連成一線的五子,彈出該色玩

3、家勝出界面。玩家計分模塊:一方玩家再勝利后通過對文件的操作進(jìn)行計分,并輸出于計分板上。2.1、算法設(shè)計根據(jù)程序需求分析結(jié)果,可以得出程序的總體結(jié)構(gòu)圖如圖。2.2部分模塊流程圖程序流程圖3、程序代碼設(shè)計3.1 圖形模塊initgr() /* BGI初始化 */ int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同樣效果 */ registerbgidriver(EGAVGA_driver);/* 注冊BGI驅(qū)動后可以不需要.BGI文件的支持運(yùn)行 */ initgraph(&gd, &gm, ""); welcom

4、e() /*歡迎界面*/ initgr() ;/*初始化*/clearviewport();/*清屏*/ setcolor(2); /*設(shè)置顏色*/ settextstyle(0,0,6); /*樣式*/ outtextxy(180,180,"Welcome");/*位置以及內(nèi)容*/ settextstyle(0,0,2); /*文本樣式*/ outtextxy(240,420,"press any key to continue");/*位置以及內(nèi)容*/ getch();/*press any key to continue*/ help() /*幫助

5、界面,基本操作同welcome();函數(shù)*/ initgr(); clearviewport(); setcolor(2); settextstyle(0,0,2); outtextxy(60,100,"P1 move; W S A D "); outtextxy(60,120," set : space "); outtextxy(60,180,"P2 move: up down left right "); outtextxy(60,200," set: Enter"); outtextxy(60,240,&q

6、uot;You can press Backspace to pull back!") ; outtextxy(60,280,"When you want to quit the game,"); outtextxy(60,300,"press Esc."); outtextxy(220,440,"press any key to continue"); getch(); bye() /*say bye!,實現(xiàn)功能同上*/ initgr(); clearviewport(); setcolor(4) ; settextsty

7、le(0,0,6); outtextxy(130,180,"Thank you!"); settextstyle(0,0,2); outtextxy(240,420,"press any key to quit"); getch(); board()/*畫棋盤*/ setcolor(14); /*線色*/ setfillstyle(1,6); /*樣式*/ bar(120,50,520,450); /*棋盤底*/ for(k=0;k<21 ;k+) line(120+20*k,50,120+20*k,450) ; /*豎線*/ line(120,5

8、0+20*k,520,50+20*k) ; /*橫線*/ setfillstyle(1,9) ; bar(540,200,620,300); /*1p2p兩邊框*/ bar(20,200,100,300); setcolor(2); settextstyle(3,0,4); outtextxy(50,210,"1p"); outtextxy(570,210,"2p"); delay(50000); show(); /*顯示動態(tài)變色效果的標(biāo)題*/ moveto(320,250); /*初始化中心位置*/ border();/*畫定位框*/ p1turn()

9、;/*p1開始落子,游戲開始*/ white() /*畫白棋*/setcolor(15);setfillstyle(1,15);circle(getx(),gety(),9);floodfill(getx(),gety(),15);black() /*畫黑棋*/setcolor(0);setfillstyle(1,0);circle(getx(),gety(),9);floodfill(getx(),gety(),0);green() /*用粉色著色連珠時的棋子*/setcolor(13);setfillstyle(1,13);circle(getx(),gety(),9);floodfill

10、(getx(),gety(),13);p1turn()/*畫左邊邊框內(nèi)白棋子*/setcolor(15);setfillstyle(1,15);circle(60,250,9);floodfill(60,250,15); settextstyle(3,0,4);outtextxy(20,280,"white turn"); p2turn() /*右邊邊框內(nèi)黑色棋子*/setcolor(0);setfillstyle(1,0);circle(580,250,9);floodfill(580,250,0);settextstyle(3,0,4);outtextxy(540,28

11、0,"black turn"); p1del()/*不是1turn時候抹去左邊邊框內(nèi)棋子*/ setfillstyle(1,9) ;floodfill(60,250,9);setcolor(9);settextstyle(3,0,4);outtextxy(20,280,"white turn");p2del()/*不是2turn時候抹去右邊邊框內(nèi)棋子*/setfillstyle(1,9);floodfill(580,250,9) ;setcolor(9);settextstyle(3,0,4);outtextxy(540,280,"black

12、turn");border() /*畫定位框*/ setcolor(14); line(getx()-8,gety()-9,getx()-3,gety()-9); /*通過畫線函數(shù)畫出定位框*/ line(getx()+8,gety()-9,getx()+3,gety()-9); line(getx()-8,gety()-9,getx()-8,gety()-4); line(getx()+8,gety()-9,getx()+8,gety()-4); line(getx()-8,gety()+9,getx()-3,gety()+9); line(getx()+8,gety()+9,ge

13、tx()+3,gety()+9); line(getx()-8,gety()+9,getx()-8,gety()+4); line(getx()+8,gety()+9,getx()+8,gety()+4);delborder() /*除去定位框*/ setcolor(6); /*本質(zhì)在于顏色覆蓋*/ line(getx()-8,gety()-9,getx()-3,gety()-9); line(getx()+8,gety()-9,getx()+3,gety()-9); line(getx()-8,gety()-9,getx()-8,gety()-4); line(getx()+8,gety()

14、-9,getx()+8,gety()-4); line(getx()-8,gety()+9,getx()-3,gety()+9); line(getx()+8,gety()+9,getx()+3,gety()+9); line(getx()-8,gety()+9,getx()-8,gety()+4); line(getx()+8,gety()+9,getx()+8,gety()+4);drawmat(char *mat,int matsize,int x,int y,int color)/*點陣圖所用標(biāo)準(zhǔn)輸出方式*/ int i,j,k,m; m=(matsize-1)/8+1; for(j=

15、0;j<matsize;j+) for(i=0;i<m;i+) for(k=0;k<8;k+) if(matj*m+i&(0x80>>k) putpixel(x+i*8+k,y+j,color);show() /*動態(tài)點陣圖中文閃爍效果*/ for(n=0;n<3;n+) delay(10000); drawmat(wu32K,32,240,0,3);/*輸出點陣圖的“五”字*/ delay(10000); drawmat(zi32K,32,290,0,3); delay(10000); drawmat(qi32K,32,340,0,3); dela

16、y(10000); drawmat(wu32K,32,240,0,2); delay(10000); drawmat(zi32K,32,290,0,2); delay(10000); drawmat(qi32K,32,340,0,2); 3.2 玩家操作模塊p1move() /*玩家1操作*/switch(bioskey(0) /*bioskey函數(shù)對鍵盤操作*/ case W: /*上移*/所有if語句作用在于如果落子即將溢出邊框,讓其改變位置到另一端,例如移動棋盤最上端,若繼續(xù)向上移動,則移動至棋盤最下端對應(yīng)位置 if(gety()<90) delborder();moveto(ge

17、tx(),430); delborder();moverel(0,-20);border();p1move(); case A: /*左移*/ if(getx()<160) delborder();moveto(500,gety(); delborder();moverel(-20,0);border();p1move(); case S: /*下移*/ if(gety()>410) delborder();moveto(getx(),70); delborder();moverel(0,20);border();p1move(); case D: /*右移*/ if(getx()

18、>480) delborder();moveto(140,gety(); delborder();moverel(20,0);border();p1move(); case SP: /*落子*/ if(agetx()gety()!=6)/*判定如果棋盤此處無子才能下,否則重新調(diào)用p1move函數(shù)*/ p1move();delborder(); /*去除定位框*/white();/*畫棋子*/agetx()gety()=1;/*將所在位置對應(yīng)的數(shù)組點賦值為1*/win(); /*判斷勝負(fù)*/border(); /*在新的位置畫出定位框*/對左右兩邊提示框操作,提示輪到2p進(jìn)行操作,并調(diào)用p

19、2move()函數(shù)p1del();p2turn();p2move(); case ESC: / *結(jié)束游戲*/ bye();closegraph(); exit(0); case BACK : /*悔棋操作*/ back();p1del();p2turn();p2move(); default: p1move(); p2move() /*玩家2操作*/P2move(); 函數(shù)與p1move();函數(shù)基本作用相同switch(bioskey(0) case UP: if(gety()<90) delborder();moveto(getx(),430); delborder();mover

20、el(0,-20);border();p2move(); case LEFT: if(getx()<160) delborder();moveto(500,gety();delborder();moverel(-20,0);border();p2move(); case DOWN: if(gety()>410) delborder();moveto(getx(),70);delborder();moverel(0,20);border();p2move(); case RIGHT: if(getx()>480) delborder();moveto(140,gety();de

21、lborder();moverel(20,0);border();p2move(); case ENTER: if(agetx()gety()!=6) p2move();delborder();black();agetx()gety()=0;win();border();p2del();p1turn();p1move(); default: p2move(); case ESC: bye();closegraph(); exit(0); case BACK : back();p2del();p1turn();p1move(); back()/*悔棋功能*/setcolor(6);setfill

22、style(1,6);circle(getx(),gety(),9);floodfill(getx(),gety(),6); /*通過將現(xiàn)有棋子覆蓋與棋盤底色相同的顏色來實現(xiàn)*/setcolor(14) ;line(getx()-9,gety(),getx()+9,gety() ;因為覆蓋棋盤顏色后對應(yīng)的棋譜線條顏色被覆蓋,所以通過畫線函數(shù)補(bǔ)回被覆蓋負(fù)分的線色line(getx(),gety()-9,getx(),gety()+9) ; 3.3勝負(fù)判斷模塊win()/*勝負(fù)判斷主程序*/ for(i=120;i<540;i=i+20) for(j=50;j<470;j=j+20)/

23、*通過循環(huán)掃描整個棋盤判定勝負(fù)*/ if(aij+ai+20j+ai+40j+ai+60j+ai+80j=5)|(aij+aij+20+aij+40+aij+60+aij+80=5)| (aij+ai+20j+20+ai+40j+40+ai+60j+60+ai+80j+80=5)|(aij+80+ai+20j+60+ai+40j+40+ai+60j+20+ai+80j=5)/*如果棋盤上任何位置數(shù)組對應(yīng)的值之和為5,則白方5子連珠*/ if(aij+ai+20j+ai+40j+ai+60j+ai+80j=5) moveto(i,j); green();delay(10000);moveto(i

24、+20,j);green(); delay(10000);moveto(i+40,j);green();delay(10000);moveto(i+60,j);green();delay(10000);moveto(i+80,j);green();delay(10000); else if(aij+aij+20+aij+40+aij+60+aij+80=5) moveto(i,j); green();delay(10000);moveto(i,j+20);green(); delay(10000);moveto(i,j+40);green();delay(10000);moveto(i,j+6

25、0);green();delay(10000);moveto(i,j+80);green();delay(10000); else if(aij+ai+20j+20+ai+40j+40+ai+60j+60+ai+80j+80=5) moveto(i,j); green();delay(10000);moveto(i+20,j+20);green(); delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+60);green();delay(10000);moveto(i+80,j+80);green();delay(

26、10000); else if(aij+80+ai+20j+60+ai+40j+40+ai+60j+20+ai+80j=5) moveto(i,j+80); green();delay(10000);moveto(i+20,j+60);green(); delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+20);green();delay(10000);moveto(i+80,j);green();delay(10000); delscore1();p1_point_input2();p1_point_output

27、() ; p1win(); if(aij+ai+20j+ai+40j+ai+60j+ai+80j=0)|(aij+aij+20+aij+40+aij+60+aij+80=0)| (aij+ai+20j+20+ai+40j+40+ai+60j+60+ai+80j+80=0)|(aij+80+ai+20j+60+ai+40j+40+ai+60j+20+ai+80j=0) if(aij+ai+20j+ai+40j+ai+60j+ai+80j=0) moveto(i,j); green();delay(10000);moveto(i+20,j);green(); delay(10000);moveto

28、(i+40,j);green();delay(10000);moveto(i+60,j);green();delay(10000);moveto(i+80,j);green();delay(10000); else if(aij+aij+20+aij+40+aij+60+aij+80=0) moveto(i,j); green();delay(10000);moveto(i,j+20);green(); delay(10000);moveto(i,j+40);green();delay(10000);moveto(i,j+60);green();delay(10000);moveto(i,j+

29、80);green();delay(10000); else if(aij+ai+20j+20+ai+40j+40+ai+60j+60+ai+80j+80=0) moveto(i,j); green();delay(10000);moveto(i+20,j+20);green(); delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+60);green();delay(10000);moveto(i+80,j+80);green();delay(10000); else if(aij+80+ai+20j+60+ai

30、+40j+40+ai+60j+20+ai+80j=0) moveto(i,j+80); green();delay(10000);moveto(i+20,j+60);green(); delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+20);green();delay(10000);moveto(i+80,j);green();delay(10000); delscore2(); p2_point_input2();p2_point_output() ;p2win(); p1win()setcolor(15) ;

31、settextstyle(0,0,2);此處2個函數(shù)用于1p或2p獲勝后的告知以及詢問是否開始新的一局,調(diào)用restart();函數(shù)以繼續(xù)或退出。outtextxy(10,110,"1p win");outtextxy(240,460,"Restart?(Y/N)");restart();p2win()setcolor(15) ;settextstyle(0,0,2); outtextxy(535,110,"2p win"); outtextxy(240,460,"Restart?(Y/N)"); restart(

32、);restart()通過對鍵盤的操作,提取Y或N以確定是否開始新的一局。switch(bioskey(0)case Y: main();case N: bye();closegraph(); exit(0); default:restart(); initialization() for(i=120;i<540;i+) for(j=50;j<470;j+) /*循環(huán)初始化棋盤對應(yīng)的數(shù)組所在位置值為6*/ aij=6; 3.4 文件操作模塊point() /*用于整合所有計分的函數(shù),方便操作*/之所以做這么多函數(shù)來實現(xiàn)文件操作的計分,是因為我發(fā)現(xiàn)C語言中對文件操作似乎存在bug,如

33、果放在一個函數(shù)中經(jīng)常出現(xiàn)文件無法正常讀取,無法正常寫入等現(xiàn)象,即使拆分成如此多函數(shù),也依舊偶爾會出現(xiàn)以上提到的一些小bug。p1_point_input();p1_point_output() ;p2_point_input();p2_point_output() ;p1_point_input() /*1p計分文件讀取*/首先打開文件,然后取出里面的數(shù)字賦值于ch變量,再用另一個函數(shù)打開文件并對ch進(jìn)行自增操作,最后將ch寫入文件。 FILE *fp; fp=fopen("score1.txt","r"); ch=getw(fp); fclose(fp

34、);p1_point_input2() /*1p計分文件輸入*/ FILE *fp; fp=fopen("score1.txt","r+"); ch=ch+1; putw(ch,fp); fclose(fp); p1_point_output() /*1p計分輸出*/ int i=0; char sh,score10; FILE *fp;通過再次打開文件,循環(huán)掃描,輸出文件中的數(shù)值并設(shè)置其樣式。 fp=fopen("score1.txt", "r"); for(; (sh=fgetc(fp)!=EOF; ) sco

35、rei+=sh; scorei='0' setcolor(12); settextstyle(3,0,4); outtextxy(40,320,"score"); outtextxy(55,340,score); fclose(fp); p2_point_input()玩家2的計分模塊,和玩家1的相同,就不再重復(fù)介紹了。 FILE *fp; fp=fopen("score2.txt","r"); dh=getw(fp); fclose(fp);p2_point_input2() FILE *fp; fp=fopen("score2.txt","r+"); dh=dh+1; putw(

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論