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

適合初學(xué)者練習(xí)的C語言實現(xiàn)三子棋小游戲

 更新時間:2021年10月19日 14:32:47   作者:小明bite  
今天這篇文章主要介紹給大家分享一個適合初學(xué)者練習(xí)的利用C語言寫三子棋小游戲,用簡單的C語言來實現(xiàn)小時候玩的三子棋游戲,下面是人機對戰(zhàn),當然這個代碼的電腦對手是人工智障而不是人工智能 詳細內(nèi)容就請跟小編一起來閱讀下面文章內(nèi)容吧

用簡單的C語言來實現(xiàn)小時候玩的三子棋游戲,下面是人機對戰(zhàn),當然這個代碼的電腦對手是人工智障而不是人工智能

 一、寫代碼前明確下棋時的步驟與順序

  • 1.創(chuàng)建一個3*3的棋盤.
  • 2.將上面創(chuàng)建的棋盤中每個格初始化成' '狀態(tài).
  • 3.打印出初始化完成的棋盤
  • 4.玩家落子
  • 5.電腦落子
  • 6.判斷勝負

寫代碼之前梳理好大概的思路,先寫出初步的主函數(shù)

int main() {
 char winner = ' ';
 //1.創(chuàng)建一個棋盤,并初始化.
 char board[MAX_ROW][MAX_COL] = { 0 };
 //2.init函數(shù)將棋盤每個格子初始化成' '.
 init(board);
 while (1) {
  //3.打印棋盤
  printBoard(board);
  //4.玩家落子
  playerMove(board);
  //5.判斷勝負
  winner = checkWinner(board);
  if (winner != ' ') {
   //勝負已分
   break;
  }
  //6.電腦落子
  computerMove(board);
  //7.判斷勝負
  winner = checkWinner(board);
  if (winner != ' ') {
   //勝負已分
   break;
  }
 }


在創(chuàng)建棋盤是char board[][]的[]中不要寫3,寫3在后面看代碼時不能明確分清3代表什么

因此建議定義宏

#define MAX_ROW  3
#define MAX_COL  3


這樣可以清楚的看出[]中的內(nèi)容代表什么,提高可讀性.

 二 根據(jù)初步的主函數(shù)完成想要的代碼

1.寫一個函數(shù)來初始化棋盤

//將棋盤初始化成' '
void init(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for(int col = 0; col < MAX_COL; col++) {
   board[row][col] = ' ';
  }
 }
 //設(shè)計隨機種子
 srand((unsigned int) time(0));
}
 

2.打印棋盤

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++) {
   printf("| %c ", board[row][col]);
  }
  printf("|");
  printf("\n");
 }
 printf("+---+---+---+\n");
}


system("cls")是讓每次打印棋盤前清除之前的棋盤這樣能讓界面清晰一些

(使用的是簡單的C來完成程序所以打印的棋盤也比較簡陋)

3.玩家落子

void playerMove(char board[MAX_ROW][MAX_COL]) {
 printf("請玩家落子!");
 while (1) {
  printf("請輸入落子的位置(row col):");
  int row = 0;
  int col = 0;
  scanf("%d %d", &row, &col);
  //輸入后驗證輸入內(nèi)容是否合法.
  if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
   printf("輸入有誤.請重新輸入!\n");
   continue;
  }
  if (board[row][col] != ' ') {
   printf("當前位置已有棋子,請重新輸入!\n");
   continue;
  }
  board[row][col] = 'x';
  break;
 }
}


以輸入坐標的方式來實現(xiàn)落子,并且要檢測玩家落子是否合理,以免輸入無效的坐標.

4.電腦落子

void computerMove(char board[MAX_ROW][MAX_COL]) {
 printf("輪到電腦落子");
 while (1) {
  int row = rand() % MAX_ROW;
  int col = rand() % MAX_COL;
  if (board[row][col] != ' ') {
   continue;
  }
  board[row][col] = 'o';
  break;
 }
}


電腦落子采用隨機數(shù)的方式來進行落子,因此需要設(shè)置隨機種子,將它寫在初始化棋盤函數(shù)內(nèi),每次初始化一次進行一次隨機種子的設(shè)置

由于是隨機落子因此實現(xiàn)的不是人工智能而是人工智障.

5.判斷勝負

int checkWinner(char board[MAX_ROW][MAX_COL]) {
 //檢查所有行
 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];
  }
 }
 //檢查所有列
 for (int col = 0; col < MAX_COL; col++) {
  if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) {
   return board[0][col];
  }
 }
 //檢查對角線
 if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') {
  return board[0][0];
 }
 if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ') {
  return board[0][2];
 }
 if (isFull(board)) {
  return 'q';
 }
 return ' ';
}

檢查每行 每列  對角線是否有三個相同的棋子從而判斷勝負.

int isFull(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   if (board[row][col] == ' ') {
    //棋盤沒滿
    return 0;
   }
  }
 }
 return 1;
}
 


檢查棋盤有沒有下滿(可能出現(xiàn)和棋)

 這就實現(xiàn)一個簡單的三子棋游戲

在主函數(shù)中玩家落子后應(yīng)也判斷一次勝負,以免出現(xiàn)玩家勝利電腦再落子的情況.

三、三子棋實現(xiàn)代碼

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
 
#define MAX_ROW  3
#define MAX_COL  3
 
//將棋盤初始化成' '
void init(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for(int col = 0; col < MAX_COL; col++) {
   board[row][col] = ' ';
  }
 }
 //設(shè)計隨機種子
 srand((unsigned int) time(0));
}
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++) {
   printf("| %c ", board[row][col]);
  }
  printf("|");
  printf("\n");
 }
 printf("+---+---+---+\n");
}
void playerMove(char board[MAX_ROW][MAX_COL]) {
 printf("請玩家落子!");
 while (1) {
  printf("請輸入落子的位置(row col):");
  int row = 0;
  int col = 0;
  scanf("%d %d", &row, &col);
  //輸入后驗證輸入內(nèi)容是否合法.
  if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
   printf("輸入有誤.請重新輸入!\n");
   continue;
  }
  if (board[row][col] != ' ') {
   printf("當前位置已有棋子,請重新輸入!\n");
   continue;
  }
  board[row][col] = 'x';
  break;
 }
}
void computerMove(char board[MAX_ROW][MAX_COL]) {
 printf("輪到電腦落子");
 while (1) {
  int row = rand() % MAX_ROW;
  int col = rand() % MAX_COL;
  if (board[row][col] != ' ') {
   continue;
  }
  board[row][col] = 'o';
  break;
 }
}
int isFull(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   if (board[row][col] == ' ') {
    //棋盤沒滿
    return 0;
   }
  }
 }
 return 1;
}
int checkWinner(char board[MAX_ROW][MAX_COL]) {
 //檢查所有行
 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];
  }
 }
 //檢查所有列
 for (int col = 0; col < MAX_COL; col++) {
  if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) {
   return board[0][col];
  }
 }
 //檢查對角線
 if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') {
  return board[0][0];
 }
 if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ') {
  return board[0][2];
 }
 if (isFull(board)) {
  return 'q';
 }
 return ' ';
}
int main() {
 char winner = ' ';
 //1.創(chuàng)建一個棋盤,并初始化.
 char board[MAX_ROW][MAX_COL] = { 0 };
 //2.init函數(shù)將棋盤每個格子初始化成' '.
 init(board);
 while (1) {
  //3.打印棋盤
  printBoard(board);
  //4.玩家落子
  playerMove(board);
  //5.判斷勝負
  winner = checkWinner(board);
  if (winner != ' ') {
   //勝負已分
   break;
  }
  //6.電腦落子
  computerMove(board);
  //7.判斷勝負
  winner = checkWinner(board);
  if (winner != ' ') {
   //勝負已分
   break;
  }
 }
 if (winner == 'x') {
  printf("恭喜你,你贏了!\n");
 }else if(winner=='o') {
  printf("你真菜連人工智障都玩不過\n");
 }else {
  printf("你和人工智障五五開\n");
 }
 return 0;
}

運行界面如下:

到此這篇關(guān)于初學(xué)者練習(xí)--C語言寫三子棋小游戲的文章就介紹到這了,更多相關(guān)C語言寫三子棋小游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt編寫地圖實現(xiàn)實時動態(tài)軌跡效果

    Qt編寫地圖實現(xiàn)實時動態(tài)軌跡效果

    實時動態(tài)軌跡主要是需要在地圖上動態(tài)顯示GPS的運動軌跡,也是編寫地圖時一個重要的功能。本文將利用Qt實現(xiàn)這一功能,需要的可以參考一下
    2022-02-02
  • C++實現(xiàn)棧的操作(push和pop)

    C++實現(xiàn)棧的操作(push和pop)

    這篇文章主要介紹了C++實現(xiàn)棧的操作(push和pop),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語言實現(xiàn)繪制貝塞爾曲線的函數(shù)

    C語言實現(xiàn)繪制貝塞爾曲線的函數(shù)

    貝塞爾曲線,又稱貝茲曲線或貝濟埃曲線,是應(yīng)用于二維圖形應(yīng)用程序的數(shù)學(xué)曲線。本文將利用C語言實現(xiàn)繪制貝塞爾曲線的函數(shù),需要的可以參考一下
    2022-12-12
  • C++ Boost Serialization庫超詳細獎金額

    C++ Boost Serialization庫超詳細獎金額

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-12-12
  • C語言中的long型究竟占4個字節(jié)還是8個字節(jié)(遇到的坑)

    C語言中的long型究竟占4個字節(jié)還是8個字節(jié)(遇到的坑)

    小編在復(fù)習(xí)C語言的時候踩到了不少坑,糾結(jié)long類型究竟占4個字節(jié)還是8個字節(jié)呢?好,今天通過本文給大家分享下我的詳細思路,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • gdb調(diào)試命令的使用及總結(jié)

    gdb調(diào)試命令的使用及總結(jié)

    gdb是一個在UNIX環(huán)境下的命令行調(diào)試工具。如果需要使用gdb調(diào)試程序,請在gcc時加上-g選項。下面的命令部分是簡化版,比如使用l代替list等等
    2013-05-05
  • C語言實現(xiàn)銀行管理系統(tǒng)

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

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)銀行管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C語言基礎(chǔ)解析之分支與循環(huán)語句

    C語言基礎(chǔ)解析之分支與循環(huán)語句

    C語言是一門結(jié)構(gòu)化的程序設(shè)計語言,當C語言用來描述生活中的事物時,會用到三種結(jié)構(gòu):順序結(jié)構(gòu)(不去贅述),選擇結(jié)構(gòu)(對應(yīng)分支語句),循環(huán)結(jié)構(gòu)(對應(yīng)循環(huán)語句),分支語句:分支語句分為兩種,一種是if語句,一種是switch語句
    2021-09-09
  • 淺談C++高并發(fā)場景下讀多寫少的優(yōu)化方案

    淺談C++高并發(fā)場景下讀多寫少的優(yōu)化方案

    本文主要介紹了淺談C++高并發(fā)場景下讀多寫少的優(yōu)化方案,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 使用C++遞歸求解跳臺階問題

    使用C++遞歸求解跳臺階問題

    這篇文章主要介紹了使用C++求解跳臺階問題的方法,通過遞歸算法來解決,不算難,文中給出了計算思路,需要的朋友可以參考下
    2016-02-02

最新評論

雅江县| 常州市| 麦盖提县| 十堰市| 宾阳县| 武隆县| 咸丰县| 茂名市| 宣城市| 土默特左旗| 宜昌市| 拜泉县| 吴桥县| 江口县| 永泰县| 甘德县| 阳谷县| 桃园市| 南召县| 沽源县| 临澧县| 静乐县| 潮州市| 河间市| 高唐县| 平安县| 连州市| 乐东| 武陟县| 宽城| 宿迁市| 鲁甸县| 汉沽区| 潜江市| 福贡县| 长汀县| 泸州市| 宣化县| 海林市| 自治县| 禄劝|