五子棋-C

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<string.h>

#define MAXIMUS 15 //定義棋盤大小

int p[MAXIMUS][MAXIMUS];//存儲對局信息

char buff[MAXIMUS*2+1][MAXIMUS*4+3];//輸出緩沖器

int Cx,Cy;//當(dāng)前光標(biāo)位置

int Now;//當(dāng)前走子的玩家鞭执,1代表黑阱持,2代表白

int wl,wp;//當(dāng)前寫入緩沖器的列數(shù)和行數(shù)位置

char* showText;//在棋盤中央顯示的文字信息

int count;//回合數(shù)

char* Copy(char* strDest,const char* strSrc)//修改過的字符串復(fù)制函數(shù)馍驯,會忽略末端的\0

{

char* strDestCopy = strDest;

while (*strSrc!='\0')

{

*strDest++=*strSrc++;

}

return strDestCopy;

}

void Initialize()//初始化一個對局函數(shù)

{

int i,j;//循環(huán)變量

showText="";//重置顯示信息

count=0;//回合數(shù)歸零

for(i=0;i

{

for(j=0;j

{

p[i][j]=0;

}

}

Cx=Cy=MAXIMUS/2;//重置光標(biāo)到中央

Now=1;//重置當(dāng)前為黑方

}

char* getStyle(int i,int j)//獲得棋盤中指定坐標(biāo)交點位置的字符孩灯,通過制表符拼成棋盤

{

if(p[i][j]==1)//1為黑子

return "●";

else if(p[i][j]==2)//2為白子

return "○";

else if(i==0&&j==0)//以下為邊緣棋盤樣式

return "┏";

else if(i==MAXIMUS-1&&j==0)

return "┓";

else if(i==MAXIMUS-1&&j==MAXIMUS-1)

return "┛";

else if(i==0&&j==MAXIMUS-1)

return "┗";

else if(i==0)

return "┠";

else if(i==MAXIMUS-1)

return "┨";

else if(j==0)

return "┯";

else if(j==MAXIMUS-1)

return "┷";

return "┼";//中間的空位

}

char* getCurse(int i,int j){//獲得指定坐標(biāo)交點位置左上格的樣式,通過制表符來模擬光標(biāo)的顯示

if(i==Cx){

if(j==Cy)

return "┏";

else if (j==Cy+1)

return "┗";

}

else if(i==Cx+1)

{

if(j==Cy)

return "┓";

else if (j==Cy+1)

return "┛";

}

return " ";//如果不在光標(biāo)附近則為空

}

void write(char* c)//向緩沖器寫入字符串

{

Copy(buff[wl]+wp,c);

wp+=strlen(c);

}

void ln()//緩沖器寫入位置提行

{

wl+=1;

wp=0;

}

void Display()//將緩沖器內(nèi)容輸出到屏幕

{

int i,l=strlen(showText);//循環(huán)變量,中間文字信息的長度

int Offset=MAXIMUS*2+2-l/2;//算出中間文字信息居中顯示所在的橫坐標(biāo)位置

if(Offset%2==1)//如果位置為奇數(shù),則移動到偶數(shù),避免混亂

{

Offset--;

}

Copy(buff[MAXIMUS]+Offset,showText);//講中間文字信息復(fù)制到緩沖器

if(l%2==1)//如果中間文字長度為半角奇數(shù)廉嚼,則補上空格,避免混亂

{

*(buff[MAXIMUS]+Offset+l)=0x20;

}

system("cls");//清理屏幕倒戏,準(zhǔn)備寫入

for(i=0;i

printf("%s",buff[i]);

if(i

printf("\n");

}

}

void Print()//將整個棋盤算出并儲存到緩沖器怠噪,然后調(diào)用Display函數(shù)顯示出來

{

int i,j;//循環(huán)變量

wl=0;

wp=0;

for(j=0;j<=MAXIMUS;j++)//寫入出交點左上角的字符,因為需要打印棋盤右下角峭梳,所以很以橫縱各多一次循環(huán)

{

for(i=0;i<=MAXIMUS;i++)

{

write(getCurse(i,j));//寫入左上角字符

if(j==0||j==MAXIMUS)//如果是棋上下盤邊緣則沒有連接的豎線舰绘,用空格填充位置

{

if(i!=MAXIMUS)

write(" ");

}

else//如果在棋盤中間則用豎線承接上下

{

if(i==0||i==MAXIMUS-1)//左右邊緣的豎線更粗

write("┃");

else if(i!=MAXIMUS)//中間的豎線

write("│");

}

}

if(j==MAXIMUS)//如果是最后一次循環(huán),則只需要處理邊側(cè)字符葱椭,交點要少一排

{

break;

}

ln();//提行開始打印交點內(nèi)容

write(" ");//用空位補齊位置

for(i=0;i

{

write(getStyle(i,j));//寫入交點字符

if(i!=MAXIMUS-1)//如果不在最右側(cè)則補充一個橫線承接左右

{

if(j==0||j==MAXIMUS-1)

{

write("━");//上下邊緣的橫線更粗

}

else

{

write("—");//中間的橫線

}

}

}

ln();//寫完一行后提行

}

Display();//將緩沖器內(nèi)容輸出到屏幕

}

int Put(){//在當(dāng)前光標(biāo)位置走子捂寿,如果非空,則返回0表示失敗

if(p[Cx][Cy]==0)

{

p[Cx][Cy]=Now;//改變該位置數(shù)據(jù)

return 1;//返回1表示成功

}

else

{

return 0;

}

}

int Check()//勝負(fù)檢查孵运,即判斷當(dāng)前走子位置有沒有造成五連珠的情況

{

int w=1,x=1,y=1,z=1,i;//累計橫豎正斜反邪四個方向的連續(xù)相同棋子數(shù)目

for(i=1;i<5;i++)if(Cy+i

for(i=1;i<5;i++)if(Cy-i>0&&p[Cx][Cy-i]==Now)w++;else break;//向上檢查

if(w>=5)return Now;//若果達(dá)到5個則判斷當(dāng)前走子玩家為贏家

for(i=1;i<5;i++)if(Cx+i

for(i=1;i<5;i++)if(Cx-i>0&&p[Cx-i][Cy]==Now)x++;else break;//向左檢查

if(x>=5)return Now;//若果達(dá)到5個則判斷當(dāng)前走子玩家為贏家

for(i=1;i<5;i++)if(Cx+i

for(i=1;i<5;i++)if(Cx-i>0&&Cy-i>0&&p[Cx-i][Cy-i]==Now)y++;else break;//向左上檢查

if(y>=5)return Now;//若果達(dá)到5個則判斷當(dāng)前走子玩家為贏家

for(i=1;i<5;i++)if(Cx+i0&&p[Cx+i][Cy-i]==Now)z++;else break;//向右上檢查

for(i=1;i<5;i++)if(Cx-i>0&&Cy+i

if(z>=5)return Now;//若果達(dá)到5個則判斷當(dāng)前走子玩家為贏家

return 0;//若沒有檢查到五連珠秦陋,則返回0表示還沒有玩家達(dá)成勝利

}

int RunGame()//進行整個對局,返回贏家信息(雖然有用上)

{

int input;//輸入變量

int victor;//贏家信息

Initialize();//初始化對局

while(1){//開始無限回合的死循環(huán)治笨,直到出現(xiàn)勝利跳出

Print();//打印棋盤

input=getch();//等待鍵盤按下一個字符

if(input==27)//如果是ESC則退出程序

{

exit(0);

}

else if(input==0x20)//如果是空格則開始走子

{

if(Put())//如果走子成功則判斷勝負(fù)

{

victor=Check();

Now=3-Now;//輪換當(dāng)前走子玩家

count++;

if(victor==1)//如果黑方達(dá)到勝利驳概,顯示提示文字并等待一次按鍵,返回勝利信息

{

showText="黑方獲得了勝利旷赖!";

Print();

if(getch()==0xE0)

{

getch();

}

return Now;

}

else if(victor==2)//如果白方達(dá)到勝利顺又,顯示提示文字并等待一次按鍵,返回勝利信息

{

showText="白方獲得了勝利等孵!";

Display();

if(getch()==0xE0)

{

getch();

}

return Now;

}else if(count==MAXIMUS*MAXIMUS)//如果回合數(shù)達(dá)到了棋盤總量稚照,即棋盤充滿,即為平局

{

showText="平局!";

Display();

if(getch()==0xE0)

{

getch();

}

return 0;

}

}

}

else if(input==0xE0)//如果按下的是方向鍵果录,會填充兩次輸入上枕,第一次為0xE0表示按下的是控制鍵

{

input=getch();//獲得第二次輸入信息

switch(input)//判斷方向鍵方向并移動光標(biāo)位置

{

case 0x4B://

Cx--;

break;

case 0x48:

Cy--;

break;

case 0x4D:

Cx++;

break;

case 0x50:

Cy++;

break;

}

if(Cx<0)Cx=MAXIMUS-1;//如果光標(biāo)位置越界則移動到對側(cè)

if(Cy<0)Cy=MAXIMUS-1;

if(Cx>MAXIMUS-1)Cx=0;

if(Cy>MAXIMUS-1)Cy=0;

}

}

}

int main()//主函數(shù)

{

system("title 簡易五子棋 ——Etsnarl制作");//設(shè)置標(biāo)題

system("mode con cols=63 lines=32");//設(shè)置窗口大小

system("color E0");//設(shè)置顏色

while(1){//循環(huán)執(zhí)行游戲

RunGame();

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市弱恒,隨后出現(xiàn)的幾起案子辨萍,更是在濱河造成了極大的恐慌,老刑警劉巖返弹,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锈玉,死亡現(xiàn)場離奇詭異,居然都是意外死亡义起,警方通過查閱死者的電腦和手機嘲玫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來并扇,“玉大人,你說我怎么就攤上這事抡诞∏钣迹” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵昼汗,是天一觀的道長肴熏。 經(jīng)常有香客問我,道長顷窒,這世上最難降的妖魔是什么蛙吏? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮鞋吉,結(jié)果婚禮上鸦做,老公的妹妹穿的比我還像新娘。我一直安慰自己谓着,他們只是感情好泼诱,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赊锚,像睡著了一般治筒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舷蒲,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天耸袜,我揣著相機與錄音,去河邊找鬼牲平。 笑死堤框,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胰锌,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼骗绕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了资昧?” 一聲冷哼從身側(cè)響起酬土,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎格带,沒想到半個月后撤缴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡叽唱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年屈呕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棺亭。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡虎眨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出镶摘,到底是詐尸還是另有隱情嗽桩,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布凄敢,位于F島的核電站碌冶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涝缝。R本人自食惡果不足惜扑庞,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拒逮。 院中可真熱鬧罐氨,春花似錦、人聲如沸滩援。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狠怨。三九已至约啊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佣赖,已是汗流浹背恰矩。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留憎蛤,地道東北人闸准。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像虑稼,于是被迫代替她去往敵國和親葫松。 傳聞我的和親對象是個殘疾皇子钝尸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容