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

C語(yǔ)言三子棋游戲?qū)崿F(xiàn)代碼解析

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

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

編程環(huán)境:Visual Studio 2019

(一)創(chuàng)建文件

 為了邏輯清晰的編程,我們先創(chuàng)建一個(gè)叫g(shù)ame.h的頭文件用以游戲函數(shù)的聲明,兩個(gè)源文件,一個(gè)是text,c用以測(cè)試,另一個(gè)game,c用以游戲函數(shù)的實(shí)現(xiàn),如圖所示。

(二)思路分析

首先是進(jìn)入游戲界面,進(jìn)行界面打印,在主函數(shù)內(nèi)引用菜單函數(shù),為了使游戲能夠重復(fù)玩,將函數(shù)放在do-while循環(huán)內(nèi)部。然后玩家進(jìn)行游戲選擇,在主函數(shù)內(nèi)運(yùn)用switch語(yǔ)句判斷所選內(nèi)容。

int main()
{
 int put;
 do
 {
  menu();
  printf("請(qǐng)選擇:");
  scanf("%d", &put);
  switch (put)
  {
  case 1:
   system("cls");
   game();       //進(jìn)行游戲
   break;
  case 0:
   printf("即將退出游戲?。?!");
   break;
  default:
   printf("輸入錯(cuò)誤,請(qǐng)重新輸入?。?);
   system("cls");
  }
 } while (put);
 return 0;
}
void menu()//菜單函數(shù)
{
 printf("*******************************\n");
 printf("********* 1.玩游戲 ************\n");
 printf("********* 0.退出 **************\n");
 printf("*******************************\n");
}

界面搞定完成之后,就要考慮棋盤的打印了,當(dāng)玩家選擇進(jìn)行游戲的時(shí)候,我們希望打印出的棋盤是這樣的。

當(dāng)我們想進(jìn)行5*5的棋盤或者更大的棋盤打印的時(shí)候,可以定義全局變量X,Y分別表示行數(shù)和列數(shù),這樣更方便改動(dòng)。

這個(gè)時(shí)候,可以利用字符型數(shù)組,給每個(gè)數(shù)組單元賦值為空格,然后進(jìn)行打印。

void begin(char arr[X][Y], int x, int y)  //初始化棋盤
{
 int i = 0;
 int j = 0;
 for (i = 0; i < x; i++)
 {
  for (j = 0; j < y; j++)
   arr[i][j] = ' ';             //每個(gè)數(shù)組單元都為空格
 }
}
void Print(char arr[X][Y], int x, int y)  //對(duì)棋盤進(jìn)行打印
{
 int i = 0;
 int j = 0;
 int k = 0;
 for (i = 0;i < x;i++)
 {
  for (j = 0;j < y;j++)
  {
   if (j == y - 1)
    printf(" %c \n", arr[i][j]);
   else
    printf(" %c |", arr[i][j]);
   if (j==y - 1)
   {
    if (i != x - 1)
    {
     for (k = 0;k < y;k++)
      {
      if (k == y - 1)
      {
       printf("---\n");
       break;
      }
      printf("---|");
     }
     break;
    }
   }
  }
 }
}

隨后,設(shè)置玩家下棋函數(shù)和電腦下棋函數(shù),將玩家下棋坐標(biāo)對(duì)應(yīng)數(shù)組單元賦值為'*',電腦下棋坐標(biāo)對(duì)應(yīng)數(shù)組單元賦值為'#',玩家下棋時(shí),首先輸入要下的坐標(biāo)(這里注意下棋坐標(biāo)和數(shù)組下標(biāo)差一),輸入坐標(biāo)后,還要進(jìn)行判斷該位置是否已經(jīng)被下過(guò),這時(shí)候要判斷所下位置是否為空格,若不是空格則需要再次輸入,電腦下棋時(shí),生成隨機(jī)數(shù),為保證生成的隨機(jī)數(shù)在數(shù)組下表范圍內(nèi),需要將生成的隨機(jī)數(shù)對(duì)x,y取余,為擴(kuò)大rand函數(shù)的范圍,在引用srand函數(shù),在函數(shù)內(nèi)部放置無(wú)符號(hào)time函數(shù),保證生成的數(shù)真正意義上隨機(jī) 。

void gamer(char arr[X][Y], int x, int y)//玩家輸入
{
 int a, b;
 scanf("%d %d", &a, &b);
 if (a > 0 && a <= x && b > 0 && b <= y)
 {
  if (arr[a - 1][b - 1] != ' ')
  {
   printf("位置已經(jīng)被下過(guò),請(qǐng)重新選擇:");
   gamer(arr, x, y);
  }
  arr[a - 1][b - 1] = '*';
 }
 else
 {
  printf("輸入不符合規(guī)則,請(qǐng)重新輸入:");
  gamer(arr, x, y);
 }
 
}
void computer(char arr[X][Y], int x, int y)
{
 
 int a = rand() % x;
 int b = rand() % y;
 if (arr[a][b] == ' ')
 {
  arr[a][b] = '#';
 }
 else
 {
  computer(arr, x, y);
 }
}

玩家電腦下棋后,進(jìn)行判斷輸贏,引用win函數(shù),當(dāng)橫排或豎排或?qū)蔷€相等的時(shí)候,返回相等元素的值,例如:第一排都為'*‘,則返回'*',根據(jù)返回值判斷為玩家贏。當(dāng)返回值為'*‘或者'#‘時(shí),判斷為游戲結(jié)束,玩家贏或者電腦贏,當(dāng)返回值為' ‘時(shí),游戲繼續(xù),當(dāng)以上判斷都不成立時(shí),判斷游戲屏幕是否已經(jīng)滿了,若不存在' ‘,則平局。

char win(char arr[X][Y], int x, int y)//判斷輸贏繼續(xù)
{
 char ch = 'C';
 int flag = 0;
 for (int i = 0; i < x; i++)
 {
  if (arr[i][0] == arr[i][1] && arr[i][0] == arr[i][2] && arr[i][1] == arr[i][2])//行相等
  {
   return arr[i][0];
  }
 }
 for (int j = 0; j < y; j++)
 {
  if (arr[0][j] == arr[1][j] && arr[0][j] == arr[2][j] && arr[1][j] == arr[2][j])//列相等
  {
   return arr[0][j];
  }
 }
 if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')//對(duì)角線相等
 {
  return arr[0][0];
 }
 if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[1][1] == arr[2][0] && arr[0][2] != ' ')//對(duì)角線相等
 {
  return arr[0][2];
 }
 for (int m = 0; m < x; m++)//是否鋪滿
 {
  for (int n = 0; n < y; n++)
  {
   if (arr[m][n] == ' ')
    flag = 1;
  }
 }
 if (flag == 0)
 {
  ch = 'Q';
 }
 return ch;
}
void game()//游戲進(jìn)行函數(shù)
{
 srand((unsigned int)time(NULL));
 char arr[X][Y];
 begin(arr, X, Y);
 char rat;
 Print(arr, X, Y);
 while (1)
 {
  rat = win(arr, X, Y);
  printf("請(qǐng)輸入您要下的棋子坐標(biāo):");
  gamer(arr, X, Y);
  Print(arr, X, Y);
  rat = win(arr, X, Y);
  if (rat != 'C' && rat != ' ')
  {
   break;
  }
  printf("電腦走\(yùn)n");
  computer(arr, X, Y);
  Print(arr, X, Y);
  rat = win(arr, X, Y);
  if (rat != 'C' && rat != ' ')
  {
   break;
  }
 }
 switch (rat)
 {
 case '*':
  printf("玩家贏了!\n");
  break;
 case '#':
  printf("電腦贏了!\n");
  break;
 case 'Q':
  printf("平局\n");
  break;
 }
 printf("游戲結(jié)束\n");
 system("cls");
}

為了方便起見,我們將引用的頭文件和函數(shù)放到game.h下,其他文件直接引用game.h即可。

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define X 3
#define Y 3
 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void menu();
void game();
void begin(char arr[X][Y], int x, int y);
void Print(char arr[X][Y], int x, int y);
void gamer(char arr[X][Y], int x, int y);
void computer(char arr[X][Y], int x, int y);
char win(char arr[X][Y], int x, int y);

(三)效果展示

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

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(50.求x的n次方)

    C++實(shí)現(xiàn)LeetCode(50.求x的n次方)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(50.求x的n次方),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言之實(shí)現(xiàn)字符串小寫變大寫的實(shí)例

    C語(yǔ)言之實(shí)現(xiàn)字符串小寫變大寫的實(shí)例

    這篇文章主要介紹了C語(yǔ)言之實(shí)現(xiàn)字符串小寫變大寫的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • c++超細(xì)致講解引用

    c++超細(xì)致講解引用

    在我們?nèi)粘5纳钪忻總€(gè)人都或多或少存在一個(gè)"外號(hào)",例如《西游記》中孫悟空就有諸多外號(hào):美猴王,孫行者,齊天大圣等等。那么在C++中,也可以給一個(gè)已經(jīng)存在的變量取別名,這就是引用。那么接下來(lái)深入來(lái)探討一下引用
    2022-05-05
  • C/C++靜態(tài)類和this指針詳解及實(shí)例代碼

    C/C++靜態(tài)類和this指針詳解及實(shí)例代碼

    這篇文章主要介紹了 C/C++靜態(tài)類和this指針詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • C語(yǔ)言輾轉(zhuǎn)相除法求2個(gè)數(shù)的最小公約數(shù)

    C語(yǔ)言輾轉(zhuǎn)相除法求2個(gè)數(shù)的最小公約數(shù)

    輾轉(zhuǎn)相除法最大的用途就是用來(lái)求兩個(gè)數(shù)的最大公約數(shù)。下面通過(guò)本文給大家介紹C語(yǔ)言輾轉(zhuǎn)相除法求2個(gè)數(shù)的最小公約數(shù),非常不錯(cuò),感興趣的朋友一起看看吧
    2016-12-12
  • 一些C語(yǔ)言中字符串的算法問(wèn)題解決實(shí)例小結(jié)

    一些C語(yǔ)言中字符串的算法問(wèn)題解決實(shí)例小結(jié)

    這篇文章主要介紹了一些C語(yǔ)言中字符串的算法問(wèn)題解決實(shí)例小結(jié),包括將字符串轉(zhuǎn)化為int類型的數(shù)及旋轉(zhuǎn)字符串等操作,需要的朋友可以參考下
    2016-03-03
  • Qt音視頻功能實(shí)現(xiàn)方法詳解

    Qt音視頻功能實(shí)現(xiàn)方法詳解

    音視頻應(yīng)用往往需要大量的計(jì)算資源,尤其是在處理高分辨率、高碼率的音視頻數(shù)據(jù)時(shí),這篇文章主要給大家介紹了關(guān)于Qt音視頻功能實(shí)現(xiàn)方法的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • opencv3/C++輪廓的提取與篩選方式

    opencv3/C++輪廓的提取與篩選方式

    今天小編就為大家分享一篇opencv3/C++輪廓的提取與篩選方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • C語(yǔ)言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼

    C語(yǔ)言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼

    本文主要介紹了C語(yǔ)言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼,包括memcpy、memmove、memset和memcmp的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • MFC實(shí)現(xiàn)簡(jiǎn)單計(jì)算器

    MFC實(shí)現(xiàn)簡(jiǎn)單計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了MFC實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05

最新評(píng)論

湖州市| 高青县| 山东省| 江源县| 南溪县| 祁门县| 靖安县| 桂东县| 永定县| 宁国市| 和田市| 霍邱县| 吴桥县| 互助| 石楼县| 商丘市| 莎车县| 桓台县| 西和县| 洛宁县| 彭阳县| 伽师县| 桐城市| 瓦房店市| 山东| 榆林市| 县级市| 海原县| 岚皋县| 沅陵县| 珠海市| 林芝县| 沈丘县| 微山县| 北安市| 梅河口市| 息烽县| 寻乌县| 鄱阳县| 浮梁县| 南召县|