
《C語言程序設計》
題目黑白棋游戲
一、內容
黑白棋
黑白棋是一種兩人對弈的純策略型棋類游戲,黑白棋棋子分為黑白兩色,棋盤為1919,
棋子放置于棋盤線交叉點上或網格中。兩人對局,各執一色,輪流下一子,先將橫、豎或斜
線的5個同色棋子連成不間斷的一排者為勝。
本程序設計為人與人對弈,一方執黑棋,一方執白棋,輪流走棋,每方都試圖在游戲結束前
讓自己的棋子五子相連,首先實現五子相連的一方獲勝。程序執行過程中,要求棋盤、棋子
時時可見,并且人用輸入坐標的操作模式,擺放棋子。
以下簡析本程序流程::如表1所示,表中當前落子點坐標為(X,Y),i=X-4,j=Y-4,
由獲勝條件可以知,通過判斷(X,Y)上、下、左、右、斜上、斜下八個方向上是否有
連續的5個子即可得出是否獲勝結果。在游戲開始時,將棋盤初始化,即將棋盤抽
象為一個19*19的數組,數組中每個元素設為某一指定初始值(如8)。1P落子時,
將數組內相應坐標處元素賦值為0;2P落子時,將數組內相應坐標處元素賦值為1。
當(X,Y)上、下、左、右、斜上、斜下八個方向某5個連續的子所對應雜糅 的數組中元
素之和等于0時,1P獲勝;當(X,Y)上、下、左、右、斜上、斜下八個方向某5個
連續的子所對應的數組中元素之和等于5時,2P獲勝。棋盤上的所有格子都被占滿
時,必有181個1P棋子和180個2P棋子,此時對應數組中所有項之和為180,并
且游戲過程中對應數組中所有項之和只可能在這種狀況下為180,所以可以用這一
條件判斷是否和棋。
i,ji+1,j
i,j+1
X,Y
二、上機環境
操作系統:WindowsXP
開發工具:VC6.0
三、函數調用關系圖
圖1
四、各函數功能說明
1.main()主函數
(intm,intl)判斷輸贏界面
intState()顯示每次落子結果及棋盤設計
4.p1win()玩家1贏的界面
5.p2win()玩家2贏的界面
()和棋界面
lp()幫助界面
artGame()初始化及指令輸入
main
顯示初始界面
選擇
選擇1,調用
void
StartGame()
選擇2,調用
voidhelp()
選擇3
返回原界面
五、流程圖
六、程序運行效果圖
1.運行界面
2.選擇幫助界面
圖4
3.開始游戲界面
圖5
2.獲勝界面
圖6
3.某方認輸界面
圖7
七、總結
通過對各子程序的設計與優化,本程序完成了五子棋軟件的主體的設計與制作,基本
達到了使用五子棋軟件的核心要求。然而程序還有一些不足之處,首先,程序在判斷勝負后
無法顯示第五枚棋子,輸入五子連環的第五個棋子坐標之后直接跳出了重新開始的界面,這
是由程序的顯示原理造成的;其次,程序的界面過于簡陋,而申請說明怎么寫 且坐標輸入操作也不利于玩家
使用。
在調試過程中,發現每當1P在最外圈落子時,系統即可彈出1P獲勝的結果,這是由于
win函數中是通過對落子點及其周圍的若干點求和來判斷是否獲勝的。當1P在最外圈落子
時,棋盤外的點被程序當做0處理,加上落子時被賦值為0的一點,正好滿足1P獲勝的條
件,故而引發錯誤。改進方法:將用于判斷輸贏的數組a由原來的19*19改為21*21,并將
第0、20行及第0、20列中所有元素賦值為6;再將被這四組元素包圍的一個19*19的區間
對應到棋盤上的19*19格,即可解決原有問題。在調試的過程中,還發現原有模塊中的按鍵
操作過于復雜,綜合兼容性考慮,舍棄原有的光標操作模式,改用輸入坐標的操作模式,這
樣做從某種程度上降低了程序的可操作性,但提高了程序的可實現性與兼容性。
這次的《計算機程序設計(C)》是計算機科學與技術、網絡工程、軟件工程專業的重要實踐
性課程。程序實習培養了我分析問題和解決問題的能力,而且提供了一個既動手又動腦,獨
立實踐的機會。使我初步學會了利用C語言編制程序以解決一般實際應用問題,使我分析問
題和解決問題的能力得以提高,從而提高了我對程序設計、程序調試及項目開發的能力。為
后續課程奠定了必要的實踐基礎。
通過這次程序的實習,我在下述方面的能力得到了鍛煉:
1.進一步鞏固、加深了所學《計算機程序設計(C)》的基本理論知識,理論聯系實際,進一
步讓我的綜合分析問題,解決問題的能力得以提高。
2.熟練掌握了C語言的基本語法,基本可以靈活運用各種數據類型。
3.對于給定的設計題目,會進行分析,理清思路,并會給出相應的程序流程圖。
4.掌握了在開發環境下調試程序的方法和修改程序的能力。
八、參考文獻
[1]黑白棋[EB]./view/
[2]湛為芳《C語言程序設計技術》清華大學出版社,2006
九、程序清單
#include
#貼對聯的講究
include
#include
#defineN19
intwin(intm,intl);
voidprintState();
p1win();
p2win();
heqi();
voidhelp();
voidStartGame();
inti,j,k,size=N,isBlack=1,a[N+2][N+2],z;
charstate[N][N],x,y,temp[10],c;
voidStartGame()
/*初始化及指令輸入*/
{intm,n,w;
for(i=0;i
{for(j=0;j
{state[i][j]='_';
a[i][j]=6;
}
}
printState();
while(1)
{
printf("nt請%s方下子:",isBlack?"黑":"白");
scanf("%s",temp);
if(!strcmp(temp,"OUT"))
{
return;
}
if(!strcmp(temp,"BACK"招聘啟事范文 ))
/*悔棋*/
{
i=x-'A';
j=y-'A';
state[i][j]='_';
printState();
isBlack=!isBlack;continue;
}
if(!strcmp(temp,"LOSE"))
/*認輸*/
{printf("nt%s方認輸,%s方勝!nn",isBlack?"
黑":"白",isB客家娘酒的做法 lack?"白":"黑");
return;
}
x=temp[0];
y=temp[1];
if(x<'A'||x>'S'||y<'A'||y>'S')
/*避免下面相減的數組越界。*/
{printf("t輸入有誤,請輸入屬于
口令。n");continue;
}
i=x-'A';
j=y-'A';
if(state[i][j]!='_')
{printf("t提示:該位置已經有子,請重新指定
坐標!");continue;
}
c=isBlack?'#':'*';
z=isBlack?0:1;
state[i][j]=c;
a[i+1][j+1]=z;
m=i+1;
n=j+1;
w=win(m,n);
if(!w)
{printState();
isBlack=!isBlack;
}
el
{return;
}
}
}
Intwin(intm,intl)
/*判斷輸贏*/
{intsum1,sum2,sum3,sum4,sum=1,n,i,j,X,Y,w;
w=0;X=m;Y=l;
for(i=X-4,j=Y-4,n=0;i<=X,j<=Y;i++,j++,n-=2)
{sum1=a[i][Y]+a[i+1][Y]+a[i+2][Y]+a[i+3]
[Y]+a[i+4][Y];
sum2=a[i][j]+a[i+1][j+1]+a[i+2][j+2]+a[i+3][j+3]+a[i
+4][j+4];
sum3=a[X][j]+a[X][j+1]+a[X][j+2]+a[X][j+3]+a[X][j
+4];
sum4=a[i][j+8+n]+a[i+1][j+7+n]+a[i+2][j+6+n]+a[i+
3][j+5+n]+a[i+4][j+4+n];
if(sum1==5||sum2==5||sum3==5||sum崇左旅游景點 4==5)
{p2win();
w=1;
}
if
(sum1==0||sum2==0||sum3==0||sum4==0)
{p1win();
w=1;
}
}
sum1=0;
sum2=0;
sum3=0;
sum4=0;
sum++;
if(sum==177)
{heqi();
w=1;
}
returnw;
}
voidprintState()/*
顯示每次落子結果及棋盤設計*/
{charp='A';
system("cls");
printf("t棋盤如下:nn");
printf("t");
for(i=0;i
{if(i==0)
printf("");
printf("%c",p+i);
}
printf("nt");
for(i=0;i
{printf("%c",p+i);
for(j=0;j
{printf("%c",state[i][j]);
}
printf("%cnt",p+i);
}
printf("");
for(i=0;i
{if(i==0)
printf("");
printf("%c",p+i);
}
printf("n");
}
heqi()
/*和棋界面*/
{printf("和棋");
printf("你們水平一樣喲!!!!!");
return1;
}
p1win()
/*玩家1獲勝界面*/
{printf("玩家1獲勝,恭喜你喲!!!!!!");
return1;
}
p2win()
/*玩家2獲勝界面*/
{printf("玩家2獲勝,恭喜你喲!!!!!!");
return1;
}
voidhelp()
/*幫助*/
{system("cls");
printf("t本程序采用19*19的游戲格式nn");
printf("t輸入格子的坐標下子:先橫坐標后縱
坐標。比如輸入:GGnn");
printf("t在游戲期間你可以通過輸入OUT(退回
主菜單)、BACK(悔棋)、LOSE(認輸)nn");
}
intmain()
/*主函數*/
{system("colorB1");
while(1)
{printf("nt-----C課程設計作業:黑白棋
-----nn");
printf("tt1.開始游戲n");
printf("tt2.幫助n");
printf("tt3.退出n");
printf("nt請選擇:");
scanf("%d",&i);
switch(i)
{ca1:StartGame();break;
ca2:help();break;
ca3:return0;
default:printf("t請重新選擇n");break;
}
}
}
本文發布于:2023-03-20 11:06:35,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/1679281596151630.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:黑白五子棋比賽.doc
本文 PDF 下載地址:黑白五子棋比賽.pdf
| 留言與評論(共有 0 條評論) |