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

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

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

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

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

//初始化棋盤
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));
}
//打印棋盤
void print(char board[max_row][max_col]) {
 system("cls");//每次打印之前清除掉上一次的結果.
 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.進行玩家落子,同樣是使用數(shù)組操作,讓玩家輸入相對應的坐標,在二維數(shù)組的該位置打印'x'來表示玩家下的棋子

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

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

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

4.判斷勝負,當玩家落子結束,或者電腦落子結束后,判斷是否存在某行或某列或者對角線有相同的元素,如果有則直接判定結果,如果沒有則輪到下家落子

char check(char board[max_row][max_col]) {
 //檢測所有行是否相等
 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];
  }
 }
 //檢測所有列是否相等
 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[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';       //棋盤未滿
}
//判斷棋盤是否棋子已滿,如果滿了返回1,未滿返回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ù)中調用以上函數(shù),進行操作:

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

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

完整代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.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] =' ';
  }
 }
 srand((unsigned int)time(0));
}
//打印棋盤
void print(char board[max_row][max_col]) {
 system("cls");//每次打印之前清除掉上一次的結果.
 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("請輸入想要落子的坐標: ");
  scanf("%d %d", &a, &b);
  //判定玩家落子坐標是否在有效范圍內
  if (a < 0 || b < 0 || a >= max_row || b >= max_col) {   
   printf("輸入坐標有誤請重新輸入!\n");                 
   continue;
  }
  //判定落子處是否已經存在了棋子
  if (board[a][b] != ' ') {                                
   printf("此處已被落子無法再落子,請重新輸入!\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; //產生0到2的隨機數(shù)
  int b = rand() % max_col;
  if (board[a][b] != ' ') { //判斷所下位置是否已經有子
   continue;
  }
  board[a][b] = 'o';
  break;
 }
// 
}
//
char check(char board[max_row][max_col]) {
 //檢測所有行是否相等
 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];
  }
 }
 //檢測所有列是否相等
 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[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';
}
//判斷棋盤是否棋子已滿,如果滿了返回1,未滿返回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); //將棋盤中元素初始化為空格
 while (1) {
  print(board);  //打印棋盤
  play(board);   //玩家落子
  winner = check(board);  //判斷勝負
  if (winner != 'a') {   
   break;
  }
  computer(board);      //電腦落子
  winner = check(board);  //判斷勝負
  if (winner != 'a') {
   break;
  }
 }
 
  if (winner == 'x') {
   print(board);
   printf("你贏了!");
  }
  else if (winner == 'o') {
   print(board);
   printf("你輸了!");
  }
  else if (winner == 'q') {
   print(board);
   printf("和棋!");
  }
 return 0;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 有關C++中類類型轉換操作符總結(必看篇)

    有關C++中類類型轉換操作符總結(必看篇)

    下面小編就為大家?guī)硪黄嘘PC++中類類型轉換操作符總結(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C++中線程池ThreadPool源碼解析

    C++中線程池ThreadPool源碼解析

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

    C語言清楚了解指針的使用

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

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

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

    簡單的漢諾塔問題解法代碼

    漢諾塔本是C語言開門就學的東西,簡單的漢諾塔問題解法代碼
    2013-03-03
  • 深入理解C++中的vector類的用法及特性

    深入理解C++中的vector類的用法及特性

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

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

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

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

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

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

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

    C語言實現(xiàn)2048小游戲

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

最新評論

托克逊县| 通州区| 永春县| 确山县| 临夏市| 和硕县| 庄浪县| 湟中县| 临夏市| 阳春市| 锡林浩特市| 保山市| 孟州市| 大关县| 壶关县| 阳春市| 若尔盖县| 沾化县| 元江| 安达市| 柯坪县| 安达市| 南澳县| 富锦市| 平武县| 兴宁市| 道真| 巴彦淖尔市| 新余市| 新蔡县| 汕尾市| 永嘉县| 永修县| 乌拉特前旗| 英德市| 东平县| 云霄县| 丰台区| 美姑县| 乐安县| 嘉峪关市|