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

C語言實(shí)現(xiàn)簡單的井字棋游戲

 更新時(shí)間:2021年04月28日 09:51:24   作者:肖舎  
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡單的井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語言實(shí)現(xiàn)簡單井字棋游戲的具體代碼,供大家參考,具體內(nèi)容如下

1.什么是井字棋

井字棋相信大部分人都玩過

規(guī)則:雙方輪流放子,當(dāng)某一方的三個(gè)子連成一線(行,列,對角)時(shí),該方獲勝。

2.游戲前的準(zhǔn)備

1. 菜單

游戲正式開始前我們可以為用戶提供一個(gè)選擇菜單,筆者做了一個(gè)最簡單的游戲開始菜單:

代碼:

/*菜單*/
int menu()
{
 printf("###########################\n");
 printf("##   1.Play 2.Exit   ##\n");
 printf("###########################\n");
 return 0;
}

2. 打印棋盤

要玩游戲我們首先要有一個(gè)3*3的棋盤,棋子信息則用一個(gè)二維數(shù)組來表示,并進(jìn)行初始化:

char chess[ROW][COL] = { '\0' }; //ROW=3,COL=3

顯示棋盤我們可以寫一個(gè)函數(shù):

/*顯示棋盤*/
int ShowBroad(char chess[][COL])
{
 system("cls");  //刷新界面
 printf(" %c | %c |%c          Player:   X\n",chess[0][0],chess[0][1],chess[0][2]);
 printf(" ----------        Computer: O\n");
 printf(" %c | %c |%c \n", chess[1][0], chess[1][1], chess[1][2]);
 printf(" ----------\n");
 printf(" %c | %c |%c \n", chess[2][0], chess[2][1], chess[2][2]);

}

將棋盤打印出來的同時(shí)在旁邊顯示出玩家和電腦所用的棋子。棋盤效果:

由于電腦是隨機(jī)落子的,這樣我們就會(huì)用到隨機(jī)數(shù),于是可以在后面加上隨機(jī)數(shù)的種子,為之后的隨機(jī)數(shù)做準(zhǔn)備。
至此,準(zhǔn)備工作就完成了,這部分的代碼如下:

int a ,count =0;
char chess[ROW][COL] = { '\0' };
menu();        //顯示菜單
printf("Please Enter Your Chose:>\n ");
scanf("%d", &a);
if (a != 1){ return 0; }
ShowBroad(chess);
srand((unsigned)time(NULL));

其中count是用來統(tǒng)計(jì)已占用的格子。

3.游戲開始

做完準(zhǔn)備工作后我們開始正式的游戲邏輯編寫。游戲邏輯可以這樣考慮:

先由用戶輸入一個(gè)坐標(biāo),進(jìn)行勝負(fù)和平局判斷,若未產(chǎn)生任何結(jié)果則由電腦落子,之后同樣進(jìn)行勝負(fù)判斷,如此循環(huán)直到產(chǎn)生勝負(fù)或平局。

基于此,我們將所有游戲過程寫在一個(gè)死循環(huán)中,直到產(chǎn)生游戲結(jié)果則跳出。

1. 玩家落子

代碼:

 if ((user_x >= 1 && user_x <= 3) && (user_y >= 1 && user_y <= 3)&&\
   chess[user_x-1][user_y-1]=='\0'){  //輸入是否合法
   chess[user_x - 1][user_y - 1] = 'X';
   count++;
   if (Judge(chess) == 'X'){    //判斷玩家贏
    ShowBroad(chess);
    printf("You Win! :)\n");
    break;
   }
  else if (count == 9){     //判斷平局
    ShowBroad(chess);
    printf("Draw!\n");
    break;
   }

解釋:當(dāng)用戶輸入坐標(biāo)在棋盤內(nèi)并且該位置尚未被落子時(shí),(user_x >= 1 && user_x <= 3) && (user_y >= 1 && user_y <= 3)&&\ chess[user_x-1][user_y-1]=='\0')將棋盤對應(yīng)坐標(biāo)元素改寫成“X”(chess[user_x - 1][user_y - 1] = 'X';),之后將格子占用數(shù)count+1.

2. 判斷勝平

為了判斷是否勝利,我們可以寫一個(gè)函數(shù),將棋盤現(xiàn)在的數(shù)據(jù)傳入,在里面逐行逐列判斷。

代碼:

/*判斷*/
char Judge(char chess[][COL])
{
 for (int i = 0; i < COL; i++){  //判斷行
  if (chess[i][0] == chess[i][1] && chess[i][1] == chess[i][2] && chess[i][2] != '\0')
  {
   return chess[i][0];
  }
 }
 for (int i = 0; i < COL; i++){  //判斷列
  if (chess[0][i] == chess[1][i] && chess[1][i] == chess[2][i] && chess[2][i] != '\0')
  {
   return chess[0][i];
  }
 }
 if (chess[0][0] == chess[1][1] && chess[1][1] == chess[2][2] && chess[2][2] != '\0')  
  {        //判斷對角線
   return chess[0][0];
  }
 if (chess[0][2] == chess[1][1] && chess[1][1] == chess[2][0] && chess[2][0] != '\0')
  {
   return chess[0][2];
  }
  return ' ';
}

此時(shí)是玩家落子之后,不會(huì)產(chǎn)生負(fù),所以不需要判斷是否輸了。檢查Judge()的返回值。當(dāng)玩家勝利時(shí)輸出勝利,游戲結(jié)束,當(dāng)平局時(shí)輸出平局,游戲結(jié)束

if (Judge(chess) == 'X'){  //判斷玩家贏
    ShowBroad(chess);
    printf("You Win! :)\n");
    break;
   }
   else if (count == 9){   //判斷平局
    ShowBroad(chess);
    printf("Draw!\n");
    break;
   }

3. 電腦落子

電腦是隨機(jī)落子的,于是需要給chess()傳入隨機(jī)的x和y,于是這里用到rand()

void computer(char chess[][COL])
{
 int x, y;
 while (1){
  x = rand() % (COL) + 0;
  y = rand() % (COL) + 0;
  if (chess[x][y] == '\0'){
   chess[x][y] = 'O';
   break;
  }
 }
 ShowBroad(chess);
}

這里要注意當(dāng)隨機(jī)的坐標(biāo)未被落子時(shí)才能使用,所以用死循環(huán)來查找一個(gè)合法的坐標(biāo),當(dāng)找到時(shí)電腦才能落子,之后跳出循環(huán),并刷新棋盤。

4. 判斷負(fù)

與上面一樣,我們調(diào)用Judge()函數(shù)來判斷,當(dāng)返回的是“O”時(shí)候,輸出信息,游戲結(jié)束。

if (Judge(chess) == 'O'){   //判斷電腦贏
    printf("You Lost!\n");
    break;
   }

最終游戲界面:

結(jié)束

至此,一個(gè)簡單的井字棋游戲就完成了,內(nèi)容簡陋,可以優(yōu)化的地方還有很多,各位可自行擴(kuò)展。由這個(gè)簡單的三子棋我們還能進(jìn)一步發(fā)展成五子棋,做出更多的內(nèi)容,先挖個(gè)五子棋的坑,以后來填。

main函數(shù)代碼:

int main()
{
 int a ,count =0;
 char chess[ROW][COL] = { '\0' };
 menu();           //顯示菜單
 printf("Please Enter Your Chose:>\n ");
 scanf("%d", &a);
 if (a != 1){ return 0; }
 ShowBroad(chess);
 srand((unsigned)time(NULL));
 while (1)
 {
  int user_x, user_y;
  printf("Please Enter:<x,y>\n");
  scanf("%d%d", &user_x, &user_y);   //玩家落子
  if ((user_x >= 1 && user_x <= 3) && (user_y >= 1 && user_y <= 3)&&\
   chess[user_x-1][user_y-1]=='\0'){  //輸入是否合法
   chess[user_x - 1][user_y - 1] = 'X';
   count++;
   if (Judge(chess) == 'X'){    //判斷玩家贏
    ShowBroad(chess);
    printf("You Win! :)\n");
    break;
   }
   else if (count == 9){     //判斷平局
    ShowBroad(chess);
    printf("Draw!\n");
    break;
   }
   computer(chess);      //電腦落子
   count++;
   if (Judge(chess) == 'O'){    //判斷電腦贏
    printf("You Lost!\n");
    break;
   }
  }
  else continue;
 }
 system("pause");
 return 0;
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 配置CLion管理Qt項(xiàng)目國際化支持的方法

    配置CLion管理Qt項(xiàng)目國際化支持的方法

    這篇文章主要介紹了配置CLion管理Qt項(xiàng)目國際化支持的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • OpenCV實(shí)現(xiàn)傾斜文字校正

    OpenCV實(shí)現(xiàn)傾斜文字校正

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)傾斜文字校正,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言詳解select函數(shù)的使用

    C語言詳解select函數(shù)的使用

    C語言中select函數(shù)的使用?一般用connect、accept、recv或recvfrom這類函數(shù),程序阻塞,直至該套接字上接受到數(shù)據(jù)后程序才能繼續(xù)運(yùn)行。但是使用select函數(shù)可以實(shí)現(xiàn)非阻塞方式的程序
    2022-05-05
  • MATLAB全網(wǎng)最全的colormap的使用教程詳解

    MATLAB全網(wǎng)最全的colormap的使用教程詳解

    眾所周知,MATLAB中的colormap只有少得可憐的幾種,有很多應(yīng)用在很特殊的圖形中的colormap幾乎都沒有,而每次寫代碼都要去找顏色的圖屬實(shí)太麻煩。所以本文將包全部集成了進(jìn)來,終于有了這套包含200個(gè)colormap的工具函數(shù),希望對大家有所幫助
    2023-02-02
  • C++ 詳細(xì)講解對象的構(gòu)造順序

    C++ 詳細(xì)講解對象的構(gòu)造順序

    對象的構(gòu)造往往和構(gòu)造函數(shù)會(huì)牽扯在一起,構(gòu)造函數(shù)的函數(shù)可能會(huì)由非常復(fù)雜的邏輯所組成,不同類的構(gòu)造函數(shù)的程序邏輯很可能是相互依賴的,當(dāng)這種相互依賴一旦成立,那么對象的構(gòu)造順序很可能導(dǎo)致難以調(diào)試的Bug出現(xiàn)
    2022-04-04
  • C++獲取文件大小數(shù)值的三種方式介紹

    C++獲取文件大小數(shù)值的三種方式介紹

    最近在做項(xiàng)目時(shí)經(jīng)常需要獲得文件的大小操作,雖然在網(wǎng)絡(luò)上已經(jīng)有許多篇博客介紹了,但是還是想總結(jié)出自己一篇,記錄一下自己在項(xiàng)目中是怎么獲得文件大小的
    2022-10-10
  • C/C++如何實(shí)現(xiàn)兩矩陣相乘之模擬法

    C/C++如何實(shí)現(xiàn)兩矩陣相乘之模擬法

    C++矩陣運(yùn)算矩陣運(yùn)算包括矩陣相加、相減、相乘、轉(zhuǎn)置、求逆矩陣等等,用計(jì)算機(jī)程序?qū)崿F(xiàn)矩陣運(yùn)算的方法算法很多,這篇文章主要給大家介紹了關(guān)于C/C++如何實(shí)現(xiàn)兩矩陣相乘之模擬法的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 深入探討linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開的文件數(shù)

    深入探討linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開的文件數(shù)

    本篇文章是對linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開的文件數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 離線安裝visual?studio2022+QT5.12的實(shí)現(xiàn)步驟

    離線安裝visual?studio2022+QT5.12的實(shí)現(xiàn)步驟

    近期有需求離線配置C++與QT環(huán)境,本文主要介紹了離線安裝visualstudio2022+QT5.12的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • C語言基于EasyX庫實(shí)現(xiàn)有顏色彈跳小球

    C語言基于EasyX庫實(shí)現(xiàn)有顏色彈跳小球

    這篇文章主要為大家詳細(xì)介紹了C語言基于EasyX庫實(shí)現(xiàn)有顏色彈跳小球,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論