C語言數(shù)組實現(xiàn)三子棋應(yīng)用實例
本文實例為大家分享了C語言數(shù)組實現(xiàn)三子棋應(yīng)用的具體代碼,供大家參考,具體內(nèi)容如下

三子棋:(拆分部分如下)
test.c 測試游戲邏輯
game.h關(guān)于游戲相關(guān)的函數(shù)聲明,符號聲明 頭文件的包含
game.c游戲相關(guān)函數(shù)的實現(xiàn)
游戲進(jìn)行的過程:(4種)
1.玩家獲勝--*(游戲結(jié)束)
2.電腦獲勝--#(游戲結(jié)束)
3.平局--Q(游戲結(jié)束)
4.游戲繼續(xù)--C
IsWin函數(shù) 用來判斷游戲的狀態(tài)
game.c
#include"game.h"
#include<stdio.h>
//初始化棋盤的函數(shù)?
void InitBoard(char board[ROW][COL],int row,int col)
{
?? ?int i=0;
?? ?int j=0;
?? ?for(i=0;i<row;i++)
?? ?{
?? ??? ?for(j=0;j<col;j++)
?? ??? ?{
?? ??? ??? ?board[i][j]=' ';
?? ??? ?}
?? ?}?? ??? ?
}?
?
void DisplayBoard(char board[ROW][COL],int row,int col)
{
?? ?int i=0;
?? ?for(i=0;i<row;i++)
?? ?{
?? ??? ?int j=0;
?? ??? ?for(j=0;j<col;j++)
?? ??? ?{
?? ??? ??? ?printf(" %c ",board[i][j]);
?? ??? ??? ?if(j<col-1)
?? ??? ??? ??? ?printf("|");
?? ??? ?}
?? ??? ?printf("\n");
?? ??? ?if(i<row-1)?
?? ??? ?{
?? ??? ??? ?int j=0;
?? ??? ??? ?for(j=0;j<col;j++)
?? ??? ??? ?{
?? ??? ??? ??? ?printf("---");
?? ??? ??? ??? ?if(j<col-1)
?? ??? ??? ? ? ??? ?printf("|");?? ?
?? ??? ??? ?}
?? ??? ??? ?printf("\n");?? ?
?? ??? ?}
?? ?}
}
?
//玩家下棋?
void PlayerMove(char board[ROW][COL],int row,int col)?
{
?? ?int x=0;
?? ?int y=0;
?? ?printf("玩家走:>\n");
?? ?while(1)
?? ?{
?? ??? ?printf("請輸入下棋的坐標(biāo):>");
?? ??? ?scanf("%d%d",&x,&y);
?? ??? ?//判斷坐標(biāo)合法性?
?? ??? ?if(x>=1&&x<=row&&y>=1&&y<=col)
?? ??? ?{
?? ??? ??? ?//下棋
?? ??? ??? ?//判斷坐標(biāo)是否被占用
?? ??? ??? ?if(board[x-1][y-1]==' ')
?? ??? ??? ?{
?? ??? ??? ??? ?board[x-1][y-1]='*';
?? ??? ??? ??? ?break;
?? ??? ??? ?}?
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?printf("坐標(biāo)被占用,請重新輸入\n");
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?printf("坐標(biāo)非法,請重新輸入\n");
?? ??? ?}
?? ?}
}
?
void ComputerMove(char board[ROW][COL],int row,int col)
{
?? ?printf("電腦走:>\n");
?? ?while(1)
?? ?{
?? ??? ?int x=rand()%row;
?? ??? ?int y=rand()%col;
?? ??? ?//判斷占用
?? ??? ?if(board[x][y]==' ')?
?? ??? ?{
?? ??? ??? ?board[x][y]='#';
?? ??? ??? ?break;
?? ??? ?}
}
IsFull(char board[ROW][COL],int row,int col)
{
?? ?int i=0;
?? ?int j=0;
?? ?for(i=0;i<row;i++)
?? ?{
?? ??? ?for(j=0;j<col;j++)
?? ??? ?{
?? ??? ??? ?if(board[i][j]==' ')
?? ??? ??? ?{
?? ??? ??? ??? ?return 0;//棋盤沒滿?
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?return 1;
?? ?//棋盤滿了?
}
?
char IsWin(char board[ROW][COL],int row,int col)
{
?? ?int i=0;
?? ?//判斷三行?
?? ?for(i=0;i<row;i++)
?? ?{
?? ??? ?if(board[i][0]==board[i][1]&&board[i][1]==board[i][2]&&board[i][1]!=' ')
?? ??? ?{
?? ??? ??? ?return board[i][1];
?? ??? ?}
?? ?}
?? ?//判斷三列
?? ?for(i=0;i<ccol;i++)
?? ?{
?? ??? ?if(board[0][i]==board[1][i]&&board[1][i]==board[2][i]&&board[1][i]!=' ')
?? ??? ?{
?? ??? ??? ?return board[1][i];
?? ??? ?}
?? ?}?
?? ?//判斷對角線
?? ?if(board[0][0]==board[1][1]&&board[1][1]==board[2][2]&&board[1][1]!=' ')
?? ?{
?? ??? ?return board[1][1];
?? ?}
?? ?if(board[0][2]==board[1][1]&&board[1][1]==board[2][0]&&board[1][1]!=' ')
?? ?{
?? ??? ?return board[1][1];
?? ?}
?? ?
?? ?//判斷平局--棋盤是否下滿,滿了返回1,不滿返回0
?? ?int ret=IsFull(board,row,col);
?? ?if(ret==1)
?? ?{
?? ??? ?return '0';
?? ?}?
?? ??
?? ?//繼續(xù)
?? ?return 'C';?? ??
}game.h
//頭文件的包含? #include<stdio.h> #include<stdlib.h> #include<time.h> ? //符號的定義? #define ROW 3 #define COL 3 ? //函數(shù)的聲明 //初始化棋盤? void InitBoard(char board[ROW][COL],int row,int col); ? //打印棋盤 void DisplayBoard(char board[ROW][COL],int row,int col);? ? //玩家下棋? void PlayerMove(char board[ROW][COL],int row,int col); ? //電腦下棋 void ComputerMove(char board[ROW][COL],int row,int col); ? //判斷游戲是否出現(xiàn)輸贏? char IsWin(char board[ROW][COL],int row,int col);
test.c
#include"game.h"http://引用頭文件?
void menu()
{
?? ?printf("*************************\n");
?? ?printf("***** ? ?1.play ? ?******\n");
?? ?printf("***** ? ?0.exit ? ?******\n");
?? ?printf("*************************\n");
}
void game()
{
?? ?//存儲數(shù)據(jù),二維數(shù)組
?? ?char board[ROW][COL];?
?? ?//初始化棋盤,初始化空格
?? ?InitBoard(board,ROW,COL);
?? ?//打印棋盤--本質(zhì)為打印數(shù)組內(nèi)容?
?? ?DisplayBoard(board,ROW,COL);?
?? ?char ret=0;//接受游戲狀態(tài)?
?? ?while(1)
?? ?{
?? ??? ?//玩家下棋
?? ??? ?PlayerMove(board,ROW,COL);
?? ??? ?DisplayBoard(board,ROW,COL);
?? ??? ?//判斷玩家是否獲勝?
?? ??? ?ret=IsWin(board,ROW,COL);
?? ??? ?if(ret!='C')
?? ??? ??? ?break;?
?? ??? ?
?? ??? ?//電腦下棋?
?? ??? ?ComputerMove(board,ROW,COL);
?? ??? ?DisplayBoard(board,ROW,COL);
?? ??? ?//判斷電腦是否獲勝?
?? ??? ?ret=IsWin(board,ROW,COL);
?? ??? ?if(ret!='C')
?? ??? ??? ?break;
?? ?}
?? ?if(ret=='*')
?? ?{
?? ??? ?printf("玩家獲勝\n");?? ?
?? ?}
?? ?else if(ret=='#')
?? ?{
?? ??? ?printf("電腦獲勝\n");?? ?
?? ?}
?? ?else
?? ?{
?? ??? ?printf("平局\n");?? ?
?? ?}
?? ?DisplayBoard(board,ROW,COL);?? ?
}
int main()
{
?? ?int input=0;
?? ?srand((unsigned int)time(NULL));
?? ?do
?? ?{
?? ??? ?menu();
?? ??? ?printf("請選擇:>");
?? ??? ?scanf("%d",&input);
?? ??? ?switch(input)
?? ??? ?{
?? ??? ?case 1:
?? ??? ??? ?printf("三子棋游戲\n");
?? ??? ??? ?break;
?? ??? ?case 0:
?? ??? ??? ?printf("退出游戲\n");
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?printf("選擇錯誤,重新選擇\n");
?? ??? ??? ?break;
?? ??? ?}
?? ?}while(input);
?? ?
}

部分游戲界面,如上圖所示
具體思路見代碼中注釋所示
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言字符函數(shù)isalnum()和iscntrl()詳解
大家好,本篇文章主要講的是C語言字符函數(shù)isalnum()和iscntrl()詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-02-02
從匯編看c++中函數(shù)里面的static關(guān)鍵字的使用說明
c++中的static關(guān)鍵字使得函數(shù)里面的局部變量的存活期不在局限于函數(shù)里面,而是變?yōu)樵谡麄€程序生命期里面都有效2013-05-05
C/C++實現(xiàn)矩陣的轉(zhuǎn)置(示例代碼)
C/C++實現(xiàn)矩陣的轉(zhuǎn)置(示例代碼)需要的朋友可以過來參考下,希望對大家有所幫助2013-10-10

