欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

用C語言實(shí)現(xiàn)三子棋小游戲

 更新時(shí)間:2021年06月16日 09:34:40   作者:技術(shù)新人王小明  
這篇文章主要為大家詳細(xì)介紹了用C語言實(shí)現(xiàn)三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語言實(shí)現(xiàn)三子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下

1. 規(guī)則介紹

三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對角線連起來,相對兩邊依次擺上三個(gè)雙方棋子,只要將自己的三個(gè)棋子走成一條線,對方就算輸了。但是,有很多時(shí)候會(huì)出現(xiàn)和棋的情況。

2. 編寫思路

2.1 選擇界面的編寫

提供選擇界面(設(shè)計(jì)者可根據(jù)自己的喜好設(shè)定棋盤的大??;輸入何種數(shù)字或者符號開始或者退出游戲也可由設(shè)計(jì)者自己確定數(shù)字)

static void Menu()
{
 printf("---------------------\n");
 printf("|  1: Play  2: Exit |\n");
 printf("---------------------\n");
 printf("Please Select# ");
}

2.2 棋盤的編寫

首先我們應(yīng)該實(shí)現(xiàn)三行三列的棋盤,為后續(xù)使用方便,所以我們在前面宏定義行(ROW 3)列(COL 3)都為3;設(shè)計(jì)者也可以根據(jù)自己的喜歡設(shè)置不同樣式的棋盤;

static void Showboard(char board[][COL], int row, int col)
{
 printf("   |  1  |  2  |  3  |\n");
 printf("---------------------\n");
 for (int i = 0; i < row; i++){
  printf("%d  |", i + 1);
  
  for (int j = 0; j < col; j++){
   printf("  %c  |", board[i][j]);
   
  }
  printf("\n---------------------\n");
 }
}

2.3 玩家落子

設(shè)定讓玩家以(x,y)坐標(biāo)的方式?jīng)Q定落子方位,在玩家輸入后,我們要設(shè)定判斷程序,判斷玩家輸入的坐標(biāo)是否合法(在我們設(shè)定的坐標(biāo)范圍內(nèi))、輸入的位置是否已經(jīng)落子;如果合法,且位置沒被占用,則在輸入的位置用符號代替玩家的棋子,這里用 ‘ X ' 表示玩家的棋子,為后續(xù)容易修改,在前面宏定義。

static void PlayerMove(char board[][COL], int row, int col)
{
 int x = 0;
 int y = 0;
 int quit = 0;
 while (!quit){
  printf("請輸入你的位置# ");
  scanf("%d %d", &x, &y);
  if (x<1 || x>3 || y<1 || y>3){
   printf("你輸入的坐標(biāo)有誤!\n");
   continue;
  }
  else if (board[x - 1][y - 1] != ' '){
   printf("該坐標(biāo)已被占用!\n");
   continue;
  }
  else {
   board[x - 1][y - 1] = P_COLOR;
   break;
  }
 }
}

2.4 三子連珠判定

設(shè)定三子連珠所有可能的情況,然后判定是否可以繼續(xù)進(jìn)行游戲(返回NEXT),或者和棋(返回DRAW);

static char Judge(char board[][COL], int row, int col)
{
 for (int i = 0; i < row; i++){
  if (board[i][0] == board[i][1] && \
   board[i][1] == board[i][2] && \
   board[i][0] != ' '){
   return board[i][0];
  }
 }
 for (int j = 0; j < col; j++){
  if (board[0][j] == board[1][j] && \
   board[1][j] == board[2][j] && \
   board[0][j] != ' '){
   return board[0][j];
  }
 }
 if (board[0][0] == board[1][1] && \
  board[1][1] == board[2][2] && \
  board[0][0] != ' '){
  return board[1][1];
 }
 if (board[0][2] == board[1][1] && \
  board[1][1] == board[2][0] && \
  board[1][1] != ' '){
  return board[1][1];
 }
 for (int i = 0; i < row; i++){
  for (int j = 0; j < col; j++){
   if (board[i][j] == ' '){
    return NEXT;
   }
  }
 }
 return DRAW;
}

2.5 電腦落子方式

電腦落子方式我們采用生成隨機(jī)數(shù)

static void ComputerMove(char board[][COL], int row, int col)
{
 while (1){
  int x = rand() % row;
  int y = rand() % col;
  if (board[x][y] == ' '){
   board[x][y] = C_COLOR;
   break;
  }
 }
}

2.6 游戲邏輯

生成隨機(jī)數(shù),以便電腦落子使用;
生成二維數(shù)組作為棋盤,傳入行和列,然后用memset初始化;
展示棋盤;
玩家落子;
判定落子是否合法;如果合法則輪到計(jì)算機(jī)落子;
判斷計(jì)算機(jī)落子是否合法;如果合法則繼續(xù)循環(huán);
設(shè)定判斷循環(huán)出口;

static void Game()
{
 srand((unsigned long)time(NULL));
 char board[ROW][COL];
 memset(board, ' ', sizeof(board));
 char result = 'x';
 do{
  Showboard(board, ROW, COL);
  PlayerMove(board, ROW, COL);
  result = Judge(board, ROW, COL);
  if (result != NEXT){
   break;
  }
  ComputerMove(board, ROW, COL);
  result = Judge(board, ROW, COL);
  if (result != NEXT){
   break;
  }
 } while (1);
    Showboard(board, ROW, COL);
 if (P_COLOR == result){
  printf("you win!\n");
 }
 else if (C_COLOR == result){
  printf("you loss!\n");
 }
 else{
  printf("draw!\n");
 }
}

2.7 設(shè)定游戲開始o(jì)r退出

首先展示菜單;輸入1開始游戲;輸入2則退出;將上述代碼整合后如下。

3. 整體代碼

#include<stdivo.h>
#include<time.h>
#include<Windows.h>

#pragma warning(disable:4996)

#define ROW 3
#define COL 3

#define P_COLOR 'X'
#define C_COLOR 'O'
#define NEXT 'N'
#define DRAW 'D'

static void Menu()
{
 printf("---------------------\n");
 printf("|  1: Play  2: Exit |\n");
 printf("---------------------\n");
 printf("Please Select# ");
}
static void Showboard(char board[][COL], int row, int col)
{
 printf("   |  1  |  2  |  3  |\n");
 printf("---------------------\n");
 for (int i = 0; i < row; i++){
  printf("%d  |", i + 1);
  
  for (int j = 0; j < col; j++){
   printf("  %c  |", board[i][j]);
   
  }
  printf("\n---------------------\n");
 }
}
static void PlayerMove(char board[][COL], int row, int col)
{
 int x = 0;
 int y = 0;
 int quit = 0;
 while (!quit){
  printf("請輸入你的位置# ");
  scanf("%d %d", &x, &y);
  if (x<1 || x>3 || y<1 || y>3){
   printf("你輸入的坐標(biāo)有誤!\n");
   continue;
  }
  else if (board[x - 1][y - 1] != ' '){
   printf("該坐標(biāo)已被占用!\n");
   continue;
  }
  else {
   board[x - 1][y - 1] = P_COLOR;
   break;
  }
 }
}
static char Judge(char board[][COL], int row, int col)
{
 for (int i = 0; i < row; i++){
  if (board[i][0] == board[i][1] && \
   board[i][1] == board[i][2] && \
   board[i][0] != ' '){
   return board[i][0];
  }
 }
 for (int j = 0; j < col; j++){
  if (board[0][j] == board[1][j] && \
   board[1][j] == board[2][j] && \
   board[0][j] != ' '){
   return board[0][j];
  }
 }
 if (board[0][0] == board[1][1] && \
  board[1][1] == board[2][2] && \
  board[0][0] != ' '){
  return board[1][1];
 }
 if (board[0][2] == board[1][1] && \
  board[1][1] == board[2][0] && \
  board[1][1] != ' '){
  return board[1][1];
 }
 for (int i = 0; i < row; i++){
  for (int j = 0; j < col; j++){
   if (board[i][j] == ' '){
    return NEXT;
   }
  }
 }
 return DRAW;
}
static void ComputerMove(char board[][COL], int row, int col)
{
 while (1){
  int x = rand() % row;
  int y = rand() % col;
  if (board[x][y] == ' '){
   board[x][y] = C_COLOR;
   break;
  }
 }
}
static void Game()
{
 srand((unsigned long)time(NULL));
 char board[ROW][COL];
 memset(board, ' ', sizeof(board));
 char result = 'x';
 do{
  Showboard(board, ROW, COL);
  PlayerMove(board, ROW, COL);
  result = Judge(board, ROW, COL);
  if (result != NEXT){
   break;
  }
  ComputerMove(board, ROW, COL);
  result = Judge(board, ROW, COL);
  if (result != NEXT){
   break;
  }
 } while (1);
    Showboard(board, ROW, COL);
 if (P_COLOR == result){
  printf("you win!\n");
 }
 else if (C_COLOR == result){
  printf("you loss!\n");
 }
 else{
  printf("draw!\n");
 }
}
int main()
{
 int quit = 0;
 int select = 0;
 while (!quit){
  Menu();
  scanf("%d", &select);
  switch (select){
  case 1:
   Game();
   printf("Play Again?\n");
   break;
  case 2:
   quit = 1;
   break;
  default:
   printf("\n");
   break;
  }
 }
 printf("ByeBye!\n");
 system("pause");
 return 0;
}

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

相關(guān)文章

  • C語言使用四種方法初始化結(jié)構(gòu)體

    C語言使用四種方法初始化結(jié)構(gòu)體

    這篇文章說明了什么是結(jié)構(gòu)體,介紹了結(jié)構(gòu)體的概念和使用優(yōu)點(diǎn),在C語言中如何使用和初始化結(jié)構(gòu)體方法,通過詳細(xì)的代碼展開進(jìn)行說明,希望該篇文章對你有所幫助
    2021-06-06
  • C語言實(shí)現(xiàn)猜數(shù)游戲

    C語言實(shí)現(xiàn)猜數(shù)游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)猜數(shù)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++多線程之帶返回值的線程處理函數(shù)解讀

    C++多線程之帶返回值的線程處理函數(shù)解讀

    這篇文章主要介紹了C++多線程之帶返回值的線程處理函數(shù)解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++項(xiàng)目實(shí)戰(zhàn)之makefile使用

    C++項(xiàng)目實(shí)戰(zhàn)之makefile使用

    這篇文章主要介紹了C++項(xiàng)目實(shí)戰(zhàn)之makefile使用,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • C語言中回調(diào)函數(shù)的使用詳情

    C語言中回調(diào)函數(shù)的使用詳情

    這篇文章主要介紹了C語言中回調(diào)函數(shù)的使用詳情,閱讀下文我們將學(xué)習(xí)到架構(gòu)的核心理念和需、回調(diào)函數(shù)的作用、回調(diào)函數(shù)的程序編寫等內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03
  • VS2022+libtorch+Cuda11.3安裝測試教程詳解(調(diào)用cuda)

    VS2022+libtorch+Cuda11.3安裝測試教程詳解(調(diào)用cuda)

    這篇文章主要介紹了VS2022+libtorch+Cuda11.3安裝測試(調(diào)用cuda),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C++空類詳解

    C++空類詳解

    以下是對C++中的空類進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下
    2013-09-09
  • 解決C++中事件不響應(yīng)的方法詳解

    解決C++中事件不響應(yīng)的方法詳解

    本篇文章是對C++事件不響應(yīng)的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 使用?Visual?Studio?2022?開發(fā)?Linux?C++?應(yīng)用程序的過程詳解

    使用?Visual?Studio?2022?開發(fā)?Linux?C++?應(yīng)用程序的過程詳解

    Visual?Studio?2022?引入了用于?Linux?C++?開發(fā)的本機(jī)?WSL2?工具集,可以構(gòu)建和調(diào)試?Linux?C++?代碼,并提供了非常好的?Linux?文件系統(tǒng)性能、GUI?支持和完整的系統(tǒng)調(diào)用兼容性,這篇文章主要介紹了使用Visual?Studio?2022?開發(fā)?Linux?C++?應(yīng)用程序,需要的朋友可以參考下
    2021-11-11
  • VC++ loadlibrary()加載三方dll失敗, 返回錯(cuò)誤碼:126的解決方法

    VC++ loadlibrary()加載三方dll失敗, 返回錯(cuò)誤碼:126的解決方法

    今天在編寫VC++ loadlibrary()加載三方dll是總是失敗,并且返回錯(cuò)誤碼:126,這里就為大家分享一下具體的解決方法
    2021-03-03

最新評論