栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

07 14 C语言五子棋小项目的实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

07 14 C语言五子棋小项目的实现

小项目:五子棋
    需要的数据:
        1、定义字符数组棋盘 15*15
        2、定义变量用于记录落子的位置
        3、定义一个变量记录棋子角色  黑棋 '@' 白棋 '$'
    业务逻辑:
        定义需要数据
        是否需要对数据进行初始化
        for(;;)
        {
            1、清理屏幕、显示棋盘
            2、落子
                坐标要合法、该位置不能有棋子
                否则继续重新落子
            3、检查是否五子连珠
                是,结束游戏
            4、交换角色
        }

#include 
#include 
#include 

//棋盘数组
char board[15][15]={};
//棋子坐标
int man_x=0,man_y=0;
//棋子 黑“@” 白“$”
int man='@';

//初始化棋盘
void initialize(void);

//显示棋盘
void print_board(void);

//落子
void drop(void);

//检查是否五子连珠
bool is_win(void);
int is_win_count(int num1,int num2);

int main(int argc,const char* argv[])
{
    initialize();
    for(int i=0;i<225;i++)
    {
        print_board();
        drop();
        if(is_win())
        {
            print_board();
            printf("%c赢,游戏结束",board[man_x-1][man_y-1]);
            return 0;
        }
        //交换角色
        man = '@'==man?'$':'@';
    }
}

void initialize(void)       //初始化棋盘
{
    for(int i=0;i<15;i++)
    {
        for(int j=0;j<15;j++)
        {
            board[i][j]='*';
        }
    }
}

void print_board(void)      //显示棋盘
{
    system("clear");
    printf("0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15n");
    for(int i=0;i<15;i++)
    {
        printf("%-2d ",i+1);
        for(int j=0;j<15;j++)
        {
            printf("%c  ",board[i][j]);
        }
        printf("n");
    }
}

void drop(void)     //落子
{
    printf("请%c输入棋子的位置:",man);
    scanf("%d%d",&man_x,&man_y);
    for(;;)
    {
        //检验坐标是否合法
        if(man_x>15 || man_x<1 || man_y>15 || man_x<1)
        {
            printf("该坐标不合法,请重新输入%c的位置:",man);
            scanf("%d%d",&man_x,&man_y);
        }
        //检查是否有棋子
        else if(board[man_x-1][man_y-1] != '*')
        {
            printf("该做标已经被占据,请重新输入%c的位置:",man);
            scanf("%d%d",&man_x,&man_y);
        }
        else
        {
            board[man_x-1][man_y-1]=man;
            break;
        }
    }
}


bool is_win(void)       //检查是否五子连珠
{
    if(is_win_count(1,0)+is_win_count(-1,0)>=4)
        return true;
    if(is_win_count(0,1)+is_win_count(0,-1)>=4)
        return true;
    if(is_win_count(1,1)+is_win_count(-1,-1)>=4)
        return true;
    if(is_win_count(-1,1)+is_win_count(1,-1)>=4)
        return true;
    return false;
}

int is_win_count(int num1,int num2)
{
    int count=0;
    int x=num1;
    int y=num2;
    for(;;)
    {
        if(man_x-1+x<0 ||man_x-1+x>=15||man_y-1+y<0||man_y-1+y>=15)
        {
            break;
        }
        if(board[man_x-1+x][man_y-1+y]==board[man_x-1][man_y-1])
        {
            count++;
            x=x+num1;
            y=y+num2;
        }
        else
        {
            break;
        }
    }
    return count;

优化:引入了光标

  1 #include 
  2 #include 
  3 #include 
  4 #include 
  5 
  6 //棋盘数组
  7 char board[15][15]={};
  8 //棋子坐标
  9 int man_x=7,man_y=7;
 10 //棋子 黑“@” 白“$”
 11 int man='@';
 12 
 13 //初始化棋盘
 14 void initialize(void);
 15 
 16 //显示棋盘
 17 void print_board(void);
 18 
 19 //落子
 20 void drop(void);
 21 
 22 //检查是否五子连珠
 23 bool is_win(void);
 24 int is_win_count(int num1,int num2);
 25 
 26 int main(int argc,const char* argv[])
 27 {   
 28     initialize();
 29     for(int i=0;i<225;i++)
 30     {
 31         print_board();
 32         drop();
 33         if(is_win())
 34         {
 35             print_board();
 36             printf("%c赢,游戏结束",board[man_x][man_y]);
 37             return 0;
 38         }
 39         //交换角色
 40         man = '@'==man?'$':'@';
 41     }
 42 }
 43 
 44 void initialize(void)       //初始化棋盘
 45 {
 46     for(int i=0;i<15;i++)
 47     {
 48         for(int j=0;j<15;j++)
 49         {
 50             board[i][j]='*';
 51         }
 52      
 53 }
 54 
 55 void print_board(void)      //显示棋盘
 56 {
 57     system("clear");
 58     for(int i=0;i<15;i++)
 59     {
 60         for(int j=0;j<15;j++)
 61         {
 62             printf(" %c",board[i][j]);
 63         }
 64         printf("n");
 65     }
 66 }
 67 
 68 void drop(void)     //落子
 69 {
 70     printf("请%c落子",man);
 71     for(;;)
 72     {
 73         printf("33[%d;%dH",man_x+1,(man_y+1)*2);
 74         switch(getch())
 75         {
 76             case 183:   man_x>0   && man_x--;   break;
 77             case 184:   man_x<14  && man_x++;   break;
 78             case 186:   man_y>0   && man_y--;   break;
 79             case 185:   man_y<14  && man_y++;   break;
 80             case 10:
 81                 if(board[man_x][man_y]=='*')
 82                 {
 83                     board[man_x][man_y]=man;
 84                     return;
 85                 }
 86                 break;
 87         }
 88     }
 89 }
 90 
 91 
 92 bool is_win(void)       //检查是否五子连珠
 93 {
 94     if(is_win_count(1,0)+is_win_count(-1,0)>=4)
 95         return true;
 96     if(is_win_count(0,1)+is_win_count(0,-1)>=4)
 97         return true;
 98     if(is_win_count(1,1)+is_win_count(-1,-1)>=4)
 99         return true;
100     if(is_win_count(-1,1)+is_win_count(1,-1)>=4)
101         return true;
102     return false;
103 }
104 
105 int is_win_count(int num1,int num2)
106 {
107     int count=0;
108     int x=num1;
109     int y=num2;
110     for(;;)
111     {
112         if(man_x+x<0 ||man_x+x>=15||man_y+y<0||man_y+y>=15)
113         {
114             break;
115         }
116         if(board[man_x+x][man_y+y]==board[man_x][man_y])
117         {
118             count++;
119             x=x+num1;
120             y=y+num2;
121         }
122         else
123         {
124             break;
125         }
126     }
127     return count;
128 }

 

 

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015518.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号