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

基于C語(yǔ)言實(shí)現(xiàn)井字棋游戲

 更新時(shí)間:2021年10月29日 15:20:06   作者:風(fēng)起十三城  
這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

井字棋游戲要求在3乘3棋盤(pán)上,每行都相同或者每列都相同再或者對(duì)角線(xiàn)相同,則勝出.因此我們可以使用一個(gè)二維數(shù)組來(lái)表示棋盤(pán),判斷勝負(fù)只需要判斷數(shù)組元素是否相同即可.具體我們可以分為以下幾步來(lái)做:

1.創(chuàng)建維數(shù)組并進(jìn)行初始化,如果僅僅是一個(gè)二維數(shù)組來(lái)表示棋盤(pán),看起來(lái)不是很清楚,因此我們可以對(duì)棋盤(pán)邊框用符號(hào)打印出來(lái)進(jìn)行優(yōu)化一下:

//初始化棋盤(pán)
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] =' ';
  }
 }
 srand((unsigned int)time(0));
}
//打印棋盤(pán)
void print(char board[max_row][max_col]) {
 system("cls");//每次打印之前清除掉上一次的結(jié)果.
 for (int a = 0; a < max_col; a++) {
  printf("+---+---+---+\n");
  for (int b = 0; b < max_row; b++) {
   printf("| %c ", board[a][b]);
  }
  printf("| \n");
 }
 printf("+---+---+---+\n");
}

2.進(jìn)行玩家落子,同樣是使用數(shù)組操作,讓玩家輸入相對(duì)應(yīng)的坐標(biāo),在二維數(shù)組的該位置打印'x'來(lái)表示玩家下的棋子

void play(char board[max_row][max_col]) {
 printf("玩家落子階段!\n");
 int a;
 int b;
 while (1) {
  printf("請(qǐng)輸入想要落子的坐標(biāo): ");
  scanf("%d %d", &a, &b);
  //判定玩家落子坐標(biāo)是否在有效范圍內(nèi)
  if (a < 0 || b < 0 || a >= max_row || b >= max_col) {   
   printf("輸入坐標(biāo)有誤請(qǐng)重新輸入!\n");                 
   continue;
  }
  //判定落子處是否已經(jīng)存在了棋子
  if (board[b][a] != ' ') {                                
   printf("此處已被落子無(wú)法再落子,請(qǐng)重新輸入!\n");
   continue;
  }
  board[b][a] = 'x';       //用'x'表示玩家落子
  break;
 }
}

3.玩家落子結(jié)束后讓電腦在二維數(shù)組中隨機(jī)落子,使用rand函數(shù)產(chǎn)生0到2的隨機(jī)數(shù)進(jìn)行賦值操作,進(jìn)而實(shí)現(xiàn)電腦隨機(jī)落子

void computer(char board[max_row][max_col]) {
 printf("電腦落子階段!\n");
 while (1) {
  int a = rand() % max_row; //產(chǎn)生0到2的隨機(jī)數(shù)
  int b = rand() % max_col;
  if (board[a][b] != ' ') { //判斷所下位置是否已經(jīng)有子
   continue;
  }
  board[a][b] = 'o';
  break;
 }

4.判斷勝負(fù),當(dāng)玩家落子結(jié)束,或者電腦落子結(jié)束后,判斷是否存在某行或某列或者對(duì)角線(xiàn)有相同的元素,如果有則直接判定結(jié)果,如果沒(méi)有則輪到下家落子

char check(char board[max_row][max_col]) {
 //檢測(cè)所有行是否相等
 for (int cow = 0; cow < max_row; cow++) {
  if (board[cow][0] != ' ' && board[cow][0] == board[cow][1] && board[cow][0]==board[cow][2] ) {
   return board[cow][0];
  }
 }
 //檢測(cè)所有列是否相等
 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];
  }
 }
 //檢測(cè)對(duì)角線(xiàn)是否相等
 if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[0][0] == board[2][2]) {
  return board[0][0];
 }
 if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[0][2] == board[2][0]) {
  return board[0][2];
 }
 if (pingju(board)) {
  return 'q';   //棋子已滿(mǎn)和棋
 }
 return 'a';       //棋盤(pán)未滿(mǎn)
}
//判斷棋盤(pán)是否棋子已滿(mǎn),如果滿(mǎn)了返回1,未滿(mǎn)返回0.
int pingju(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;
}

5.在主函數(shù)中調(diào)用以上函數(shù),進(jìn)行操作:

int main() {
 char board[max_row][max_col] = {0};//數(shù)組初始化為0
 char winner = 'n';
 init(board); //將棋盤(pán)中元素初始化為空格
 while (1) {
  print(board);  //打印棋盤(pán)
  play(board);   //玩家落子
  winner = check(board);  //判斷勝負(fù)
  if (winner != 'a') {   
   break;
  }
  computer(board);      //電腦落子
  winner = check(board);  //判斷勝負(fù)
  if (winner != 'a') {
   break;
  }
 }
 
  if (winner == 'x') {
   print(board);
   printf("你贏(yíng)了!");
  }
  else if (winner == 'o') {
   print(board);
   printf("你輸了!");
  }
  else if (winner == 'q') {
   print(board);
   printf("和棋!");
  }
 return 0;

在主函數(shù)中利用while循環(huán)來(lái)實(shí)現(xiàn)玩家與電腦的輪流落子,如果當(dāng)一方落子之后勝負(fù)已出,則跳出循環(huán)直接打印最終結(jié)果.

完整代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define max_row 3
#define max_col 3
//初始化棋盤(pán)
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] =' ';
  }
 }
 srand((unsigned int)time(0));
}
//打印棋盤(pán)
void print(char board[max_row][max_col]) {
 system("cls");//每次打印之前清除掉上一次的結(jié)果.
 for (int a = 0; a < max_col; a++) {
  printf("+---+---+---+\n");
  for (int b = 0; b < max_row; b++) {
   printf("| %c ", board[a][b]);
  }
  printf("| \n");
 }
 printf("+---+---+---+\n");
}
 
//玩家落子
void play(char board[max_row][max_col]) {
 printf("玩家落子階段!\n");
 int a;
 int b;
 while (1) {
  printf("請(qǐng)輸入想要落子的坐標(biāo): ");
  scanf("%d %d", &a, &b);
  //判定玩家落子坐標(biāo)是否在有效范圍內(nèi)
  if (a < 0 || b < 0 || a >= max_row || b >= max_col) {   
   printf("輸入坐標(biāo)有誤請(qǐng)重新輸入!\n");                 
   continue;
  }
  //判定落子處是否已經(jīng)存在了棋子
  if (board[a][b] != ' ') {                                
   printf("此處已被落子無(wú)法再落子,請(qǐng)重新輸入!\n");
   continue;
  }
  board[a][b] = 'x';       //用'x'表示玩家落子
  break;
 }
}
//
void computer(char board[max_row][max_col]) {
 printf("電腦落子階段!\n");
 while (1) {
  int a = rand() % max_row; //產(chǎn)生0到2的隨機(jī)數(shù)
  int b = rand() % max_col;
  if (board[a][b] != ' ') { //判斷所下位置是否已經(jīng)有子
   continue;
  }
  board[a][b] = 'o';
  break;
 }
// 
}
//
char check(char board[max_row][max_col]) {
 //檢測(cè)所有行是否相等
 for (int cow = 0; cow < max_row; cow++) {
  if (board[cow][0] != ' ' && board[cow][0] == board[cow][1] && board[cow][0]==board[cow][2] ) {
   return board[cow][0];
  }
 }
 //檢測(cè)所有列是否相等
 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];
  }
 }
 //檢測(cè)對(duì)角線(xiàn)是否相等
 if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[0][0] == board[2][2]) {
  return board[0][0];
 }
 if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[0][2] == board[2][0]) {
  return board[0][2];
 }
 if (pingju(board)) {
  return 'q';
 }
 return 'a';
}
//判斷棋盤(pán)是否棋子已滿(mǎn),如果滿(mǎn)了返回1,未滿(mǎn)返回0.
int pingju(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 main() {
 char board[max_row][max_col] = {0};//數(shù)組初始化為0
 char winner = 'n';
 init(board); //將棋盤(pán)中元素初始化為空格
 while (1) {
  print(board);  //打印棋盤(pán)
  play(board);   //玩家落子
  winner = check(board);  //判斷勝負(fù)
  if (winner != 'a') {   
   break;
  }
  computer(board);      //電腦落子
  winner = check(board);  //判斷勝負(fù)
  if (winner != 'a') {
   break;
  }
 }
 
  if (winner == 'x') {
   print(board);
   printf("你贏(yíng)了!");
  }
  else if (winner == 'o') {
   print(board);
   printf("你輸了!");
  }
  else if (winner == 'q') {
   print(board);
   printf("和棋!");
  }
 return 0;
}

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

相關(guān)文章

  • 有關(guān)C++中類(lèi)類(lèi)型轉(zhuǎn)換操作符總結(jié)(必看篇)

    有關(guān)C++中類(lèi)類(lèi)型轉(zhuǎn)換操作符總結(jié)(必看篇)

    下面小編就為大家?guī)?lái)一篇有關(guān)C++中類(lèi)類(lèi)型轉(zhuǎn)換操作符總結(jié)(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • C++中線(xiàn)程池ThreadPool源碼解析

    C++中線(xiàn)程池ThreadPool源碼解析

    線(xiàn)程池(threadpool)作為五大池之一(內(nèi)存池、連接池、線(xiàn)程池、進(jìn)程池、協(xié)程池),線(xiàn)程池的應(yīng)用非常廣泛,不管事客戶(hù)端程序還是后臺(tái)服務(wù)端,都是提高業(yè)務(wù)處理能力的必備模塊
    2022-09-09
  • C語(yǔ)言清楚了解指針的使用

    C語(yǔ)言清楚了解指針的使用

    C語(yǔ)言這門(mén)課程在計(jì)算機(jī)的基礎(chǔ)教學(xué)中一直占有比較重要的地位,然而要想突破C語(yǔ)言的學(xué)習(xí),對(duì)指針的掌握是非常重要的,本文將具體針對(duì)指針的基礎(chǔ)做詳盡的介紹
    2022-06-06
  • 基于Matlab實(shí)現(xiàn)抖音小游戲蘋(píng)果蛇

    基于Matlab實(shí)現(xiàn)抖音小游戲蘋(píng)果蛇

    最近抖音上蘋(píng)果蛇小游戲大火,為了證明MATLAB無(wú)所不能,咋能不跟風(fēng)做一個(gè)?文中詳細(xì)講解了游戲的實(shí)現(xiàn)步驟,感興趣的小伙伴可以嘗試一下
    2022-06-06
  • 簡(jiǎn)單的漢諾塔問(wèn)題解法代碼

    簡(jiǎn)單的漢諾塔問(wèn)題解法代碼

    漢諾塔本是C語(yǔ)言開(kāi)門(mén)就學(xué)的東西,簡(jiǎn)單的漢諾塔問(wèn)題解法代碼
    2013-03-03
  • 深入理解C++中的vector類(lèi)的用法及特性

    深入理解C++中的vector類(lèi)的用法及特性

    vector直接翻譯過(guò)來(lái)為向量,在C++中為封裝動(dòng)態(tài)數(shù)組的容器,且有序,需要的朋友可以參考下
    2016-05-05
  • C++貪心算法實(shí)現(xiàn)馬踏棋盤(pán)

    C++貪心算法實(shí)現(xiàn)馬踏棋盤(pán)

    這篇文章主要為大家詳細(xì)介紹了C++貪心算法實(shí)現(xiàn)馬踏棋盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 深入剖析C++中的struct結(jié)構(gòu)體字節(jié)對(duì)齊

    深入剖析C++中的struct結(jié)構(gòu)體字節(jié)對(duì)齊

    要求數(shù)據(jù)內(nèi)存的起始地址的值是某個(gè)數(shù)k的倍數(shù),這就是所謂的內(nèi)存對(duì)齊,本文就來(lái)深入剖析C++中的struct結(jié)構(gòu)體字節(jié)對(duì)齊,需要的朋友可以參考下
    2016-05-05
  • C++ 純虛函數(shù)詳解

    C++ 純虛函數(shù)詳解

    本文主要介紹了C++ 純虛函數(shù)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C語(yǔ)言實(shí)現(xiàn)2048小游戲

    C語(yǔ)言實(shí)現(xiàn)2048小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)2048小游戲,注釋清晰,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評(píng)論

左权县| 当涂县| 吴江市| 子长县| 沾化县| 赤水市| 临漳县| 肥西县| 囊谦县| 静安区| 夏津县| 武胜县| 磐石市| 余江县| 荥阳市| 大方县| 廊坊市| 太仓市| 天镇县| 丹东市| 休宁县| 民和| 绥芬河市| 凌云县| 台江县| 吐鲁番市| 中超| 新绛县| 黄冈市| 永丰县| 红桥区| 云龙县| 辰溪县| 玉山县| 土默特右旗| 通州市| 策勒县| 红河县| 灵璧县| 满洲里市| 久治县|