使用C語言實現(xiàn)五子棋游戲_第1頁
使用C語言實現(xiàn)五子棋游戲_第2頁
使用C語言實現(xiàn)五子棋游戲_第3頁
使用C語言實現(xiàn)五子棋游戲_第4頁
使用C語言實現(xiàn)五子棋游戲_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第使用C語言實現(xiàn)五子棋游戲目錄一、實現(xiàn)的目的和意義二、實現(xiàn)內(nèi)容描述三、實現(xiàn)原理四、實現(xiàn)模塊五子棋實現(xiàn)分為三大模塊五、模塊代碼分析六、實現(xiàn)結(jié)果七、總結(jié)本文實例為大家分享了C語言實現(xiàn)五子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下

一、實現(xiàn)的目的和意義

1、鞏固和加深對c語言知識的理解

2、學(xué)會使用編譯器的各種調(diào)試

3、提高解決實際問題的能力

二、實現(xiàn)內(nèi)容描述

實現(xiàn)簡單的人人對戰(zhàn)五子棋,此設(shè)計用的是C語言去實現(xiàn)

三、實現(xiàn)原理

采用二位數(shù)組保存棋盤信息,棋盤上面的任何一個位置,里頭可以放三個信息:

1、空

2、用戶1的落子

3、用戶2的落子

下棋就是在二維數(shù)組種找對應(yīng)的空位置,進(jìn)行落子,落完之后立即就要判斷落子位置是否有五字連珠,從而判斷誰數(shù)輸誰贏。每走一次棋會有四種情況:

*用戶1贏

*用戶2贏

*平局(這里說的平局是棋盤被占滿的情況)

*沒有出結(jié)果意思就是時此用戶沒贏下個用繼續(xù)去下棋

四、實現(xiàn)模塊五子棋實現(xiàn)分為三大模塊

文件名作用

five_chress.h五子棋的函數(shù)聲明,頭文件聲明等

five_chress.c五子棋函數(shù)接口的實現(xiàn)

main.c五子棋函數(shù)測試功能

五、模塊代碼分析

1、five_chress.h

#pragmaonce

#includestdio.h

#includestring.h

#includeWindows.h

#defineROW10//數(shù)組號行號按需求調(diào)整

#defineCOL10//數(shù)組列數(shù)按需求調(diào)整

#definePLAYER11//玩家編號,默認(rèn)棋盤數(shù)據(jù)是0,玩家1落子,該位置被改成1

#definePLAYER22//玩家編號,默認(rèn)棋盤數(shù)據(jù)是0,玩家2落子,該位置被改成2

#defineNEXT

0//游戲繼續(xù)

#definePLAYER1_WIN1//玩家1贏

#definePLAYER2_WIN2//玩家2贏

#defineDRAW

3//平局

enumDir{

LEFT,

RIGHT,

UP,

DOWN,

LEFT_UP,

LEFT_DOWN,

RIGHT_UP,

RIGHT_DOWN

};//用枚舉去表示4個方向,上下,左右,左上右下,右上左下,統(tǒng)計用戶當(dāng)前棋子四個方向的棋數(shù)是否為大于等于5

voidMenu();//實現(xiàn)菜單

voidGame();//構(gòu)建游戲入口Game()函數(shù)

2、five_chress.c

#include"five_chress.h"

intx=0;

inty=0;

voidMenu()

printf("############################\n");

printf("##1.Play

0.Exit##\n");

printf("############################\n");

printf("PleaseSelect#");

//按照x,y作為起點(diǎn),按照特定的方向,求連續(xù)相對的最大格式

intChessCount(intboard[][COL],introw,intcol,enumDird)

int_x=x-1;//從1

int_y=y-1;//從1

intcount=0;

while(1){

switch(d){

caseLEFT://從當(dāng)前位置向左移動統(tǒng)計橫坐標(biāo)不變縱坐標(biāo)變了所以是y--

_y--;

break;

caseRIGHT://從當(dāng)前位置向右移動統(tǒng)計橫坐標(biāo)不變縱坐標(biāo)變了所以是_y++

_y++;

break;

caseUP://從當(dāng)前位置向上移動統(tǒng)計縱坐標(biāo)不變橫坐標(biāo)變了所以是_x--

_x--;

break;

caseDOWN://從當(dāng)前位置向下移動統(tǒng)計縱坐標(biāo)不變橫坐標(biāo)變了所以是_x++

_x++;

break;

caseLEFT_UP://從當(dāng)前位置向左上移動統(tǒng)計縱,橫變都變了所以是_x--,_y--

_x--,_y--;

break;

caseLEFT_DOWN://從當(dāng)前位置左下移動統(tǒng)計縱,橫坐標(biāo)都變了所以是_x++,_y--

_x++,_y--;

break;

caseRIGHT_UP://從當(dāng)前位置右上移動統(tǒng)計縱,橫坐標(biāo)都變了所以是_x--,_y++-

_x--,_y++;

break;

caseRIGHT_DOWN://從當(dāng)前位置右下移動統(tǒng)計縱,橫坐標(biāo)都變了所以是_x++,_y++

_x++,_y++;

break;

default:

//DoNothing

break;

}

if(_x0||_xrow-1||_y0||_ycol-1){

break;/表示越界了就停止

}

//合法

if(board[x-1][y-1]==board[_x][_y]){

count++;//統(tǒng)計從舊位置出發(fā)統(tǒng)計和他一樣的個數(shù)

}

else{

break;//如果碰到不一樣的就終止循環(huán)

}

}

returncount;//返回統(tǒng)計個數(shù)

//4種情況

//NEXT:表明要繼續(xù)

//PLAYER1_WIN:用戶1贏了

//PLAYER2_WIN:用戶2贏了

//DRAW:平局

intIsOver(intboard[][COL],introw,intcol)

intcount1=ChessCount(board,row,col,LEFT)+ChessCount(board,row,col,RIGHT)+1;//

intcount2=ChessCount(board,row,col,UP)+ChessCount(board,row,col,DOWN)+1;//

intcount3=ChessCount(board,row,col,LEFT_UP)+ChessCount(board,row,col,RIGHT_DOWN)+1;//

intcount4=ChessCount(board,row,col,LEFT_DOWN)+ChessCount(board,row,col,RIGHT_UP)+1;//

if(count1=5||count2=5||count3=5||count4=5){

//有五子連珠

//一定有人贏

//x,y

if(board[x-1][y-1]==PLAYER1){

returnPLAYER1_WIN;

}

else{

returnPLAYER2_WIN;

}

}

inti=0;

for(;irow;i++){

intj=0;

for(;jcol;j++){

if(board[i][j]==0){

returnNEXT;//當(dāng)前位置還沒有被填寫棋盤不滿當(dāng)前用戶沒有贏返回next

讓下個用戶繼續(xù)下

}

}

}

returnDRAW;//最后一種情況棋盤滿了為平局

voidShowBoard(intboard[][COL],introw,intcol)

//printf("\e[1;1H\e[2J");這是linux環(huán)境下用的清屏

//講數(shù)組內(nèi)容,進(jìn)行可視化

system("cls");//vs環(huán)境下用的清屏

inti=0;

for(i=1;i=col;i++){

printf("%3d",i);

}

printf("\n");

for(i=0;irow;i++){

intj=0;

printf("%2d",i+1);

for(;jcol;j++){

if(board[i][j]==0){

printf(".");

}

elseif(board[i][j]==PLAYER1){

printf("x");

}

else{

printf("y");

}

}

printf("\n");

}

voidPlayerMove(intboard[][COL],introw,intcol,intwho)

while(1){

printf("Player[%d]PleaseEnterYourPos#",who);

scanf("%d%d",x,

if(x1||xrow||y1||ycol){

printf("PosIsNotRight!\n");

continue;

}

elseif(board[x-1][y-1]!=0){

printf("PosIsOccupied!\n");

continue;

}

else{

//合法性,去重

board[x-1][y-1]=who;

break;

}

}

voidGame()

intboard[ROW][COL];

memset(board,0,sizeof(board));

intresult=NEXT;

do{

ShowBoard(board,ROW,COL);//顯示棋盤

PlayerMove(board,ROW,COL,PLAYER1);//Player1先走

result=IsOver(board,ROW,COL);//判斷游戲是否結(jié)束

if(NEXT!=result){

break;//如果返回值不等于NEXT就跳出循環(huán)說明當(dāng)前用戶贏了或者平局如果=NEXT下個用戶繼續(xù)下

}

ShowBoard(board,ROW,COL);//同上

PlayerMove(board,ROW,COL,PLAYER2);

result=IsOver(board,ROW,COL);

if(NEXT!=result){

break;

}

}while(1);

//p1win,p2win,draw

switch(result){

casePLAYER1_WIN:

ShowBoard(board,ROW,COL);

printf("恭喜用戶1,你已經(jīng)贏了!\n");

break;

casePLAYER2_WIN:

printf("恭喜用戶2,你已經(jīng)贏了!\n");

break;

caseDRAW:

printf("平局\n");

break;

default:

//donothing!

break;

}

}

分析:

我們要先構(gòu)建游戲入口voidgame()函數(shù)在里面構(gòu)建上層本調(diào)用框架例如一開始初始化數(shù)組把每個位置都置為0,然后構(gòu)建調(diào)用框架:

1、我們要保存二位數(shù)組并可視化就要構(gòu)建ShowBoard函數(shù);

2、之后我們要讓用戶下棋就要構(gòu)建PlayerMove()函數(shù)

3、第一個用戶下完之后就要立馬判斷當(dāng)前用戶是否贏,因為落子和判定是強(qiáng)相關(guān)的這時候要構(gòu)建IsOver()函數(shù)

如果此用戶沒贏那二個用戶繼續(xù)下。

當(dāng)我們這些函數(shù)邏輯都明確好的時候就用分而治之思想,實現(xiàn)他們的功能。

*1、ShowBoard()函數(shù)里面我用到了一個c語言里面的清屏函數(shù)printf(cls);引上頭文件window.h,這個的作用是在固定地方刷新視圖,把上次的視圖清理掉,顯示當(dāng)前位置視圖。

后面就打印視圖的內(nèi)容。用戶一和用戶二可以用字符表示,也可以用圓圈圖案表示這個圖案可以在網(wǎng)上找復(fù)制一下就可

*2、Playermove()函數(shù)讓用戶下棋,里面先考慮它的合法性,不能越界和重復(fù),再然后用我們在five_chrsss.h文件定義宏來賦值,賦完之后再終止循環(huán)。

*3、Isover()函數(shù)里面是讓我們判斷誰輸誰贏換句話游戲是否結(jié)束。游戲結(jié)束標(biāo)志是分為四種情況。用戶一贏,用戶二贏,平局,繼續(xù)。前兩種情況則需要判斷從當(dāng)前位置出發(fā)沿四個方向當(dāng)前用戶棋的個數(shù)是否為大于等于5,在判斷一下是哪個用戶的棋就返回哪個用戶。而這判斷需要在構(gòu)建并調(diào)用ChressCount()函數(shù)去統(tǒng)計當(dāng)前用戶的個數(shù)是否大于等于5,有4個方向,例如上和下為一個方向,左和右為一個方向,左上和右下為一個方向,右上和左下為一個方向,分別各自相加之后在加上1就是當(dāng)前的棋,如果滿足這個4個方向大于等于5的一個條件,我們就能知道一定有人贏,否則在繼續(xù)判斷周圍是否有空位置,有則返回NEXT讓下個用戶繼續(xù)下,沒有則返回平局*ChressCoun()函數(shù)具體分析請看代碼塊

這些函數(shù)實現(xiàn)完之后再在Game()函數(shù)里面來個Switc

溫馨提示

  • 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

提交評論