最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言三子棋游戲的簡(jiǎn)單設(shè)計(jì)

 更新時(shí)間:2021年10月21日 17:13:23   作者:懂的都懂乀  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言三子棋游戲的簡(jiǎn)單設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語(yǔ)言三子棋游戲簡(jiǎn)單設(shè)計(jì)的具體代碼,供大家參考,具體內(nèi)容如下

題目思想:

用 3×3 的二維數(shù)組表示棋盤(pán)
每一個(gè)棋子的格子,也就是每個(gè)元素表示三種狀態(tài):分別是
1.未落子 ‘ '
2.玩家落子 ‘X'
3.電腦落子 ‘O'
玩家通過(guò)輸入數(shù)字作為落子位置的坐標(biāo)(輸入的行數(shù)與輸入的列數(shù))

直接上代碼解析

1.創(chuàng)建出棋盤(pán)

#define _CRT_SECURE_NO_WARNINGS
//利用宏定義行和列
#define MAX_ROW 3
#define MAX_COL 3
#include <stdio.h>
#include <stdlib.h>


//  將初始化行和列的 '0' 變?yōu)榭崭?' '
void init(char board[MAX_ROW][MAX_COL]) {
 //行初始化,將數(shù)組 0-2輸出為' '  
 for(int row = 0; row < MAX_ROW; row++) {
  //列初始化
  for (int col = 0; col < MAX_COL; col++) {
   board[row][col] = ' ';
  }
 }
}

//  打印棋盤(pán),定義printBoard,以二維數(shù)組的方式進(jìn)行循環(huán)打印
void printBoard(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   // 打印字符,使用 %c
   printf("%c", board[row][col]);
  }
  //每次打印完一行,進(jìn)行換行操作,變成3×3的數(shù)組形成的棋盤(pán)
  printf("\n");
 }
}
int main() {
 //  首先創(chuàng)建棋盤(pán)并初始化
 //  這里不要用board[3][3],防止后面 3 與 3 搞混,可以利用宏定義
 char board[MAX_ROW][MAX_COL] = { 0 };
 //  使用 init 函數(shù) 初始化二維數(shù)組{0}應(yīng)當(dāng)變成空格  ' '
 //  此處也可以將 init函數(shù)定義中的雙重 for 循環(huán)直接輸入
 //  但將二維數(shù)組初始化為 ' ',表示了一個(gè)固定功能的邏輯,比較適合用函數(shù)定義的方法完成
 init(board);
 //  使用while循環(huán),進(jìn)行輪流落子
 while (1) {
  //1.先打印棋盤(pán)內(nèi)容
  printBoard(board);
  //2.玩家落子
  //3.電腦落子
  //4.判定勝負(fù)
 }

 system("pause");
 return 0;
}

確實(shí)打印出來(lái)了,但是由于初始化將二維數(shù)組中的元素變?yōu)榱丝崭?‘ '
,所以輸出結(jié)果看不到。

2.修改棋盤(pán),使之打印出的是 3×3 的帶有方格的棋盤(pán)

void printBoard(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  //在打印每一行之前加入橫線
  printf("+--+--+--+\n");
  for (int col = 0; col < MAX_COL; col++) {
   // 打印字符,使用 %c
   // 每打印一列,在打印之前加入|
   printf("| %c", board[row][col]);
  }
  //打印之后加入|,形成 3 列。
  printf("|");
  //每次打印完一行,進(jìn)行換行操作,變成3×3的數(shù)組形成的縱線棋盤(pán)
  printf("\n");
 }//打印完所有行之后在加入橫線,形成橫線棋盤(pán)
 printf("+--+--+--+\n");
}

3.玩家落子

//  玩家落子
void playerMove(char board[MAX_ROW][MAX_COL]) {
 printf("輪到玩家落子!\n");
 //加入while循環(huán),保證用戶輸入錯(cuò)誤時(shí)返回重新輸入
 while (1) {
  printf("請(qǐng)輸入落子位置的坐標(biāo)(row col):");
  //添加屏幕輸入模塊,輸入行和列坐標(biāo)
  int row = 0;
  int col = 0;
  scanf("%d %d", &row, &col);
  //輸入完了之后,一定要驗(yàn)證輸入的內(nèi)容,防止輸入例如(10,20)超過(guò)棋盤(pán)坐標(biāo)
  if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
   printf("您輸入的坐標(biāo)有誤,請(qǐng)重新輸入!\n");
   continue;//重新輸入,繼續(xù)循環(huán)
  }
  // 當(dāng)前位置不為 ' ' ,說(shuō)明有子了,也需要重新輸入
  if (board[row][col] != ' ') {
   printf("當(dāng)前位置有子,無(wú)法落子\n");
   continue;
  } 
  //玩家落子為 X ,結(jié)束當(dāng)前循環(huán)
  board[row][col] = 'X';
  break;
 }
}

4.電腦落子

// 電腦落子
void computerMove(char board[MAX_ROW][MAX_COL]) {
 printf("輪到電腦落子!\n");
 while (1) {
  //電腦落子時(shí),產(chǎn)生隨機(jī)位置,用到隨機(jī)數(shù)種子,使隨機(jī)數(shù)范圍在棋盤(pán)坐標(biāo)以內(nèi)
  int row = rand() % MAX_ROW;
  int col = rand() % MAX_COL;
  if (board[row][col] != ' '){
   // 如果行列不是空格,說(shuō)明有子了,就隨機(jī)生成隨機(jī)數(shù)
   continue;
  }
  board[row][col] = 'O';
  break;
 }
}

這里使用了清屏操作,讓每次輸入完后進(jìn)行一次清屏,具體代碼在總體代碼里附上

5.判定勝負(fù)

//判斷和棋的函數(shù)
int isFull(char board[MAX_ROW][MAX_COL]) {
 //如果在棋盤(pán)中找不到 ' ' ,就說(shuō)明棋盤(pán)滿了,只要找到 ' ' 說(shuō)明沒(méi)滿
 //約定滿了返回1,沒(méi)滿返回0
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   if (board[row][col] == ' ') {
    //沒(méi)滿
    return 0;
   }
  }
 }return 1;
}

// 判定勝負(fù),由于要返回勝負(fù),使用char定義
// 如果是玩家贏返回 X ,電腦贏返回 O,平局返回 P,勝負(fù)未分返回 ' '
char checkwinner(char board[MAX_ROW][MAX_COL]) {
 //1.檢測(cè)所有行
 for (int row = 0; row < MAX_ROW; row++) {
  if (board[row][0] != ' ' &&
   board[row][0] == board[row][1]
   && board[row][0] == board[row][2]) {
   return board[row][0];
  }
 }
 //2.檢測(cè)所有列
 for (int col = 0; col < MAX_ROW; col++) {
 if (board[0][col] != ' ' &&
  board[0][col] == board[1][col]
  && board[0][col] == board[2][col]) {
  return board[0][col];
 }
}
 //3.檢測(cè)所有對(duì)角線
 if (board[0][0] != ' ' &&
  board[0][0] == board[1][1]
  && board[0][0] == board[2][2]) {
  return board[0][0];
 }
 if (board[2][0] != ' ' &&
  board[2][0] == board[1][1]
  && board[0][0] == board[0][2]) {
  return board[2][0];
 }
 // 判定和棋
 if (isFull(board)) {
  return 'p';
 }return ' ';

}

這個(gè)結(jié)果中很多人肯定看到了問(wèn)題,玩家贏的同時(shí)還在顯示電腦落子,怎么改?

6.注意還有一個(gè)問(wèn)題:

如圖,在主函數(shù)中先進(jìn)行玩家落子,后進(jìn)行電腦落子,在電腦落子之前玩家就贏了。修改程序如下:

int main() {
 //  首先創(chuàng)建棋盤(pán)并初始化
 //  這里不要用board[3][3],防止后面 3 與 3 搞混,可以利用宏定義
 char board[MAX_ROW][MAX_COL] = { 0 };
 //  使用 init 函數(shù) 初始化二維數(shù)組{0}應(yīng)當(dāng)變成空格  ' '
 //  此處也可以將 init函數(shù)定義中的雙重 for 循環(huán)直接輸入
 //  但將二維數(shù)組初始化為 ' ',表示了一個(gè)固定功能的邏輯,比較適合用函數(shù)定義的方法完成
 init(board);
 char winner = ' ';
 //  使用while循環(huán),進(jìn)行輪流落子
 while (1) {
  //1.先打印棋盤(pán)內(nèi)容
  printBoard(board);
  //2.玩家落子
  playerMove(board);
  winner = checkwinner(board);
  if (winner != ' ') {
   //勝負(fù)已分,結(jié)束循環(huán)
   break;
  }
  //3.電腦落子
  computerMove(board);
  //4.判定勝負(fù)
  winner = checkwinner(board);
  if (winner != ' ') {
   //勝負(fù)已分,結(jié)束循環(huán)
   break; 
  }
 }
 if (winner = 'X') {
  printf("恭喜你,獲勝了!\n");
 }
 else if (winner = 'O') {
  printf("很遺憾,你有點(diǎn)菜呀!\n");
 }
 else {
  printf("你和電腦五五開(kāi)!\n");
 }
 system("pause");
 return 0;
}

全部函數(shù)

#define _CRT_SECURE_NO_WARNINGS
//利用宏定義行和列
#define MAX_ROW 3
#define MAX_COL 3
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


//  將初始化行和列的 '0' 變?yōu)榭崭?' '
void init(char board[MAX_ROW][MAX_COL]) {
 //行初始化,將數(shù)組 0-2輸出為' '  
 for(int row = 0; row < MAX_ROW; row++) {
  //列初始化
  for (int col = 0; col < MAX_COL; col++) {
   board[row][col] = ' ';
  }
 }
 //設(shè)置隨機(jī)數(shù)種子,為電腦落子
 //只要程序啟動(dòng)時(shí),設(shè)置一次即可
 srand((unsigned int)time(0));
}

//  打印棋盤(pán),定義printBoard,以二維數(shù)組的方式進(jìn)行循環(huán)打印
void printBoard(char board[MAX_ROW][MAX_COL]) {
 //每次打印之前先清屏
 system("cls");
 for (int row = 0; row < MAX_ROW; row++) {
  //在打印每一行之前加入橫線
  printf("+--+--+--+\n");
  for (int col = 0; col < MAX_COL; col++) {
   // 打印字符,使用 %c
   // 每打印一列,在打印之前加入|
   printf("| %c", board[row][col]);
  }
  //打印之后加入|,形成 3 列。
  printf("|");
  //每次打印完一行,進(jìn)行換行操作,變成3×3的數(shù)組形成的縱線棋盤(pán)
  printf("\n");
 }//打印完所有行之后在加入橫線,形成橫線棋盤(pán)
 printf("+--+--+--+\n");
}

//  玩家落子
void playerMove(char board[MAX_ROW][MAX_COL]) {
 printf("輪到玩家落子!\n");
 //加入while循環(huán),保證用戶輸入錯(cuò)誤時(shí)返回重新輸入
 while (1) {
  printf("請(qǐng)輸入落子位置的坐標(biāo)(row col):");
  //添加屏幕輸入模塊,輸入行和列坐標(biāo)
  int row = 0;
  int col = 0;
  scanf("%d %d", &row, &col);
  //輸入完了之后,一定要驗(yàn)證輸入的內(nèi)容,防止輸入例如(10,20)超過(guò)棋盤(pán)坐標(biāo)
  if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
   printf("您輸入的坐標(biāo)有誤,請(qǐng)重新輸入!\n");
   continue;//重新輸入,繼續(xù)循環(huán)
  }
  // 當(dāng)前位置不為 ' ' ,說(shuō)明有子了,也需要重新輸入
  if (board[row][col] != ' ') {
   printf("當(dāng)前位置有子,無(wú)法落子\n");
   continue;
  } 
  //玩家落子為 X ,結(jié)束當(dāng)前循環(huán)
  board[row][col] = 'X';
  break;
 }
}

// 電腦落子
void computerMove(char board[MAX_ROW][MAX_COL]) {
 printf("輪到電腦落子!\n");
 while (1) {
  //電腦落子時(shí),產(chǎn)生隨機(jī)位置,用到隨機(jī)數(shù)種子,使隨機(jī)數(shù)范圍在棋盤(pán)坐標(biāo)以內(nèi)
  int row = rand() % MAX_ROW;
  int col = rand() % MAX_COL;
  if (board[row][col] != ' '){
   // 如果行列不是空格,說(shuō)明有子了,就隨機(jī)生成隨機(jī)數(shù)
   continue;
  }
  board[row][col] = 'O';
  break;
 }
}


//判斷和棋的函數(shù)
int isFull(char board[MAX_ROW][MAX_COL]) {
 //如果在棋盤(pán)中找不到 ' ' ,就說(shuō)明棋盤(pán)滿了,只要找到 ' ' 說(shuō)明沒(méi)滿
 //約定滿了返回1,沒(méi)滿返回0
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   if (board[row][col] == ' ') {
    //沒(méi)滿
    return 0;
   }
  }
 }return 1;
}

// 判定勝負(fù),由于要返回勝負(fù),使用char定義
// 如果是玩家贏返回 X ,電腦贏返回 O,平局返回 P,勝負(fù)未分返回 ' '
char checkwinner(char board[MAX_ROW][MAX_COL]) {
 //1.檢測(cè)所有行
 for (int row = 0; row < MAX_ROW; row++) {
  if (board[row][0] != ' ' 
   && board[row][0] == board[row][1]
   && board[row][0] == board[row][2]) {
   return board[row][0];
  }
 }
 //2.檢測(cè)所有列
 for (int col = 0; col < MAX_ROW; col++) {
 if (board[0][col] != ' ' 
  && board[0][col] == board[1][col]
  && board[0][col] == board[2][col]) {
  return board[0][col];
 }
}
 //3.檢測(cè)所有對(duì)角線
 if (board[0][0] != ' ' &&
  board[0][0] == board[1][1]
  && board[0][0] == board[2][2]) {
  return board[0][0];
 }
 if (board[2][0] != ' ' &&
  board[2][0] == board[1][1]
  && board[0][0] == board[0][2]) {
  return board[2][0];
 }
 // 判定和棋
 if (isFull(board)) {
  return 'p';
 }return ' ';

}

int main() {
 //  首先創(chuàng)建棋盤(pán)并初始化
 //  這里不要用board[3][3],防止后面 3 與 3 搞混,可以利用宏定義
 char board[MAX_ROW][MAX_COL] = { 0 };
 //  使用 init 函數(shù) 初始化二維數(shù)組{0}應(yīng)當(dāng)變成空格  ' '
 //  此處也可以將 init函數(shù)定義中的雙重 for 循環(huán)直接輸入
 //  但將二維數(shù)組初始化為 ' ',表示了一個(gè)固定功能的邏輯,比較適合用函數(shù)定義的方法完成
 init(board);
 char winner = ' ';
 //  使用while循環(huán),進(jìn)行輪流落子
 while (1) {
  //1.先打印棋盤(pán)內(nèi)容
  printBoard(board);
  //2.玩家落子
  playerMove(board);
  winner = checkwinner(board);
  if (winner != ' ') {
   //勝負(fù)已分,結(jié)束循環(huán)
   break;
  }
  //3.電腦落子
  computerMove(board);
  //4.判定勝負(fù)
  winner = checkwinner(board);
  if (winner != ' ') {
   //勝負(fù)已分,結(jié)束循環(huán)
   break; 
  }
 }
 if (winner = 'X') {
  printf("恭喜你,獲勝了!\n");
 }
 else if (winner = 'O') {
  printf("很遺憾,你有點(diǎn)菜呀!\n");
 }
 else {
  printf("你和電腦五五開(kāi)!\n");
 }
 system("pause");
 return 0;
}

結(jié)果如下

我們的三子棋棋盤(pán)小游戲就算結(jié)束啦!

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

相關(guān)文章

  • 冒泡排序的三種實(shí)現(xiàn)方法

    冒泡排序的三種實(shí)現(xiàn)方法

    本篇文章是對(duì)冒泡排序的三種實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下。希望對(duì)大家有所幫助
    2013-10-10
  • 深入學(xué)習(xí)C語(yǔ)言中memset()函數(shù)的用法

    深入學(xué)習(xí)C語(yǔ)言中memset()函數(shù)的用法

    這篇文章主要介紹了深入學(xué)習(xí)C語(yǔ)言中memset()函數(shù)的用法,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • C++?Protobuf的學(xué)習(xí)使用指南

    C++?Protobuf的學(xué)習(xí)使用指南

    protocol?buffers是一種語(yǔ)言無(wú)關(guān)、平臺(tái)無(wú)關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)的方法,它可用于(數(shù)據(jù))通信協(xié)議、數(shù)據(jù)存儲(chǔ)等,下面就來(lái)跟隨小編一起簡(jiǎn)單學(xué)習(xí)一下它的使用吧
    2023-07-07
  • C++中std::thread線程用法

    C++中std::thread線程用法

    本文主要介紹了C++中std::thread線程用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • C++中進(jìn)行txt文件讀入和寫(xiě)入的方法示例

    C++中進(jìn)行txt文件讀入和寫(xiě)入的方法示例

    這篇文章主要給大家介紹了C++中進(jìn)行txt文件讀入和寫(xiě)入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 詳解Qt使用QImage類實(shí)現(xiàn)圖像基本操作

    詳解Qt使用QImage類實(shí)現(xiàn)圖像基本操作

    這篇文章主要介紹了Qt如何利用QImage類實(shí)現(xiàn)對(duì)圖像的基本操作,包括圖像顯示、圖像縮放、圖像旋轉(zhuǎn)等,感興趣的小伙伴可以跟隨小編一起動(dòng)手嘗試一下
    2022-06-06
  • C++中this指針的用法及介紹

    C++中this指針的用法及介紹

    以下是對(duì)C++中this指針的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-08-08
  • C語(yǔ)言之實(shí)現(xiàn)單鏈表指定結(jié)點(diǎn)的插入方式

    C語(yǔ)言之實(shí)現(xiàn)單鏈表指定結(jié)點(diǎn)的插入方式

    這篇文章主要介紹了C語(yǔ)言之實(shí)現(xiàn)單鏈表指定結(jié)點(diǎn)的插入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 利用C/C++實(shí)現(xiàn)貪吃蛇游戲

    利用C/C++實(shí)現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了利用C/C++實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 基于C語(yǔ)言實(shí)現(xiàn)三子棋游戲的示例代碼

    基于C語(yǔ)言實(shí)現(xiàn)三子棋游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言數(shù)組實(shí)現(xiàn)簡(jiǎn)單的三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評(píng)論

鄱阳县| 阳新县| 襄垣县| 海城市| 广安市| 辽阳县| 长海县| 酉阳| 定西市| 乐都县| 孝义市| 宁国市| 襄垣县| 白城市| 台州市| 呈贡县| 汽车| 象州县| 大同市| 康平县| 新巴尔虎左旗| 巴里| 丁青县| 太康县| 阿勒泰市| 天祝| 丹寨县| 简阳市| 长顺县| 绥宁县| 龙山县| 伊通| 龙门县| 唐山市| 深泽县| 南漳县| 崇信县| 会泽县| 威宁| 浦城县| 云和县|