C語言實現(xiàn)簡單的三子棋游戲
C語言:三子棋游戲,供大家參考,具體內(nèi)容如下
首先,我們從main函數(shù)開始寫起,分析游戲的整體邏輯
int main() { int input=0; srand((unsigned int)time(NULL)); do { menu(); printf("請選擇:"); scanf("%d",&input); switch(input) { case 1: game(); break; case 0: printf("退出游戲\n"); break; default: printf("輸入有誤,請重試!\n"); break; } }while(input); return 0; }
通過一個do…while循環(huán)來實現(xiàn)整體邏輯,首先要展示游戲菜單界面,即要編寫菜單menu()函數(shù):
void menu() { printf("************************************\n"); printf("******** 1.play 0.exit *********\n"); printf("************************************\n"); }
展示之后,通過用戶輸入的值來判斷用戶是要進行游戲還是要退出游戲,使用switch來實現(xiàn):當(dāng)用戶輸入1則表示進行游戲,輸入0表示退出游戲,而輸入其他的數(shù)字則提示輸入錯誤,重新輸入!
接下來就是要編寫game()函數(shù)了:
void game() { char board[ROW][COL] = {0}; char result='N'; initBoard(board,ROW,COL); display(board,ROW,COL); while(1) { playerMove(board,ROW,COL); display(board,ROW,COL); result=judge(board,ROW,COL); if (result != 'N') { break; } computerMove(board,ROW,COL); display(board,ROW,COL); result=judge(board,ROW,COL); if (result != 'N') { break; } } switch(result) { case '*': printf("恭喜你,你贏了?。?!\n"); break; case '#': printf("很遺憾,電腦贏了?。?!\n"); break; case 'E': printf("你和電腦是平局!??!\n"); break; default: break; } }
首先進入游戲,要初始化棋盤界面并展示給用戶,即編寫initBoard()函數(shù)和display()函數(shù):
void initBoard(char board[ROW][COL],int row,int col) { int i = 0; for(; i<row; i++) { int j=0; for(; j <col; j++) { board[i][j]=' '; } } } void display(char board[ROW][COL],int row,int col) { int i = 0; for(; i<row; i++) { int j=0; //打印數(shù)據(jù) for(; j<col; j++) { printf(" %c ",board[i][j]); if(j<col-1) printf("|"); } printf("\n"); //打印分割行 if(i<row-1) { for(j=0; j<col;j++) { printf("---"); if(j<row-1) { printf("|"); } } printf("\n"); } } }
接下來就要進入循環(huán),實現(xiàn)用戶和電腦下棋的邏輯,用playerMove()函數(shù)和computerMove()函數(shù)來實現(xiàn):
void playerMove(char board[ROW][COL],int row,int col) { int x=0; int y=0; printf("玩家走:>"); while(1) { 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("坐標非法,請重新輸入"); } } } 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; } } }
此時要注意每當(dāng)用戶或者電腦走完一步之后要展示棋盤并判斷輸贏,因此還需要寫一個judge()函數(shù):
char judge(char board[ROW][COL],int row,int col) { int i=0; int j=0; for(;i<row;i++) { if(board[i][0]!=' ' && board[i][0]==board[i][1] && board[i][1]==board[i][2]) { return board[i][0]; } } for(;j<col;j++) { if(board[0][j]!=' ' && board[0][j]==board[1][j] && board[1][j]==board[2][j]) { return board[0][j]; } } if(board[0][0]!=' ' && board[0][0]==board[1][1] && board[1][1]==board[2][2]) { return board[0][0]; } if(board[0][2]!=' ' && board[0][2]==board[1][1] && board[1][1]==board[2][1]) { return board[0][2]; } for (i = 0; i < row; i++) { int j = 0; for (; j < col; j++) { if (board[i][j] == ' ') { return 'N'; } } } return 'E'; }
判斷輸贏的條件就是三顆棋子連成一條直線即為贏,如果到最后用戶和電腦將棋盤下滿并且沒有分出勝負則判為平局。
最后在game函數(shù)中通過switch將judge()函數(shù)的返回值進行判斷,是玩家贏還是電腦贏還是平局。
注:將數(shù)組作為參數(shù)傳遞的時候,一定要記著將數(shù)組的大小也傳過去,如果不將數(shù)組的大小傳過去的話,在新的函數(shù)中計算數(shù)組的大小時,使用sizeof(arr)/sizeof(arr[0])會出現(xiàn)問題,因為數(shù)組作為參數(shù)傳遞的時候會被降維成指針,指針在32位系統(tǒng)下的大小為4個字節(jié),假設(shè)傳遞的是int類型的數(shù)組,則sizeof(arr)/sizeof(arr[0])=1,我們就不能按照正常的邏輯來實現(xiàn)想要實現(xiàn)的功能了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法
這篇文章主要介紹了詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09如何用C語言、Python實現(xiàn)棧及典型應(yīng)用
本文先通過實例分別介紹了如何用C語言、Python實現(xiàn)棧,后又介紹棧的典型應(yīng)用,對大家學(xué)習(xí)棧很有借鑒參考價值,下面一起來看看吧。2016-08-08