iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言实现五子棋对战系统
  • 140
分享到

C语言实现五子棋对战系统

2024-04-02 19:04:59 140人浏览 薄情痞子
摘要

本文实例为大家分享了C语言实现五子棋对战的具体代码,供大家参考,具体内容如下 一直以来,有不少热爱并希望学习五子棋的人,或者仅为了娱乐来下五子棋的人,他们一般通过下棋对战来增加自己的

本文实例为大家分享了C语言实现五子棋对战的具体代码,供大家参考,具体内容如下

一直以来,有不少热爱并希望学习五子棋的人,或者仅为了娱乐来下五子棋的人,他们一般通过下棋对战来增加自己的对战经验,而在现实生活由于五子棋布板麻烦,经常缺少能下棋的环境,并且下棋时效率较低,记录步数也较为麻烦。利用计算机来模拟下五子棋环境,只要有计算机,就可以很方便的随时随地进行下棋,并且对战过程中对步数和下子过程进行记录,方便了喜欢下五子棋的人,让他们的五子棋学习更加高效或者娱乐起来更加方便。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <coNIO.h>
 
char draw[32][60] = {{" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
};
 
typedef struct//坐标结构体
{
    int x;
    int y;
} node;
 
typedef struct//栈结构体
{
    node data[120];
    int top;
} stack;
 
int win[3], player, step1, step2;
stack player1,player2;
 
char ch;
node pos;
 
int convY(int y);
int convX(int x);
void refreshDraw();
void BLUE();
void RED();
void GREEN();
void WHITE();
void printMap();
void printMenu();
void refreshMap();
void playerOperation(char cheese);
void jundge(int p, char cheese);
void in(char cheese);
void playerVsPlayer();
void playerVscomputer();
void Gotoxy(int x, int y);
void printStep(int player, int step);
void askExit();
void printPos(int player, int x, int y);
void printRoad();
 
int main()
{
    char num[99];
    printMenu();
    while(1)
    {
        WHITE();
        refreshDraw();
        pos.x = 0;
        pos.y = 0;
        win[1] = 0;
        win[2] = 0;
        gets(num);
        if(strcmp(num, "1") == 0)
        {
            playerVsPlayer();
            system("cls");
            printMenu();
        }
        else if(strcmp(num, "2") == 0)
        {
            askExit();
            continue;
        }
        else
        {
            printf("请输入正确数字!\n");
        }
    }
 
    return 0;
}
 
void BLUE()//字体变蓝
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE|FOREGROUND_INTENSITY);
}
 
void RED()//字体变红
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_INTENSITY);
}
 
void GREEN()//字体变绿
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY);
}
 
void WHITE()//字体变白
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE);
}
 
void printMap()//打印棋盘和棋子
{
    for(int i = 0; i <= 29; i++)
    {
        for(int j = 0; j <= 59; j++)
        {
            if(i==convX(pos.x) && (j==convY(pos.y)-1 || j==convY(pos.y)+1) )
            {
                if(player == 1)
                {
                    GREEN();
                }
                else if(player == 2)
                {
                    RED();
                }
 
            }
            else if(draw[i][j] == '*')
            {
                RED();
            }
            else if(draw[i][j] == 'O')
            {
                GREEN();
            }
            printf("%c", draw[i][j]);
            WHITE();
        }
        printf("\n");
    }
}
 
void refreshDraw()//清空棋盘
{
    int i;
    for(i = 0; i <= 30; i=i+2)
    {
        strcpy(draw[i]," ");
        strcpy(draw[i+1],"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]");
    }
    strcpy(draw[31]," ");
}
 
void printMenu()//打印菜单
{
    WHITE();
    printf("\n\n     ****************************\n");
    printf("     *                          *\n");
    printf("     *         欢迎使用         *\n");
    printf("     *    五子棋模拟对战系统    *\n");
    printf("     *                          *\n");
    printf("     ****************************\n\n\n");
    printf("\n【设计制作:by 软件18-8邵蔚】\n\n");
    printf("游戏规则为:\n二人参与游玩,双方分别使用两种棋子,\n");
    printf("下在棋盘的 [ ] 上,\n");
    printf("先形成5子连线(斜线、竖线或横线)的人获胜。\n\n");
    printf("操作说明:\n玩家用键盘“W”“S”“A”“D”来选择下棋位置,选择好后,\n");
    printf("按“J”键来下棋,然后本回合结束,下一名玩家操作。\n\n");
    printf("输入 1 并按回车开始游戏\n");
    printf("输入 2 并按回车退出游戏\n");
}
 
int convY(int y)//将棋盘坐标转换为字符串数组下标
{
    return 4*(y+8)-3;
}
 
int convX(int x)//将棋盘坐标转换为字符串数组下标
{
    return 2*(8-x)-1;
}
 
void refreshMap()//刷新棋盘画面
{
    gotoxy(0,0);
    printMap();
    gotoxy(0,0);
}
 
void playerOperation(char cheese)//扫描玩家输入的 "W""A""S""D""J""K" , 并且在棋盘显示或删除棋子;
{
    while(1)
    {
        refreshMap();
        ch = getch();
        if(ch == 'a' && pos.y > -7)
        {
            pos.y--;
        }
        else if(ch == 'd' && pos.y < 7)
        {
            pos.y++;
        }
        else if(ch == 'w' && pos.x < 7)
        {
            pos.x++;
        }
        else if(ch == 's' && pos.x > -7)
        {
            pos.x--;
        }
        else if(ch == 'j' && draw[convX(pos.x)][convY(pos.y)] == ' ')
        {
            draw[convX(pos.x)][convY(pos.y)] = cheese;
            in(cheese);
            refreshMap();
            break;
        }
        else if(ch == 'k' && player1.top > 0)
        {
            int tx, ty;
            if(cheese == '*')
            {
                tx = player1.data[player1.top].x;
                ty = player1.data[player1.top].y;
                player1.top--;
 
                draw[convX(tx)][convY(ty)] = ' ';
                refreshMap();
                break;
            }
            else if(cheese == 'O')
            {
                tx = player2.data[player2.top].x;
                ty = player2.data[player2.top].y;
                player2.top--;
 
            }
            draw[convX(tx)][convY(ty)] = ' ';
            refreshMap();
            break;
        }
        else if(ch == 'k' && player1.top <= 0)
        {
            system("cls");
            printf("提示:没有棋子了!\n");
            system("pause");
            refreshMap();
            printStep(1, step1);
            printStep(2, step2);
            gotoxy(65,16);
            printf(" 按 K 来悔棋。");
            gotoxy(65, 23);
            GREEN();
            printf("(玩家1 : O)");
            gotoxy(65, 24);
            RED();
            printf("(玩家1 : *)");
        }
    }
}
 
void jundge(int p, char cheese)//判断是否有赢家
{
    int tx, ty, sum = 0;
 
    tx = pos.x;
    ty = pos.y;
    sum = 0;
    while(draw[convX(tx)][convY(ty)] == cheese && sum <= 5)
    {
        if(draw[convX(tx)][convY(ty)] == cheese)
            sum++;
        tx++;
    }
    tx = pos.x - 1;
    ty = pos.y;
    while(draw[convX(tx)][convY(ty)] == cheese && sum <= 5)
    {
        if(draw[convX(tx)][convY(ty)] == cheese)
            sum++;
        tx--;
    }
    if(sum >= 5)
    {
        win[p] = 1;
        return;
    }
//--------------------------------------------------------------------
    tx = pos.x;
    ty = pos.y;
    sum = 0;
    while(draw[convX(tx)][convY(ty)] == cheese && sum <= 5)
    {
        if(draw[convX(tx)][convY(ty)] == cheese)
            sum++;
        ty++;
    }
    tx = pos.x;
    ty = pos.y - 1;
    while(draw[convX(tx)][convY(ty)] == cheese && sum <= 5)
    {
        if(draw[convX(tx)][convY(ty)] == cheese)
            sum++;
        ty--;
    }
    if(sum >= 5)
    {
        win[p] = 1;
        return;
    }
//----------------------------------------------------------------------
    tx = pos.x;
    ty = pos.y;
    sum = 0;
    while(draw[convX(tx)][convY(ty)] == cheese && sum <= 5)
    {
        if(draw[convX(tx)][convY(ty)] == cheese)
            sum++;
        ty++;
        tx++;
    }
    tx = pos.x - 1;
    ty = pos.y - 1;
    while(draw[convX(tx)][convY(ty)] == cheese && sum <= 5)
    {
        if(draw[convX(tx)][convY(ty)] == cheese)
            sum++;
        ty--;
        tx--;
    }
    if(sum >= 5)
    {
        win[p] = 1;
        return;
    }
//----------------------------------------------------------------------
    tx = pos.x;
    ty = pos.y;
    sum = 0;
    while(draw[convX(tx)][convY(ty)] == cheese && sum <= 5)
    {
        if(draw[convX(tx)][convY(ty)] == cheese)
            sum++;
        tx--;
        ty++;
    }
    tx = pos.x + 1;
    ty = pos.y - 1;
    while(draw[convX(tx)][convY(ty)] == cheese && sum <= 5)
    {
        if(draw[convX(tx)][convY(ty)] == cheese)
            sum++;
        tx++;
        ty--;
    }
    if(sum >= 5)
    {
        win[p] = 1;
        return;
    }
 
    return;
}
 
void in(char cheese)//将棋子坐标入栈
{
    if(cheese == '*')
    {
        player2.top++;
        player2.data[player2.top].x = pos.x;
        player2.data[player2.top].y = pos.y;
    }
    else if(cheese == 'O')
    {
        player1.top++;
        player1.data[player1.top].x = pos.x;
        player1.data[player1.top].y = pos.y;
    }
}
 
void playerVsPlayer()
{
    step1 = 0;
    step2 = 0;
    player1.top = 0;
    player2.top = 0;
    player1.data[0].x = -1;
    player1.data[0].y = -1;
    player2.data[0].x = -1;
    player2.data[0].y = -1;
    player = 2;
    printStep(1, step1);
    printStep(2, step2);
    gotoxy(65, 16);
    printf(" 按 K 来悔棋。");
    gotoxy(65, 17);
    printf(" 按 J 来下子。");
    gotoxy(65, 18);
    printf(" 按 W A S D 控制方向。");
    gotoxy(65, 23);
    GREEN();
    printf("(玩家1 : O)");
    gotoxy(65, 24);
    RED();
    printf("(玩家2 : *)");
    WHITE();
    while(win[1] == 0 && win[2] == 0)
    {
        int tx, ty;
        if(win[1] == 0 && win[2] == 0)
        {
            player = 1;
            playerOperation('O');
            if(ch == 'k' || ch == 'K')
                step2--;
            else
                step1++;
            tx = player1.data[player1.top].x;
            ty = player1.data[player1.top].y;
            printStep(1, step1);
            printStep(2, step2);
            printPos(1, tx, ty);
        }
        jundge(1,'O');
 
        if(win[1] == 0 && win[2] == 0)
        {
            player = 2;
            playerOperation('*');
            if(ch == 'k' || ch == 'K')
                step1--;
            else
                step2++;
            tx = player2.data[player2.top].x;
            ty = player2.data[player2.top].y;
            printStep(1, step1);
            printStep(2, step2);
            printPos(2, tx, ty);
        }
        jundge(2,'*');
    }
    if(win[1] == 1)
    {
        gotoxy(0,31);
        printf("【");
        GREEN();
        printf("玩家1");
        WHITE();
        printf("】 赢了 !\n");
    }
    else if(win[2] == 1)
    {
        gotoxy(0,31);
        printf("【");
        RED();
        printf("玩家2");
        WHITE();
        printf("】 赢了 !\n");
    }
    printf("按回车查看双方下棋路线!\n");
    getchar();
    system("cls");
    if(win[1] == 1)
    {
        GREEN();
        printf("【玩家1】 赢了 !\n");
    }
    else if(win[2] == 1)
    {
        RED();
        printf("【玩家2】 赢了 !\n");
    }
    printRoad();
    getchar();
    return;
}
 
void askExit()//询问退出
{
    char dis[20];
    system("cls");
    printf("确定退出?\n Y/N?\n");
    gets(dis);
    if(strcmp(dis, "y") == 0 || strcmp(dis, "Y") == 0)
    {
        system("cls");
        printf("感谢你的使用!\n");
        exit(0);
    }
    else
    {
        system("cls");
        printMenu();
    }
    return;
}
 
void gotoxy(int x, int y)//移动光标函数
{
    COORD pos = {x,y};
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut, pos);
}
 
void printStep(int player, int step)//打印已走步数
{
 
    if(player == 1)
    {
        gotoxy(65,4);
        GREEN();
        printf("【玩家1】 :%02d", step);
        WHITE();
    }
    else if(player == 2)
    {
        gotoxy(65,6);
        RED();
        printf("【玩家2】 :%02d", step);
        WHITE();
    }
    return;
}
 
void printPos(int player, int x, int y)//打印下子坐标
{
    if(player == 1)
    {
        gotoxy(65, 10);
        GREEN();
        if(x == -1 && y == -1)
        {
            printf("                                  ");
        }
        else
        {
            printf("玩家1下棋位置:第%d行,第%d列",8 + x, 8 + y);
        }
        WHITE();
    }
    else if(player == 2)
    {
        gotoxy(65, 10);
        RED();
        if(x == -1 && y == -1)
        {
            printf("                                   ");
        }
        else
        {
            printf("玩家2下棋位置:第%d行,第%d列",8 + x, 8 + y);
        }
        WHITE();
    }
 
    return;
}
 
void printRoad()//打印所有下子坐标
{
    int i;
    GREEN();
    printf("玩家1的下棋路线为:\n");
    for(i = 1; i <= player1.top; i++)
    {
        printf("[ 第%d步 : (%d, %d) ]   ", i, 8 + player1.data[i].x, 8 + player1.data[i].y);
        if(i % 5 == 0)
            printf("\n");
    }
    printf("\n");
 
    RED();
    printf("玩家2的下棋路线为:\n");
    for(i = 1; i <= player2.top; i++)
    {
        printf("[ 第%d步 : (%d, %d) ]   ", i, 8 + player2.data[i].x, 8 + player2.data[i].y);
        if(i % 5 == 0)
            printf("\n");
    }
    printf("\n");
    WHITE();
    printf("输入 E 结束查看并返回菜单!");
 
    while(1)
    {
        scanf("%c", &ch);
        if(ch == 'E' || ch == 'e')
            break;
    }
    return;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C语言实现五子棋对战系统

本文链接: https://www.lsjlt.com/news/148090.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言实现五子棋对战系统
    本文实例为大家分享了C语言实现五子棋对战的具体代码,供大家参考,具体内容如下 一直以来,有不少热爱并希望学习五子棋的人,或者仅为了娱乐来下五子棋的人,他们一般通过下棋对战来增加自己的...
    99+
    2024-04-02
  • 用C语言实现五子棋游戏
    C语言写五子棋,使用多文件形式,使用代码看起来更好看;在这里我实现的功能是双人博弈,如果要实现人机对战,那么代码就会很复杂; 一.main.c 在主调函数中首先要提供一个给用户选择的...
    99+
    2024-04-02
  • 用C语言实现五子棋小游戏
    简介 本次五子棋使用的是光标控制移动,通过按空格键(键值32)来落子,实现游戏的。 我们额外用到的头文件有: #include<getch.h>  Q...
    99+
    2024-04-02
  • C语言实现简单五子棋游戏
    在生活中五子棋是一个十分普遍的一款游戏,今天让我们一起来实现这款游戏。 1.初始化棋盘 char ret; //数据存储在一个二维数组中,玩家下去*,电脑下去#. char ...
    99+
    2024-04-02
  • 利用C语言实现五子棋游戏
    本文实例为大家分享了C语言实现五子棋游戏的具体代码,供大家参考,具体内容如下 一、前言 本文将先介绍五子棋运行所需要的函数,最后串联成完整代码。 我们需要实现的功能有:1.菜单men...
    99+
    2024-04-02
  • 使用C语言实现五子棋游戏
    目录一、实现的目的和意义二、实现内容描述三、实现原理四、实现模块五子棋实现分为三大模块五、模块代码分析六、实现结果七、总结本文实例为大家分享了C语言实现五子棋游戏的具体代码,供大家参...
    99+
    2022-11-13
    C语言 五子棋
  • C语言实现双人五子棋游戏
    本文实例为大家分享了C语言实现双人五子棋游戏的具体代码,供大家参考,具体内容如下 实现功能 生成棋盘玩家1与玩家2对战,哪个玩家率先有连续5子连线,哪个玩家赢。 如何实现 组成: ...
    99+
    2024-04-02
  • Python实现五子棋人机对战 和人人对战
    目录人人对战动态演示源码分享人人对战.py人机对战动态演示前言: 过完520,咱们来玩玩五子棋陶冶情操。快拿这个和你女朋友去对线。多的不说直接进入正题 人人对战 游戏规则:p1为黑子...
    99+
    2024-04-02
  • java实现五子棋大战
    本文实例为大家分享了java实现五子棋大战的具体代码,供大家参考,具体内容如下 这是我接近一年前的项目了,以前没有养成写博客的习惯,打算陆续把以前做过的项目补上来。 一、介绍 主要实...
    99+
    2024-04-02
  • C语言五子棋小游戏实现代码
    本文实例为大家分享了C语言实现五子棋小游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<windows.h> #...
    99+
    2022-11-13
    C语言 五子棋
  • C语言实现简单的五子棋游戏
    本文实例为大家分享了c语言实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 环境vs2017 一、游戏设计思想 1.该代码设置为 玩家1(*) vs 玩家2(O) 2.选择玩游...
    99+
    2024-04-02
  • C语言实现五子棋功能全解析
    目录1、game.h2、test.c3、game.c4、游戏功能详解(1)、棋盘初始化(2)、棋盘的打印(3)、玩家下棋(4)、电脑下棋(5)、判断游戏输赢(6)、判断棋盘是否满了5...
    99+
    2024-04-02
  • 怎么用C语言实现五子棋游戏
    这篇文章主要介绍“怎么用C语言实现五子棋游戏”,在日常操作中,相信很多人在怎么用C语言实现五子棋游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言实现五子棋游戏”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • C语言实现简易五子棋小游戏
    本文实例为大家分享了C语言实现简单五子棋小游戏的具体代码,供大家参考,具体内容如下 效果图如下: 设计思路: 棋盘设计为15×15格,初始状态光标在棋盘的中央,白棋先走...
    99+
    2024-04-02
  • python实现单机五子棋对战游戏
    本文实例为大家分享了python实现单机五子棋对战的具体代码,供大家参考,具体内容如下  引入pygame模块  # 1、引入pygame 和 pygame.locals ...
    99+
    2024-04-02
  • 基于Python实现五子棋-(人机对战)
    目录前言人人对战动态演示源码分享人机对战前言 快520了,咱们来玩玩五子棋陶冶情操。快拿这个和你女朋友去对线。(分了别来找我哇)。多的不说直接进入正题 人人对战 游戏规则:p1为黑子...
    99+
    2024-04-02
  • Java实现在线五子棋对战游戏(人机对战)
    目录1. 人机对战1.1 演示1.2 评分表1.3 算法思路1.4 具体代码1. 人机对战 要增添一个人机对战的模块, 最大的难点就是如何让人机知道下在什么位置是最好的, 不仅要具备...
    99+
    2024-04-02
  • C语言实现简单的五子棋小游戏
    本文实例为大家分享了C语言实现五子棋小游戏的具体代码,供大家参考,具体内容如下 我们需要一个二维数组去储存当前的棋盘状态,然后打印出来。 我们游戏的逻辑是初始化棋盘,打印棋盘,人下棋...
    99+
    2024-04-02
  • C语言实现控制台五子棋小游戏
    这是一个用C语言实现的控制台小游戏—-五子棋,棋盘大小和获胜棋子数目是用宏定义的,可以自定义,所以可以轻松改为三子棋、六子棋等等。此游戏设定为人机对战(PVE),电脑走棋是随机的。 ...
    99+
    2024-04-02
  • 用C语言实现简单五子棋小游戏
    本文实例为大家分享了C语言实现简单五子棋小游戏的具体代码,供大家参考,具体内容如下 在vs2019创建新项目,然后添加两个源文件test.c和game.c,接着创建一个头文件game...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作