IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 07 14 C语言五子棋小项目的实现 -> 正文阅读

[C++知识库]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 }

?

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:02:42  更:2022-07-17 16:07:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/14 0:48:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码