亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于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");//每次打印之前清除掉上一次的結(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.進行玩家落子,同樣是使用數(shù)組操作,讓玩家輸入相對應(yīng)的坐標,在二維數(shù)組的該位置打印'x'來表示玩家下的棋子

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

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

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

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

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ù)中調(diào)用以上函數(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)直接打印最終結(jié)果.

完整代碼如下:

#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");//每次打印之前清除掉上一次的結(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("請輸入想要落子的坐標: ");
  scanf("%d %d", &a, &b);
  //判定玩家落子坐標是否在有效范圍內(nèi)
  if (a < 0 || b < 0 || a >= max_row || b >= max_col) {   
   printf("輸入坐標有誤請重新輸入!\n");                 
   continue;
  }
  //判定落子處是否已經(jīng)存在了棋子
  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; //產(chǎn)生0到2的隨機數(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]) {
 //檢測所有行是否相等
 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;
}

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

相關(guān)文章

  • delete[] p->elems和free(p->elems)區(qū)別介紹

    delete[] p->elems和free(p->elems)區(qū)別介紹

    delete[]和free()都是釋放內(nèi)存的函數(shù),但它們具有不同的使用方法和適用情況,這篇文章主要介紹了delete[] p->elems和free(p->elems)有什么區(qū)別,需要的朋友可以參考下
    2023-04-04
  • C++11關(guān)于auto關(guān)鍵字的使用示例

    C++11關(guān)于auto關(guān)鍵字的使用示例

    今天小編就為大家分享一篇關(guān)于C++11關(guān)于auto關(guān)鍵字的使用示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 詳解C語言讀取文件求某一列的平均值

    詳解C語言讀取文件求某一列的平均值

    本文粗淺比較了C語言中常用的幾種讀取文件的函數(shù)的效率,并給出了幾段求取某列平均值的代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多度進步
    2022-02-02
  • 聊一聊C++虛函數(shù)表的問題

    聊一聊C++虛函數(shù)表的問題

    C++是面向?qū)ο蟮恼Z言(與C語言主要區(qū)別),所以C++也擁有多態(tài)的特性。下面通過代碼看下C++虛函數(shù)表的問題,感興趣的朋友一起看看吧
    2021-10-10
  • C++虛函數(shù)表的原理與使用解析

    C++虛函數(shù)表的原理與使用解析

    對C++?了解的人都應(yīng)該知道虛函數(shù)(Virtual?Function)是通過一張?zhí)摵瘮?shù)表(Virtual?Table)來實現(xiàn)的。簡稱為V-Table。本文就將詳細講講虛函數(shù)表的原理與使用,需要的可以參考一下
    2022-04-04
  • C++實現(xiàn)連連看游戲核心代碼

    C++實現(xiàn)連連看游戲核心代碼

    這篇文章主要為大家詳細介紹了C++實現(xiàn)連連看游戲核心代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 詳解C++編程中的重載流插入運算符和流提取運算符

    詳解C++編程中的重載流插入運算符和流提取運算符

    這篇文章主要介紹了詳解C++編程中的重載流插入運算符和流提取運算符,是C語言入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C/C++ 中堆和棧及靜態(tài)數(shù)據(jù)區(qū)詳解

    C/C++ 中堆和棧及靜態(tài)數(shù)據(jù)區(qū)詳解

    這篇文章主要介紹了C/C++ 中堆和棧及靜態(tài)數(shù)據(jù)區(qū)詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 代碼講解C++繼承和派生

    代碼講解C++繼承和派生

    在本文中我們通過實例代碼給大家講解下C++繼承和派生相關(guān)知識點,需要的朋友們學習下。
    2019-02-02
  • C語言實現(xiàn)高精度減法

    C語言實現(xiàn)高精度減法

    高精度的本質(zhì)是將數(shù)字以字符串的形式讀入,然后將每一位分別存放入int數(shù)組中,通過模擬每一位的運算過程,來實現(xiàn)最終的運算效果,下面我們就來看看C語言如何實現(xiàn)高精度減法吧
    2023-11-11

最新評論