三子棋游戲-創(chuàng)新互聯(lián)

簡要介紹

制作一個(gè)三子棋游戲,我們需要有以下的要素

在卓尼等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需求定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,營銷型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè),卓尼網(wǎng)站建設(shè)費(fèi)用合理。
  1. 菜單

  1. 游戲界面

  1. 玩家下棋、電腦下棋

  1. 判斷勝負(fù)并且輸出

菜單

首先,我們需要有一個(gè)菜單,我們可以先將'菜單'封裝成一個(gè)函數(shù)

void menu()
{
    printf("*********************\n");
    printf("**    1.play   ******\n");
    printf("**    0.exit   ******\n");
    printf("*********************\n");
}

然后,我們應(yīng)該輸入一個(gè)數(shù)字,來進(jìn)行選擇,因此這里需要用到條件語句

int main()
{
  int input;
  menu();
  printf("請輸入你的選擇");
  scanf("%d",&input);
  switch(input)
  case 1:
      printf("三子棋游戲");
      game();//這里進(jìn)行游戲
      break;
  case 0:
      printf("退出游戲");
      break;
  default:
      break;
  return 0;
}
游戲 游戲的界面

我們知道,三子棋應(yīng)當(dāng)是有一個(gè)類似“棋盤”的東西,而且玩家要下棋——怎么下棋?

我們用一個(gè)3*3的二維數(shù)組來讀取玩家/電腦的輸入

char board[3][3]={0};

然后我們需要將這個(gè)棋盤都初始化,最初顯示出的棋盤應(yīng)該是沒有落子的

且為了避免麻煩,我們用一個(gè)函數(shù)封裝起來,且用循環(huán)來初始化棋盤

InitBoard(board,3,3);

void InitBoard(char *board[3][3],int x,int y)
{
  int i;
  for(i=0;i<3;i++)//控制行
  {
     int j;//在循環(huán)里定義,若放在循環(huán)外面,j的值會(huì)在循環(huán)后保留不變,就無法實(shí)現(xiàn)循環(huán)
     for(j=0;j<3;j++)//控制列
     {
          board[i][j] = ' ';//將該個(gè)元素初始化為' '
     }   
  }
}

初始化后,我們需要顯示一下棋盤,讓玩家知道當(dāng)前棋盤的狀況

顯示棋盤

首先,可以看一下簡要的棋盤模樣

實(shí)則就是一個(gè)“井”字

DisplayBoard(board, 3, 3);

void DisplayBoard(char board[3][3], int x, int y)
{
    int i = 0;
    for (i = 0; i< x; i++)//首先,同初始化一般,i控制行數(shù)
    {
        int j = 0;
        for (j = 0; j< y; j++)//j控制列數(shù)
        {
            printf(" %c ", board[i][j]);//按照元素+符號的形式打印出一個(gè)棋盤
            //printf("  ");為什么不用這個(gè)?而是用數(shù)組打?。坎欢际强崭駟??——>C語言里用數(shù)組元素打印的話,
            //同時(shí)就會(huì)給數(shù)組元素'安定'下位置,那么每次改變就會(huì)在該處地方改變,若沒有打印數(shù)組元素
            //那么數(shù)組中的元素會(huì)被隨機(jī)存放,甚至在運(yùn)行框內(nèi)看不到        
            if (j< col - 1)
                printf("|");//第三列右側(cè)不需要打印邊界
        }
        if (i< x - 1)//最后一行不打印邊框
        {
            int j = 0;
            for (j = 0; j< y; j++)
            {
                printf("---");//打印連接的符號
                if (j< y - 1)
                    printf("|");
            }
            printf("\n");
        }
    }
}

顯示完棋盤,我們需要玩家來下棋

如何下棋?——>輸入坐標(biāo)

下棋 玩家

玩家的下棋封裝成一個(gè)函數(shù)

PlayerMove(board, 3, 3);

void PlayerMove(char board[3][3],int x,int y)
{
   int a,b;
   printf("玩家下棋");
   printf("請輸入你要走的坐標(biāo):>");
   scanf("%d %d",&a,&b);
}

接著要進(jìn)入判斷,下棋的地方是否能下,若不能,則需要重新下,那怎么重新下呢?——用循環(huán)

輸入成功則跳出這個(gè)循環(huán)。

且因?yàn)槭侵貜?fù)下棋,所以需要輸入a,b語句放置在循環(huán)內(nèi),實(shí)現(xiàn)多次輸入

while(1)
{  
  printf("請輸入你要走的坐標(biāo):>");
  scanf("%d %d",&a,&b);
  if(board[a-1][b-1]==' ')//因?yàn)槭菙?shù)組,所以要對輸入的坐標(biāo)減1
   {
    board[a-1][b-1]=='*';//玩家的子定義成'*'
    break;//輸入成功就跳出這個(gè)循環(huán)
   }
   else 
   {
    printf("你輸入的坐標(biāo)有誤!請重新輸入!")
   }
}

但是,若有重復(fù)輸入的情況怎么辦?——要保證落子的時(shí)候,該區(qū)域沒有棋子

那么代碼就會(huì)變?yōu)?/p>

while (1)
    {
        printf("請輸入要下棋的坐標(biāo):>");
        scanf("%d %d", &x, &y);
        if (a >= 1 && a<= x && b >= 1 && b<= y)//沒有棋子才能進(jìn)入這個(gè)語句進(jìn)行下棋
        {
            if (board[a - 1][b - 1] == ' ')//因?yàn)槭菙?shù)組,所以要對輸入的坐標(biāo)減1
            {
                board[a - 1][b - 1] = '*';//玩家的子定義成'*'
                break;
            }
            else
            {
                printf("坐標(biāo)被占用,重新輸入");//輸入成功就跳出這個(gè)循環(huán)
            }
        }
        else
        {
            printf("坐標(biāo)非法,請重新輸入\n");
        }
    }
}
總和
void PlayerMove(char board[3][3], int x, int y)
{
    int a = 0;
    int b = 0;

    printf("玩家下棋\n");

    while (1)
    {
        printf("請輸入要下棋的坐標(biāo):>");
        scanf("%d %d", &a, &b);
        if (a >= 1 && a<= x && b >= 1 && b<= y)
        {
            if (board[a - 1][b - 1] == ' ')
            {
                board[a - 1][b - 1] = '*';
                break;
            }
            else
            {
                printf("坐標(biāo)被占用,重新輸入");
            }
        }
        else
        {
            printf("坐標(biāo)非法,請重新輸入\n");
        }
    }
}
電腦

電腦輸入坐標(biāo),和玩家一樣也要先進(jìn)行判斷,下棋的位置是否有棋子,若有則重新輸入,否則就落子并且退出循環(huán)

ComputerMove(board, 3, 3);

void ComputerMove(char board[3][3], int x, int y)
{
  int a,b;
  while(1)
  {
       
  }
}

不一樣的是,這里的坐標(biāo)是隨機(jī)數(shù),隨機(jī)數(shù)就要用到rand函數(shù),具體可以百度或者看csdn上其他大佬的詳細(xì)介紹,這里僅用作一個(gè)工具來實(shí)現(xiàn)隨機(jī)數(shù)的設(shè)置

void ComputerMove(char board[3][3], int x, int y)
{
  int a,b;
  while(1)//若落子失敗就會(huì)無限進(jìn)行循環(huán)數(shù)的設(shè)置
  {
       a = rand() % 3;//膜上3,結(jié)果恰好為0-2
       b = rand() % 3;
        if (board[a][b] == ' ')//判斷是否有空位
        {
            board[a][b] == '#';
            break;//落子結(jié)束,就跳出循環(huán)
        }
  }
}
判斷勝負(fù)

三子棋游戲,應(yīng)該是在每次玩家/電腦下棋后會(huì)有一次判斷勝負(fù)的功能

且會(huì)有四種情況——1.玩家勝 2.電腦勝 3.勝負(fù)未分,繼續(xù)游戲 4.平局

這里同樣封裝成一個(gè)函數(shù)

Iswin(board, 3, 3);

Iswin(char board[3][3], 3, 3)
{
   //先判斷行
   int i = 0;
   for (i = 0; i< 3; i++) 
   
}

到這里,我們需要思考,如果玩家勝,會(huì)實(shí)現(xiàn)什么程序,電腦勝會(huì)實(shí)現(xiàn)什么程序,平局?繼續(xù)?

我們可以用函數(shù)來返回字符來實(shí)現(xiàn)以上的程序

前面我們提到 玩家的落子是字符'*',電腦落子是'#',那么我們可以用其落子作為返回值進(jìn)行條件語句的判斷,平局和繼續(xù)游戲的情況也可以各自返回一個(gè)值來決定游戲的進(jìn)行

玩家勝和電腦勝可以用同一個(gè)函數(shù),不用分開

Iswin(char board[3][3], 3, 3)
{
   //先判斷行
   int i = 0;
   for (i = 0; i< 3; i++) //判斷一行相同
   {
        if (board[i][0] == board[i][1] == board[i][2] && board[i][0] != ' ')
        {
            return board[i][1];
        }
    }
    for (i = 0; i< 3; i++)//判斷一列
    {
        if (board[0][i] == board[1][i] == board[2][i] && board[0][i] != ' ')
        {
            return board[0][i];
        }
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == board[3][3])//判斷正對角線
    {
        return board[1][1];
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')//判斷逆對角線
    {
        return board[1][1];
    }
}

然后,我們需要判斷平局

平局

平局的時(shí)候就是不滿足勝負(fù)的情況,且棋盤滿了,這時(shí)候我們需要返回一個(gè)值來判斷是否是平局

IsFull(board, 3, 3);

int IsFull(char board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i< 3; i++)
    {
        for (j = 0; j< 3; j++)
        {
            if (board[i][j] == ' ')
            {
                return 0;//沒滿
            }
        }
    }
    return 1;//滿了
}

排除了以上三種可能,那我們最后就繼續(xù)游戲

代碼匯總?cè)缦拢?/p>

匯總:

int IsFull(char board[3][3], int x, int y)
{
    int i = 0;
    int j = 0;
    for (i = 0; i< 3; i++)
    {
        for (j = 0; j< 3; j++)
        {
            if (board[i][j] == ' ')
            {
                return 0;//沒滿
            }
        }
    }
    return 1;//滿了
}


char Iswin(char board[3][3], int x, int y)
{
    int i = 0;
    for (i = 0; i< x; i++)
    {
        if (board[i][0] == board[i][1] == board[i][2] && board[i][0] != ' ')
        {
            return board[i][1];
        }
    }
    for (i = 0; i< y; i++)
    {
        if (board[0][i] == board[1][i] == board[2][i] && board[0][i] != ' ')
        {
            return board[0][i];
        }
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == board[3][3])
    {
        return board[1][1];
    }
    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))
    {
        return 'Q';
    }
    //游戲繼續(xù)
    return 'C';
}

現(xiàn)在有了以上的函數(shù)后,我們要湊成一個(gè)游戲game()函數(shù)

三子棋代碼大匯總
void game()
{
    //存放數(shù)據(jù)需要一個(gè)3*3的二維數(shù)組
    char board[3][3] = { 0 };
    //最開始數(shù)組放的應(yīng)該都是空格
    //初始化棋盤
    InitBoard(board, 3, 3);
    //但是如果想隨時(shí)改變行列數(shù)的話,該怎么辦?——宏定義

    //顯示棋盤
    DisplayBoard(board, 3, 3);
    char ret = 0;//定義放在外邊,若在循環(huán)里定義的話,僅能存在于循環(huán)里
    while (1)
    {
        //玩家下棋
        PlayerMove(board, 3, 3);
        DisplayBoard(board, 3, 3);
        //判斷輸贏,用返回值來判定
        ret = Iswin(board, 3, 3);
        if (ret!='C')//游戲若不進(jìn)行,則說明游戲結(jié)束,就跳出循環(huán)
        {
            break;
        }
        //電腦下棋
        ComputerMove(board, 3, 3);
        DisplayBoard(board, 3, 3);
        ret = Iswin(board, 3, 3);
        if (ret != 'C')//游戲若不進(jìn)行,則說明游戲結(jié)束,就跳出循環(huán)
        {
            break;
        }
        //判斷輸贏
    }
    if (ret == '*')
    {
        printf("玩家贏\n");
    }
    else if ('#' == ret)
    {
        printf("電腦贏\n");
    }
    else if ('Q' == ret)
    {
        printf("平局\n");
    }
    DisplayBoard(board, 3, 3);
}

對于主函數(shù),由于我們要多次進(jìn)行游戲,所以要將game()函數(shù)放在循環(huán)里

int main()
{
    int input;//input放在外邊,這樣就可以實(shí)現(xiàn)整個(gè)主函數(shù)都能調(diào)用
    srand((unsigned int)time(NULL));//隨機(jī)數(shù)的設(shè)置,放在循環(huán)數(shù)里
    do
    {
        menu();
        printf("請選擇:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("三子棋\n");
            game();
            break;
        case 0:
            printf("退出游戲");
            break;
        default:
            printf("選擇錯(cuò)誤,重新選擇\n");
            break;
        }
    } while (input);
    return 0;
}

綜上就是三子棋的全部代碼

值得一提

但是,若是想實(shí)現(xiàn)四子棋,五子棋,六子棋...怎么辦?,難道要一個(gè)一個(gè)去修改?

這時(shí)候我們就可以用宏定義 ,此外,我們需要再設(shè)置兩個(gè)頭文件

game.h——作為聲明文件 game.c——函數(shù)定義的文件

那我們在聲明文件里進(jìn)行聲明

//game.h
#define _CRT_SECURE_NO_WARNINGS 1

#include#define ROW 3
#define COL 3

//函數(shù)的聲明
void InitBoard(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);

char Iswin(char board[ROW][COL], int row, int col);

那我們可以改變ROW和COL的值來實(shí)現(xiàn)不同的m子棋

與此同時(shí),代碼里的一些參數(shù)也需要改變,為了讀者方便,我直接放出來

萬能代碼
//game.h
#define _CRT_SECURE_NO_WARNINGS 1

#include#define ROW 3
#define COL 3

//函數(shù)的聲明
void InitBoard(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);

char Iswin(char board[ROW][COL], int row, int col);

//game.c
#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"http://包含頭文件,這樣子可以用ROW和COL

void InitBoard(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++)//控制列
        {
            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("%c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
        if (i< row - 1)//最后一組不打印邊框
        {
            int j = 0;
            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 a = 0;
    int b = 0;

    printf("玩家下棋:>\n");

    while (1)
    {
        printf("請輸入要下棋的坐標(biāo):>");
        scanf("%d %d", &x, &y);
        if (x >= 1 && x<= row && y >= 1 && y<= col)
        {
            if (board[a - 1][b - 1] == ' ')
            {
                board[a - 1][b - 1] = '*';
                break;
            }
            else
            {
                printf("坐標(biāo)被占用,重新輸入");
            }
        }
        else
        {
            printf("坐標(biāo)非法,請重新輸入\n");
        }
    }
}

//電腦隨機(jī)下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
    int a = 0;
    int b = 0;
    printf("電腦下棋>:\n");
    while (1)//若電腦生成的重復(fù)了,則重新生成數(shù)字,進(jìn)行一個(gè)循環(huán)
    {
        a = rand() % row;
        b = rand() % col;
        if (board[a][b] == ' ')
        {
            board[a][b] == '#';
            break;
        }
    }

}

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][2] && board[i][0] != ' ')
        {
            return board[i][1];
        }
    }
    for (i = 0; i< col; i++)
    {
        if (board[0][i] == board[1][i] == board[2][i] && board[0][i] != ' ')
        {
            return board[0][i];
        }
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == board[3][3])
    {
        return board[1][1];
    }
    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))
    {
        return 'Q';
    }
    //游戲繼續(xù)
    return 'C';
}

//主函數(shù)
#define _CRT_SECURE_NO_WARNINGS 1

#include#include#include#include "game.h"http://聲明,這樣子可以用ROW和COL
//三子棋小游戲
void  menu()
{
    printf("*********************\n");
    printf("**    1.play   ******\n");
    printf("**    0.exit   ******\n");
    printf("*********************\n");
}

void game()
{
    //存放數(shù)據(jù)需要一個(gè)3*3的二維數(shù)組
    char board[ROW][COL] = { 0 };
    //最開始數(shù)組放的應(yīng)該都是空格
    //初始化棋盤
    InitBoard(board, ROW, COL);
    //但是如果想隨時(shí)改變行列數(shù)的話,該怎么辦?——宏定義

    //顯示棋盤
    DisplayBoard(board, ROW, COL);
    char ret = 0;//定義放在外邊,若在循環(huán)里定義的話,僅能存在于循環(huán)里
    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 if ('Q' == ret)
    {
        printf("平局\n");
    }
    DisplayBoard(board, ROW, COL);
}


int main()
{
    int input;//input放在外邊,這樣就可以實(shí)現(xiàn)整個(gè)主函數(shù)都能調(diào)用
    srand((unsigned int)time(NULL));//記得引用庫函數(shù)

    do
    {
        menu();
        printf("請選擇:>");
        scanf("%d", &input);//輸入放在循環(huán)里,可以實(shí)現(xiàn)多次輸入
        switch (input)
        {
        case 1:
            printf("三子棋\n");
            game();
            break;
        case 0:
            printf("退出游戲");
            break;
        default:
            printf("選擇錯(cuò)誤,重新選擇\n");
            break;
        }
    } while (input);
    return 0;
}

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

本文標(biāo)題:三子棋游戲-創(chuàng)新互聯(lián)
文章起源:http://muchs.cn/article34/dphhpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)網(wǎng)站設(shè)計(jì)、動(dòng)態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、移動(dòng)網(wǎng)站建設(shè)網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站