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

C語(yǔ)言版三子棋游戲

 更新時(shí)間:2021年08月01日 10:52:32   作者:LUYAO_LY  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言版三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

很多人從小都玩過(guò)三子棋,相信很多人都對(duì)這個(gè)游戲的實(shí)現(xiàn)有所疑問(wèn)。那么今天我們就用C語(yǔ)言自己來(lái)實(shí)現(xiàn)一下。

首先 如流程圖所示:

說(shuō)明一下:首先我們以輸入1/0,來(lái)判斷是否進(jìn)入游戲。當(dāng)輸入為1時(shí),進(jìn)入游戲;當(dāng)輸入為0時(shí),退出游戲;當(dāng)輸入為其他值時(shí),我們提示重新輸入。所以我們這里用switch實(shí)現(xiàn)。

我們回想棋盤,很像一個(gè)二維數(shù)組,所以我們接下里的數(shù)棋盤設(shè)計(jì)以及向棋盤里賦值都將使用二維數(shù)組。為了使得我們的擴(kuò)展性變強(qiáng),我們這里使用了,來(lái)定義行和列的值。

為了將來(lái)的判段,我們將棋盤里所以的值都賦值為' ',即棋盤的初始化,這里我們用IntBoard()函數(shù)實(shí)現(xiàn)。接下里我們將實(shí)現(xiàn)棋盤。

我們觀察可以想象,第一行放數(shù)據(jù),第二行則為分界線,第三行放數(shù)據(jù),第四行為分界線,第五行放數(shù)據(jù),第六行我們將其不打印。同理可以設(shè)計(jì)出列,我們由DisplayBoard()函數(shù)實(shí)現(xiàn)。

接下來(lái)為下棋環(huán)節(jié),這是一個(gè)循環(huán)過(guò)程,我們將使用while()循環(huán)來(lái)實(shí)現(xiàn),由判斷輸贏的IsWin()函數(shù)來(lái)控制 while()循環(huán)的繼續(xù)和結(jié)束 。

玩家下棋過(guò)程中,由鍵盤輸入坐標(biāo),輸入之后我們得首先判斷輸入的坐標(biāo)是否超過(guò)了棋盤的范圍,如果合法,其次判斷輸入坐標(biāo)處是否為空,若為空則可以落子,否之打印提示語(yǔ)句并重新輸入,若不合法,則提示并重新輸入。

在玩家落子后我們首先要去判斷是否產(chǎn)生了輸贏,如果產(chǎn)生了輸贏平局,我們將結(jié)束游戲,如果均沒(méi)有產(chǎn)生的話我們會(huì)返回一個(gè)‘C',來(lái)繼續(xù)游戲,我們用IsWin()函數(shù)來(lái)實(shí)現(xiàn)。

電腦下棋,我們可以使用rand()函數(shù),由于我們生成的數(shù)字必須在棋盤范圍內(nèi),所以我們將其模上我們定義的行或列,這樣可以保證電腦輸入的有效性。其次我們和玩家一樣要判斷電腦落子處是否為空,為空才可以落子。

同理 ,電腦落子后,也應(yīng)該使用IsWin()函數(shù)來(lái)判斷輸贏情況。

大致的游戲設(shè)計(jì)就是這樣,接下來(lái)我們用代碼實(shí)現(xiàn),此次我們的實(shí)現(xiàn)分為test.c game.h game.c 來(lái)分別實(shí)現(xiàn),其中 test.c 為主體,game.c為函數(shù)的定義,game.h為函數(shù)的聲明。

此處為test.c的內(nèi)容:

#define _CRT_SECURE_NO_WARNINGS 1
 
#include"game.h"
 
//三子棋測(cè)試
 
void menu()
{
 printf("1,play 0.exit");
}
void game() {
 char ret = 0;
 char board[ROW][COL] = { 0 };
 //初始化
 IntBoard(board, ROW, COL);
 Displayboard(board, ROW, COL);
 //玩家下棋
 while (1) {
  PlayerMove(board, ROW, COL);
  Displayboard(board, ROW, COL);
  //判斷玩家是否贏
  ret = IsWin(board, ROW, COL);
  if (ret != 'C') {
   break;
  }
  ComputerMove(board, ROW, COL);
  Displayboard(board, ROW, COL);
  ret = IsWin(board, ROW, COL);
  if (ret != 'C') {
   break;
  }
 }
 if (ret == '*')
  printf("玩家贏\n");
 else if (ret == "#")
  printf("電腦贏\n");
 else
  printf("平局\n");
 
 
 
}
 
void  test() {
 int input = 0;
 srand((unsigned int)time(NULL));
 do {
  menu();
  printf("請(qǐng)選擇:>\n");
  scanf("%d", &input);
  switch (input) {
  case 1:
   printf("三子棋\n");
   game();
   break;
 
  case 0:
   printf("退出游戲\n");
   break;
  default:
   printf("輸入有誤,請(qǐng)重新輸入\n");
   break;
 
 
  }
 
 } while (input);
 
}
 
 
 
int main() {
 
 test();
 return 0;
 
}

game.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void IntBoard(char board[ROW][COL], int row, int col)
{
 int i = 0;
 int j = 0;
 for (i = 0; i < row; i++) {
  for (j = 0; j < col; j++) {
   board[i][j] = ' ';
  }
 
 }
}
void  Displayboard(char board[ROW][COL], int row, int col)
{
 int i = 0;
 for (i = 0; i < row; i++) {
  int j = 0;
  for (j = 0; j < col; j++) {
   printf(" %c ", board[i][j]);
   if (j < col - 1)
    printf("|");
  }
  printf("\n");
  if (i < row - 1)
  {
   for (j = 0; j < col; j++)
   {
    printf("---");
    if (j < col - 1)
     printf("|");
   }
 
  }
  printf("\n");
 
 }
 
 
 
}
void PlayerMove(char board[ROW][COL], int row, int col) {
 
 int x = 0;
 int y = 0;
 printf("玩家走");
 
 while (1) {
  printf("請(qǐng)輸入坐標(biāo)");
  scanf("%d%d", &x, &y);
  if (x >= 1 && x <= row && y >= 1 && y <= col) {
 
   if (board[x - 1][y - 1] == ' ') {
    board[x - 1][y - 1] = '*';
    break;
   }
   else
   {
    printf("該坐標(biāo)被占用\n");
 
   }
 
  }
  else
   printf("輸入有誤其重新輸入\n");
 }
 
}
 
void ComputerMove(char board[ROW][COL], int row, int col) {
 int x = 0;
 int y = 0;
 printf("電腦開(kāi)始下棋\n");
 while (1) {
  x = rand() % row;
  y = rand() % col;
  if (board[x][y] == ' ') {
 
   board[x][y] = '#';
   break;
  }
 }
 
}
//返回1 表示棋盤滿了
//返回0 表示棋盤沒(méi)滿;
 
int  isFULL(char board[ROW][COL], int row, int col) {
 int i = 0;
 int j = 0;
 for (i = 0; i < row; i++) {
 
  for (j = 0; j < col; j++) {
   if (board[i][j] == ' ') {
 
    return 0;
   }
 
  }
 }
 
 
 return 1;
}
 
char IsWin(char board[ROW][COL], int row, int col) {
 int i = 0;
 for (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 (i = 0; i < col; i++) {
 
  if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
   return board[0][i];
 }
 if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board != ' ')
  return board[0][0];
 
 if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
  return board[1][1];
 //判斷是否平局
 if (isFULL(board, ROW, COL) == 1) {
  return 'Q';
 }
 return 'C';
 
}

game.h:

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define  COL 3
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void IntBoard(char board[ROW][COL], int row, int col);
void  Displayboard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
//玩家贏“*”
//電腦贏返回“#”
//平局“Q”
//繼續(xù)返回“C”
char IsWin(char board[ROW][COL], int row, int col);

實(shí)現(xiàn)結(jié)果:

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

相關(guān)文章

  • 關(guān)于C++中由于字節(jié)對(duì)齊引起內(nèi)存問(wèn)題定位分析

    關(guān)于C++中由于字節(jié)對(duì)齊引起內(nèi)存問(wèn)題定位分析

    前幾天遇到一個(gè)稀奇古怪的問(wèn)題,在創(chuàng)建對(duì)象的時(shí)候程序異常退出,查找代碼發(fā)現(xiàn)結(jié)構(gòu)體數(shù)組問(wèn)題,最終把問(wèn)題簡(jiǎn)化得到解決方法,下面小編把我的問(wèn)題及解決方案分享到腳本之家平臺(tái)供大家參考下
    2021-06-06
  • C++中VTK9.3.0刻度標(biāo)簽重疊的問(wèn)題記錄

    C++中VTK9.3.0刻度標(biāo)簽重疊的問(wèn)題記錄

    這篇文章主要介紹了C++中VTK9.3.0刻度標(biāo)簽重疊的問(wèn)題,本文采用VTK9.3.0版本,其他版本如VKT8.0亦有同樣的問(wèn)題,需要的朋友可以參考下
    2024-06-06
  • C++實(shí)現(xiàn)職工工資管理系統(tǒng)

    C++實(shí)現(xiàn)職工工資管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單的職工工資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 簡(jiǎn)單談?wù)凜語(yǔ)言中的= 和==、!=

    簡(jiǎn)單談?wù)凜語(yǔ)言中的= 和==、!=

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中= 和==、!=的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • C++深入探究引用的使用

    C++深入探究引用的使用

    引用是C++一個(gè)很重要的特性,顧名思義是某一個(gè)變量或?qū)ο蟮膭e名,對(duì)引用的操作與對(duì)其所綁定的變量或?qū)ο蟮牟僮魍耆葍r(jià),這篇文章主要給大家總結(jié)介紹了C++中引用的相關(guān)知識(shí)點(diǎn),需要的朋友可以參考下
    2022-05-05
  • C語(yǔ)言線程對(duì)象和線程存儲(chǔ)的實(shí)現(xiàn)

    C語(yǔ)言線程對(duì)象和線程存儲(chǔ)的實(shí)現(xiàn)

    這篇文章主要介紹了C語(yǔ)言線程對(duì)象和線程存儲(chǔ)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Cocos2d-x Schedule定時(shí)器的使用實(shí)例

    Cocos2d-x Schedule定時(shí)器的使用實(shí)例

    這篇文章主要介紹了Cocos2d-x Schedule定時(shí)器的使用實(shí)例,本文的講解內(nèi)容包含在代碼注釋中,需要的朋友可以參考下
    2014-09-09
  • Qt實(shí)現(xiàn)字符串生成二維碼功能

    Qt實(shí)現(xiàn)字符串生成二維碼功能

    這篇文章主要介紹了如何利用Qt實(shí)現(xiàn)字符串生成二維碼功能,文中的實(shí)現(xiàn)過(guò)程講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下
    2022-01-01
  • C++11中std::move、std::forward、左右值引用、移動(dòng)構(gòu)造函數(shù)的測(cè)試問(wèn)題

    C++11中std::move、std::forward、左右值引用、移動(dòng)構(gòu)造函數(shù)的測(cè)試問(wèn)題

    這篇文章主要介紹了C++11中std::move、std::forward、左右值引用、移動(dòng)構(gòu)造函數(shù)的測(cè)試,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 深入理解C++中的文件操作

    深入理解C++中的文件操作

    這篇文章主要給大家深入的介紹了C++中的文件操作,文件的操作對(duì)每個(gè)程序員來(lái)說(shuō)都是很重要的,本文的介紹的很詳細(xì),有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01

最新評(píng)論

平塘县| 丰县| 于都县| 东明县| 新干县| 绍兴县| 东源县| 石楼县| 莫力| 中牟县| 寿阳县| 广安市| 平昌县| 玉山县| 汝阳县| 嘉祥县| 台东市| 杂多县| 滨海县| 余姚市| 肇东市| 永川市| 大足县| 常宁市| 长汀县| 南平市| 平顶山市| 永年县| 喀什市| 资阳市| 府谷县| 乌鲁木齐市| 丰顺县| 吉安县| 和平区| 高邑县| 隆子县| 枣阳市| 威信县| 崇仁县| 玉门市|