欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言實現(xiàn)簡單的三子棋游戲

 更新時間:2020年09月05日 11:03:20   作者:F什么琛。  
這篇文章主要為大家詳細介紹了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語言線性表中順序表超詳細理解

    C語言線性表中順序表超詳細理解

    程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要創(chuàng)建這種元素組,用變量記錄它們,傳進傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關(guān)系由它們的存儲順序自然表示
    2022-03-03
  • 基于select、poll、epoll的區(qū)別詳解

    基于select、poll、epoll的區(qū)別詳解

    本篇文章是對select、poll、epoll之間的區(qū)別進行了詳細的分析介紹。需要的朋友參考下
    2013-05-05
  • 詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法

    詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法

    這篇文章主要介紹了詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C語言實現(xiàn)考勤管理系統(tǒng)

    C語言實現(xiàn)考勤管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)考勤管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C語言棧與隊列面試題詳解

    C語言棧與隊列面試題詳解

    棧和隊列,嚴格意義上來說,也屬于線性表,因為它們也都用于存儲邏輯關(guān)系為 "一對一" 的數(shù)據(jù),但由于它們比較特殊,因此將其單獨作為一章,做重點講解
    2022-04-04
  • 如何用C語言、Python實現(xiàn)棧及典型應(yīng)用

    如何用C語言、Python實現(xiàn)棧及典型應(yīng)用

    本文先通過實例分別介紹了如何用C語言、Python實現(xiàn)棧,后又介紹棧的典型應(yīng)用,對大家學(xué)習(xí)棧很有借鑒參考價值,下面一起來看看吧。
    2016-08-08
  • C++超集C++/CLI模塊的基本語法

    C++超集C++/CLI模塊的基本語法

    這篇文章介紹了C++超集C++/CLI模塊的基本語法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C++中多線程的執(zhí)行順序如你預(yù)期嗎

    C++中多線程的執(zhí)行順序如你預(yù)期嗎

    這篇文章主要為大家詳細介紹一下C++中多線程的執(zhí)行順序的相關(guān)資料,文中的示例代碼講解詳細,對我們學(xué)習(xí)C++多線程有一定幫助,需要的可以參考一下
    2022-10-10
  • 剖析C++中的常量表達式與省略號的相關(guān)作用

    剖析C++中的常量表達式與省略號的相關(guān)作用

    這篇文章主要介紹了C++中的常量表達式與省略號的相關(guān)作用,以及表達式中的可變參數(shù)模板示例,需要的朋友可以參考下
    2016-01-01
  • c++字符串分割的方法

    c++字符串分割的方法

    這篇文章主要介紹了c++字符串分割的方法,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08

最新評論