c語(yǔ)言課程設(shè)計(jì)-中國(guó)象棋 (2)_第1頁(yè)
已閱讀1頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  課程設(shè)計(jì)說(shuō)明書(shū)</b></p><p>  課程名稱: C語(yǔ)言課程設(shè)計(jì)</p><p>  設(shè)計(jì)題目: 中國(guó)象棋</p><p>  專(zhuān)業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 班級(jí):______</p><p>  姓名: 學(xué)號(hào):___ </p><p> 

2、 評(píng)分: 指導(dǎo)教師: </p><p>  2012 年 6月26日</p><p><b>  目 錄</b></p><p><b> ?、?摘要</b></p><p><b> ?、?前言</b></p><p&

3、gt;<b> ?、?功能描述</b></p><p><b> ?、?配置要求</b></p><p>  Ⅴ 總體設(shè)計(jì)(個(gè)人負(fù)責(zé)模塊)</p><p><b>  一、功能模塊設(shè)計(jì)</b></p><p><b>  二、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)</b></

4、p><p><b>  三、函數(shù)功能描述</b></p><p><b>  四、代碼實(shí)現(xiàn)</b></p><p><b>  五、運(yùn)行結(jié)果</b></p><p><b> ?、?小結(jié)</b></p><p><b> ?、?/p>

5、 摘 要</b></p><p>  中國(guó)象棋是一款很古老、很受歡迎的游戲,其開(kāi)發(fā)過(guò)程有一定的技巧和方法,其中</p><p>  涉及到函數(shù)調(diào)用、二維數(shù)組、鍵盤(pán)操作等方面的知識(shí)。本游戲的開(kāi)發(fā)者需要基本掌握復(fù)</p><p>  雜情況下函數(shù)的編寫(xiě)以及調(diào)用能力、二維數(shù)組的運(yùn)用能力、復(fù)雜算法的設(shè)計(jì)能力等。</p><p><b

6、> ?、?前 言</b></p><p>  中國(guó)象棋是一款經(jīng)典的智力游戲,具有悠久的歷史,早在戰(zhàn)國(guó)時(shí)期就有了關(guān)于中國(guó)象棋的記載,經(jīng)過(guò)幾千年的流傳,目前仍然是中國(guó)家喻戶曉的棋類(lèi)游戲,頗受歡迎。因此,我們決定借這次機(jī)會(huì)通過(guò)用C語(yǔ)言將中國(guó)象棋實(shí)現(xiàn)出來(lái),當(dāng)然,我們也借鑒了前人的一些技巧經(jīng)驗(yàn)。有不足之處,希望老師能夠諒解,我們以后將會(huì)再接再厲。</p><p><b>

7、 ?、?功能描述</b></p><p>  本人負(fù)責(zé)棋子帥(將)、象(相)、士(仕)、卒(兵)子函數(shù)的編寫(xiě),它們的所能實(shí)現(xiàn)的功能分別是:</p><p> ?。?)帥(將):控制棋子帥(將)能符合現(xiàn)實(shí)情況下的游戲規(guī)則而行走,例如帥(將)只能在規(guī)定范圍內(nèi)向上或向左、右、下行走一格,最后返回一個(gè)行走正確或行走錯(cuò)誤的數(shù)據(jù)。</p><p>  (2)象(相)

8、:控制棋子象(相)能符合現(xiàn)實(shí)情況下的游戲規(guī)則而行走,例如象(相)只能在自己領(lǐng)域內(nèi)走“田”字格,且中間不能有其他棋子阻擋,最后返回一個(gè)行走正確或行走錯(cuò)誤的數(shù)據(jù)。</p><p> ?。?)士(仕):控制棋子士(仕)能符合現(xiàn)實(shí)情況下的游戲規(guī)則而行走,例如士(仕)只能在規(guī)定范圍內(nèi)斜著跨一格,然后返回一個(gè)行走正確或行走錯(cuò)誤的數(shù)據(jù)。</p><p>  (4)卒(兵):控制棋子卒(兵)能符合現(xiàn)實(shí)情況

9、下的游戲規(guī)則而行走,例如卒(兵)只能一次走一格,同時(shí)在自己領(lǐng)域內(nèi)只能向前走,而在對(duì)方領(lǐng)域內(nèi)可向前、左、右方向走一格,最后返回一個(gè)行走正確或行走錯(cuò)誤的數(shù)據(jù)。</p><p><b> ?、?配置要求</b></p><p><b>  (1) 硬件配置</b></p><p>  CPU:≥Pentium III 600&l

10、t;/p><p><b>  內(nèi)存:≥64MB</b></p><p>  硬盤(pán)剩余空間:≥128MB</p><p><b>  (2) 軟件環(huán)境</b></p><p>  Visual C++6.0及其以上版本</p><p> ?、?總體設(shè)計(jì)(個(gè)人負(fù)責(zé)模塊)</p&

11、gt;<p>  本人為小組成員,負(fù)責(zé)的模塊是:棋子帥(將)、象(相)、士(仕)、卒(兵)子函數(shù)的設(shè)計(jì)與編寫(xiě)。</p><p><b>  一、系統(tǒng)模塊設(shè)計(jì)</b></p><p><b>  1、系統(tǒng)模塊圖</b></p><p>  本人所負(fù)責(zé)的模塊共有四個(gè)小項(xiàng)目組成,分別是控制棋子正確行走的帥(將)、象

12、(相)、士(仕)、卒(兵)子函數(shù)。</p><p><b> ?。?)帥(將)</b></p><p>  該子函數(shù)主要負(fù)責(zé)控制維持棋子帥(將)的正確行走,返回正確或錯(cuò)誤的數(shù)據(jù)信息。</p><p><b> ?。?)象(相)</b></p><p>  該子函數(shù)主要負(fù)責(zé)控制維持棋子象(相)的正確行

13、走,返回正確或錯(cuò)誤的數(shù)據(jù)信息。</p><p><b> ?。?)士(仕)</b></p><p>  該子函數(shù)主要負(fù)責(zé)控制維持棋子士(仕)的正確行走,返回正確或錯(cuò)誤的數(shù)據(jù)信息。</p><p><b> ?。?)卒(兵)</b></p><p>  該子函數(shù)主要負(fù)責(zé)控制維持棋子卒(兵)的正確行走,

14、返回正確或錯(cuò)誤的數(shù)據(jù)信息。</p><p><b>  調(diào)調(diào)</b></p><p><b>  用調(diào)調(diào)調(diào)用</b></p><p><b>  用用用</b></p><p><b>  圖1. 系統(tǒng)模塊圖</b></p>&

15、lt;p><b>  2、任務(wù)執(zhí)行流程圖</b></p><p>  在玩家進(jìn)行游戲移動(dòng)棋子帥(將)、象(相)、士(仕)、卒(兵)的時(shí)候,主函數(shù)調(diào)用這幾個(gè)子函數(shù)的執(zhí)行流程圖均為:</p><p>  圖2. 任務(wù)執(zhí)行流程圖</p><p><b>  二、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)</b></p><p>

16、  四個(gè)子函數(shù)均定義了局部變量x1,x2,y1,y2,table[][10],通過(guò)主函數(shù)調(diào)用將玩家從鍵盤(pán)輸入的值傳遞給x1,x2,y1,y2. table[][10]是在主函數(shù)中定義的一個(gè)二維數(shù)組,在子函數(shù)中同樣控制棋盤(pán)的輸出。</p><p><b>  三、函數(shù)功能描述</b></p><p>  1.chekshuai ( )</p><p&

17、gt;  函數(shù)原型:int checkshuai(int x1,int y1,int x2,int y2,int table[][10])</p><p>  checkshuai( )函數(shù)控制棋子帥(將)的正確行走,通過(guò)主函數(shù)將初始位置的坐標(biāo)x1,y1與目標(biāo)位置的坐標(biāo)x2,y2傳遞給該子函數(shù),從而判別帥(將)的行走是否符合規(guī)則。</p><p>  2.checkxiang ( )<

18、;/p><p>  函數(shù)原型:int checkxiang(int x1,int y1,int x2,int y2,int table[][10])</p><p>  checkxiang( )函數(shù)控制棋子象(相)的正確行走,通過(guò)主函數(shù)將初始位置的坐標(biāo)x1,y1與目標(biāo)位置的坐標(biāo)x2,y2傳遞給該子函數(shù),從而判別象(相)的行走是否符合規(guī)則。</p><p>  3.ch

19、eckshi ( )</p><p>  函數(shù)原型:int checkshi(int x1,int y1,int x2,int y2,int table[][10])</p><p>  checkshi( )函數(shù)控制棋子士(仕)的正確行走,通過(guò)主函數(shù)將初始位置的坐標(biāo)x1,y1與目標(biāo)位置的坐標(biāo)x2,y2傳遞給該子函數(shù),從而判別士(仕)的行走是否符合規(guī)則。</p><p&

20、gt;  4.checkbing ( )</p><p>  函數(shù)原型:int checkbing(int x1,int y1,int x2,int y2,int table[][10])</p><p>  checkbing( )函數(shù)控制棋子士(仕)的正確行走,通過(guò)主函數(shù)將初始位置的坐標(biāo)x1,y1與目標(biāo)位置的坐標(biāo)x2,y2傳遞給該子函數(shù),從而判別士(仕)的行走是否符合規(guī)則。</p

21、><p><b>  四、代碼實(shí)現(xiàn)</b></p><p><b>  1. 帥(將)</b></p><p>  int checkshuai(int x1,int y1,int x2,int y2,int table[][10])</p><p><b>  {</b><

22、/p><p>  if ((x2<8 || x2>10 || y2<4 ||y2>6)&&(x2<1 || x2>3 || y2<4|| y2>6)) </p><p>  // 控制棋子的行走范圍是在自己領(lǐng)域的九宮格內(nèi)</p><p><b>  {</b></p>&

23、lt;p>  printf("\n將或者帥是不能移出九宮區(qū)域的,重新輸入吧!\n");</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }</b></p><p>  else if ((abs(x2-x1)==1)&&(a

24、bs(y2-y1)==1))</p><p>  // 控制棋子的行走只能是直線</p><p><b>  {</b></p><p>  printf("\n將或者帥是不能走斜線的哦,重新輸入吧!\n");</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0

25、進(jìn)行重新輸入</p><p><b>  }</b></p><p>  else if (table[x2][y2]*table[x1][y1]>0)</p><p>  // 控制棋子只能覆蓋對(duì)方棋子以分清敵我</p><p><b>  {</b></p><p>

26、;  printf("\n自己不能吃掉自己呀,重新輸入吧!\n");</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }</b></p><p>  else if ((abs(x2-x1)>=2)||(abs(y2-y1)>=2)

27、)</p><p>  // 控制棋子每次只能跨越一格</p><p><b>  {</b></p><p>  printf("\n將或者帥不能一次走多格呀,重新輸入吧!\n");</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p>

28、;<p><b>  }</b></p><p>  else return 1; // 若未遇到錯(cuò)誤則返回1繼續(xù)進(jìn)行游戲</p><p><b>  }</b></p><p><b>  2. 象(相)</b></p><p>  int checkxia

29、ng(int x1,int y1,int x2,int y2,int table[][10])</p><p><b>  {</b></p><p>  if ((abs(x2-x1))!=2 || (abs(y2-y1))!=2)</p><p>  // 控制棋子的行走路線為田字格對(duì)角線</p><p><b

30、>  {</b></p><p>  printf("\n相(象)只能走田字呀,重新輸入吧!\n");</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }</b></p><p>  else if ((

31、table[x1][y1]>0 &&x2>5)||(table[x1][y1]<0 &&x2<5))</p><p>  // 控制棋子只能在自己領(lǐng)域內(nèi)移動(dòng)</p><p><b>  {</b></p><p>  printf("\n相(象)不能渡過(guò)楚河漢界呀,重新輸入吧!\

32、n");</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }</b></p><p>  else if (table[(x1+x2)/2][(y1+y2)/2]!=0)</p><p>  // 當(dāng)棋子移動(dòng)路徑上有其他棋子阻擋時(shí)棋

33、子不能移動(dòng)</p><p><b>  {</b></p><p>  printf("\n您要移動(dòng)的路徑上有其他棋擋著呢,不能移動(dòng),重新輸入吧!\n");</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }<

34、;/b></p><p>  else if (table[x2][y2]*table[x1][y1]>0)</p><p>  // 控制棋子只能覆蓋對(duì)方棋子以分清敵我</p><p><b>  {</b></p><p>  printf("\n自己不能吃掉自己呀,重新輸入吧!\n"

35、);</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }</b></p><p>  else return 1; // 若未遇到錯(cuò)誤則返回1繼續(xù)進(jìn)行游戲</p><p><b>  }</b></p>

36、<p><b>  3. 士(仕)</b></p><p>  int checkshi(int x1,int y1,int x2,int y2,int table[][10])</p><p><b>  {</b></p><p>  if ((x2<8 || x2>10 || y2<4 |

37、|y2>6)&&(x2<1 || x2>3 || y2<4|| y2>6))</p><p>  // 控制棋子的行走范圍是在自己領(lǐng)域的九宮格內(nèi)</p><p><b>  {</b></p><p>  printf("\n士或者仕是不能移出九宮區(qū)域的,重新輸入吧!\n");&

38、lt;/p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }</b></p><p>  else if (table[x2][y2]*table[x1][y1]>0)</p><p>  // 控制棋子只能覆蓋對(duì)方棋子以分清敵我</p>

39、;<p><b>  {</b></p><p>  printf("\n自己不能吃掉自己呀,重新輸入吧!\n");</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }</b></p><p

40、>  else if ((abs(x2-x1)>=2)||(abs(y2-y1)>=2))</p><p>  // 控制棋子每次只能跨越一格</p><p><b>  {</b></p><p>  printf("\n士或者仕不能一次走多格呀,重新輸入吧!\n");</p><p&

41、gt;  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }</b></p><p>  else if (!((abs(x2-x1)==1)&&(abs(y2-y1)==1)))</p><p>  // 控制棋子行走路徑只能是沿著一格的對(duì)角線</p>

42、<p><b>  {</b></p><p>  printf("\n士或者仕只能斜著走呀,重新輸入吧!\n");</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }</b></p><p&g

43、t;  else return 1; // 若未遇到錯(cuò)誤則返回1繼續(xù)進(jìn)行游戲</p><p><b>  }</b></p><p><b>  4. 卒(兵)</b></p><p>  int checkbing(int x1,int y1,int x2,int y2, int table[][10])</

44、p><p><b>  {</b></p><p>  if(table[x1][y1]>0)</p><p>  // 兵(卒)是否是甲方棋子(在上方)</p><p><b>  {</b></p><p>  if(table[x2][y2]>0)</p&

45、gt;<p>  // 控制棋子只能覆蓋對(duì)方棋子以分清敵我</p><p><b>  {</b></p><p>  printf("\n拜托,不能自己吃自己!!!\n");</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p&

46、gt;<b>  }</b></p><p><b>  if(x1<6)</b></p><p>  // 此時(shí)兵(卒)沒(méi)過(guò)河</p><p><b>  {</b></p><p>  if((y1==y2)&&(x2-x1==1))</p>

47、;<p>  // 控制棋子只能向前走</p><p><b>  {</b></p><p>  return 1; // 若符合規(guī)則則繼續(xù)游戲</p><p><b>  }</b></p><p><b>  else</b></p>

48、<p><b>  {</b></p><p>  printf("\n兵(卒)過(guò)河前只能向前走,重新輸入吧!\n");</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }</b></p><p

49、><b>  }</b></p><p><b>  else</b></p><p>  // 若此時(shí)兵(卒)已過(guò)河</p><p><b>  {</b></p><p>  if(((y1==y2)&&(x2-x1==1))||((y1-y2==1)

50、&&(x2==x1))||((y2-y1==1)&&(x2==x1)))</p><p>  // 控制棋子過(guò)河后只能向前或者向左、右移動(dòng)</p><p><b>  {</b></p><p>  return 1; // 若符合規(guī)則則繼續(xù)游戲</p><p><b>

51、  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  printf("\n兵(卒)過(guò)河后只能向前走或者平移,不能后退,重新輸入吧!\n");</p><p>  return 0; // 規(guī)則

52、錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p>  //

53、 判斷兵是否在乙方(在下方)</p><p><b>  {</b></p><p>  if(table[x2][y2]<0)</p><p>  // 控制棋子只能覆蓋對(duì)方棋子以分清敵我</p><p><b>  {</b></p><p>  printf(&q

54、uot;\n拜托,自己不能吃自己!!!\n");</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }</b></p><p><b>  if(x1>5)</b></p><p>  // 如果兵(卒)沒(méi)

55、過(guò)河</p><p><b>  {</b></p><p>  if((y1==y2)&&(x1-x2==1))</p><p>  // 控制棋子只能向前走</p><p>  return 1; // 若符合規(guī)則則繼續(xù)游戲</p><p><b>  els

56、e</b></p><p><b>  {</b></p><p>  printf("\n兵(卒)過(guò)河前只能向前走,重新輸入吧!\n");</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }<

57、/b></p><p><b>  }</b></p><p><b>  else</b></p><p>  // 如果兵(卒)已過(guò)河</p><p><b>  {</b></p><p>  if(((y1==y2)&&(x

58、1-x2==1))||((y1-y2==1)&&(x2==x1))||((y2-y1==1)&&(x2==x1))) </p><p>  // 控制棋子過(guò)河后只能向前或者向左、右移動(dòng)</p><p>  return 1; // 若符合規(guī)則則繼續(xù)游戲</p><p><b>  else</b><

59、;/p><p><b>  {</b></p><p>  printf("\n兵(卒)過(guò)河后只能向前走或者平移,不能后退,重新輸入吧!\n");</p><p>  return 0; // 規(guī)則錯(cuò)誤后出現(xiàn)提示信息并且返回0進(jìn)行重新輸入</p><p><b>  }</b&

60、gt;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  五、運(yùn)行結(jié)果</b></p><p>  1、游戲進(jìn)入初始界面</p&

61、gt;<p>  進(jìn)入游戲后顯示的初始界面截圖如下圖:</p><p>  圖3. 游戲初始界面</p><p>  2、游戲進(jìn)行中的界面</p><p>  如下顯示了游戲進(jìn)行中的界面截圖:</p><p>  圖4. 游戲進(jìn)行過(guò)程中界面</p><p><b>  3、游戲結(jié)束</b&

62、gt;</p><p>  完成游戲后結(jié)束的界面截圖:</p><p><b>  圖5.游戲結(jié)束界面</b></p><p><b>  Ⅵ 小結(jié)</b></p><p>  兩周的課程設(shè)計(jì)結(jié)束了,這次的課程設(shè)計(jì)不僅檢驗(yàn)了我們所學(xué)的知識(shí),同時(shí)也培養(yǎng)了大家如何去把一件事情認(rèn)認(rèn)真真的做好。在整個(gè)設(shè)計(jì)過(guò)

63、程中,我們互相討論、互相學(xué)習(xí)、互相監(jiān)督。</p><p>  C語(yǔ)言程序設(shè)計(jì)是一門(mén)基礎(chǔ)性極強(qiáng)的計(jì)算機(jī)語(yǔ)言,它具有功能豐富、表達(dá)能力強(qiáng)、使用靈活方便、應(yīng)用面廣、目標(biāo)程序效率高、可移植性好,既具有高級(jí)語(yǔ)言的優(yōu)點(diǎn),又具有低級(jí)語(yǔ)言的許多特點(diǎn),既適于編寫(xiě)系統(tǒng)軟件,又能方便的用來(lái)編寫(xiě)應(yīng)用軟件。因此作為理工科院校的大學(xué)生,學(xué)好、用好C語(yǔ)言這個(gè)工具是一項(xiàng)最基本的要求,也是為日后的工作打下良好的基礎(chǔ)。</p><

溫馨提示

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

評(píng)論

0/150

提交評(píng)論