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

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");
}

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

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

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

void begin(char arr[X][Y], int x, int y)  //初始化棋盤(pán)
{
 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ì)棋盤(pán)進(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");
}

為了方便起見(jiàn),我們將引用的頭文件和函數(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語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版三子棋(附完整代碼)

    c語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版三子棋(附完整代碼)

    大家好,本篇文章主要講的是c語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版三子棋(附完整代碼),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 談?wù)剉ector的特殊性之為什么它不是STL容器

    談?wù)剉ector的特殊性之為什么它不是STL容器

    這篇文章主要給大家介紹了關(guān)于vector的特殊性之為什么它不是STL容器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • C語(yǔ)言?const修飾普通變量和指針的操作代碼

    C語(yǔ)言?const修飾普通變量和指針的操作代碼

    這篇文章主要介紹了C語(yǔ)言const修飾普通變量和指針,用const修飾普通變量時(shí),是在語(yǔ)法層面限制了變量的修改,但是本質(zhì)上,變量還是變量,是一種不能被修改的變量,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • C++ 內(nèi)聯(lián)函數(shù)inline案例詳解

    C++ 內(nèi)聯(lián)函數(shù)inline案例詳解

    這篇文章主要介紹了C++ 內(nèi)聯(lián)函數(shù)inline案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++中Lambda表達(dá)式的語(yǔ)法與實(shí)例

    C++中Lambda表達(dá)式的語(yǔ)法與實(shí)例

    C++ 11 中的 Lambda 表達(dá)式用于定義并創(chuàng)建匿名的函數(shù)對(duì)象,以簡(jiǎn)化編程工作,下面這篇文章主要給大家介紹了關(guān)于C++中Lambda表達(dá)式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包

    C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包

    這篇文章主要介紹了C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • C++內(nèi)存查找實(shí)例

    C++內(nèi)存查找實(shí)例

    這篇文章主要介紹了C++內(nèi)存查找實(shí)例,可實(shí)現(xiàn)Windows程序設(shè)計(jì)中的內(nèi)存查找功能,需要的朋友可以參考下
    2014-10-10
  • c語(yǔ)言可變參數(shù)實(shí)現(xiàn)示例

    c語(yǔ)言可變參數(shù)實(shí)現(xiàn)示例

    這篇文章主要介紹了c語(yǔ)言可變參數(shù)實(shí)現(xiàn)示例,需要的朋友可以參考下
    2014-04-04
  • C語(yǔ)言解讀數(shù)組循環(huán)右移問(wèn)題

    C語(yǔ)言解讀數(shù)組循環(huán)右移問(wèn)題

    這篇文章主要介紹了C語(yǔ)言解讀數(shù)組循環(huán)右移問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++卸載程序功能示例

    C++卸載程序功能示例

    用C++寫(xiě)一個(gè)自己的卸載程序來(lái)完成程序的卸載工作,同時(shí)運(yùn)行后要?jiǎng)h除卸載程序本身,并刪除卸載程序所在的文件夾
    2013-11-11

最新評(píng)論