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

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

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

//棋盘数组
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 15\n");
    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 <stdio.h>
  2 #include <stdlib.h>
  3 #include <stdbool.h>
  4 #include <getch.h>
  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 }

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值