C語言數(shù)組實現(xiàn)三子棋應用實例
本文實例為大家分享了C語言數(shù)組實現(xiàn)三子棋應用的具體代碼,供大家參考,具體內(nèi)容如下
三子棋:(拆分部分如下)
test.c 測試游戲邏輯
game.h關(guān)于游戲相關(guān)的函數(shù)聲明,符號聲明 頭文件的包含
game.c游戲相關(guān)函數(shù)的實現(xià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("請輸入下棋的坐標:>"); ?? ??? ?scanf("%d%d",&x,&y); ?? ??? ?//判斷坐標合法性? ?? ??? ?if(x>=1&&x<=row&&y>=1&&y<=col) ?? ??? ?{ ?? ??? ??? ?//下棋 ?? ??? ??? ?//判斷坐標是否被占用 ?? ??? ??? ?if(board[x-1][y-1]==' ') ?? ??? ??? ?{ ?? ??? ??? ??? ?board[x-1][y-1]='*'; ?? ??? ??? ??? ?break; ?? ??? ??? ?}? ?? ??? ??? ?else ?? ??? ??? ?{ ?? ??? ??? ??? ?printf("坐標被占用,請重新輸入\n"); ?? ??? ??? ?} ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?printf("坐標非法,請重新輸入\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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言字符函數(shù)isalnum()和iscntrl()詳解
大家好,本篇文章主要講的是C語言字符函數(shù)isalnum()和iscntrl()詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下2022-02-02從匯編看c++中函數(shù)里面的static關(guān)鍵字的使用說明
c++中的static關(guān)鍵字使得函數(shù)里面的局部變量的存活期不在局限于函數(shù)里面,而是變?yōu)樵谡麄€程序生命期里面都有效2013-05-05C/C++實現(xiàn)矩陣的轉(zhuǎn)置(示例代碼)
C/C++實現(xiàn)矩陣的轉(zhuǎn)置(示例代碼)需要的朋友可以過來參考下,希望對大家有所幫助2013-10-10