| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 622 人关注过本帖, 1 人收藏
标题:五子棋,咋结束不了捏~【已完结】
只看楼主 加入收藏
NET_雷
Rank: 1
等 级:新手上路
帖 子:14
专家分:5
注 册:2013-4-7
结帖率:0
收藏(1)
 问题点数:0 回复次数:7 
五子棋,咋结束不了捏~【已完结】
//五子棋的棋盘是15*15
#include <stdio.h>
#include <ctype.h>
const int SIZE = 15;
const char player_c = '@';
const char computer_c = 'O';


void display(char board[][SIZE]);
int valid_moves(char board[][SIZE],int row,char col);
int five(char board[][SIZE], int row, int col,char play_c);
int check(char board[][SIZE], char play_c);

int main(void)
{
    char board[SIZE][SIZE] = {0};
    int x = 0;
    char y = 0;
    bool next_player = true;
    char go = 'n';
    //游戏主体循环
    do
    {
        //初始化棋盘
        for(int row = 0;row < SIZE; row++)
            for(int col = 0; col < SIZE; col++)
                board[row][col] = ' ';
        next_player=!next_player;
        do
        {
            display(board);
            if(next_player = !next_player)
            {//这是你的回合
                //读取坐标
                printf("请输入你要下的坐标:");
                fflush(stdin);
                scanf("%d%c",&x,&y);
                //转化成数组的下标
                x -= 1;
                y -= 'a';
                //检查这一步是否可行
                for(;!(valid_moves(board,x,y));)
                {
                    printf("\n这一步不可行,请重新走:");
                    scanf("%d%c",&x,&y);
                    x -= 1;
                    y -= 'a';
                }
                //执行这一步
                board[x][y]=player_c;
               
            }
            else
            {//这是我的回合
               
                fflush(stdin);
                printf("请输入你要下的坐标:");
                scanf("%d%c",&x,&y);
                //转化成数组的下标
                x -= 1;
                y -= 'a';
                //检查这一步是否可行
                while(!valid_moves(board,x,y))
                {
                    printf("\n这一步不可行,请重新走:");
                    scanf("%d%c",&x,&y);
                    x -= 1;
                    y -= 'a';
                }
                //执行这一步
                board[x][y]=computer_c;
               
            }
        }while(check(board,next_player?player_c:computer_c));//check函数用来检查该玩家有没有赢得胜利
            //显示到底谁赢得了游戏
        display(board);
            if(next_player)
                printf("\n@玩家取得了胜利");
            else
                printf("\nO玩家胜利");
            //决定是否继续游戏
        printf("\n还想再来一次么?(y/n):");
        fflush(stdin);
        scanf("%c",&go);
    }while(tolower(go)=='y');
   
}

void display(char board[][SIZE])
{
    char col_label = 'a';
    int row_label = 1;
    //打印首行
    printf("\n  ");
    for(int col = 0; col < SIZE; col++)
        printf(" %2c ",col_label++);
    printf("\n  ");
    printf("+");
    for(int col = 0;col < SIZE; col++)
        printf("---+");

    //打印下面的
    for(int row = 0;row < SIZE; row++)
    {
        printf("\n%2d",row_label++);
        for(int col = 0;col < SIZE; col++)
            printf("| %c ",board[row][col]);
        printf("|");
        printf("\n  +");
        for(int col = 0;col < SIZE; col++)
            printf("---+");
    }
    printf("\n  ");
}

int valid_moves(char board[][SIZE], int row, char col)
{
    if(row<0 || row>SIZE || col<0 || col >SIZE || (board[row][col]!=' '))
        return 0;
    else
        return 1;
}

int check(char board[][SIZE],char play_c)
{
    for(int row = 0; row < SIZE; row++)
        for(int col = 0; col < SIZE; col++)        //检查棋盘上的没一个元素
        {
            if(board[row][col]==play_c)        //如果这个元素是你的棋子,就进行检查
            {
                if(five(board,row,col,play_c))//是否有方向连成五个
                    return 0; //如果有五子连珠就返回0表示游戏结束
                else
                    continue;//游戏没有结束,内层循环继续
            }
            else                        //如果这个元素不是你的棋子,就跳过这个元素
                continue;
        }
    return 1;    //游戏没有结束,继续执行
}

int five(char board[][SIZE],int row,int col, char play_c)
{
    for(int row_delta = -1; row_delta<=1; row_delta++)            //搜索八个方向以及自身
        for(int col_delta = -1; col_delta<=1; col_delta++)
        {
            int count = 1;//每次循环都会初始化一次count,因为刚开始就有一个棋子,所以count是1
            if(row+row_delta<0 || row+row_delta>SIZE || col+col_delta<0 ||
                col+col_delta>SIZE || (row_delta==0 && col_delta==0))
                continue;            //跳过超出边界以及自己;
            if(board[row+row_delta][col+col_delta]==play_c)    //如果下一个方向是自己的棋子就开始检查
            {//这个没有进行测试;
               
                int x = row+row_delta;
                int y = col+col_delta; //定义x,y到该方向的第一个棋子上
                count++;            //找到了一个相同的棋子count+1
               
                for(;;)
                {
                    x += row_delta;
                    y += col_delta;        //该方向上去检查
                    
                    if(x<0 || x>SIZE || y<0 || y>SIZE)
                        break;            //超出边界则退出该方向的检查
                    
                    if(board[x][y]!=play_c)
                        break;            //如果下一个元素不是自己的棋子,同样退出循环
                    else
                        count++;        //是自己棋子的话就给count+1
                }
                                //某方向检测完毕
                if(count>=5)
                    return 1;            //一旦该方向count数达到5就返回连成五个棋子
            }
        }
        return 0;        //如果所有方向都检测完却没有return则没有五子连珠,就要return 0;
}


嗷嗷嗷啊~版主大人我爱死你了!

[ 本帖最后由 NET_雷 于 2013-5-22 16:53 编辑 ]
搜索更多相关主题的帖子: include display 五子棋 
2013-05-21 19:36
YJ_Hao
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:215
专家分:609
注 册:2013-3-22
收藏
得分:0 
编译就出错了,下不了!
2013-05-21 20:00
hsjjgm
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:189
注 册:2013-4-27
收藏
得分:0 
看得似懂非懂。。

2013-05-21 20:08
NET_雷
Rank: 1
等 级:新手上路
帖 子:14
专家分:5
注 册:2013-4-7
收藏
得分:0 
回复 2楼 YJ_Hao
那个。。你用的是vc6.0吧?  2010和6.0有些地方不太一样,比如bool类型6.0里就没有。
2013-05-21 20:11
NET_雷
Rank: 1
等 级:新手上路
帖 子:14
专家分:5
注 册:2013-4-7
收藏
得分:0 
回复 3楼 hsjjgm
2013-05-21 20:11
NET_雷
Rank: 1
等 级:新手上路
帖 子:14
专家分:5
注 册:2013-4-7
收藏
得分:0 
求大神回复,拜谢啊!!!!!!!我都快哭了
2013-05-21 21:39
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
你把你的five函数好好检查下,和思路是否一样


[fly]存在即是合理[/fly]
2013-05-22 07:56
NET_雷
Rank: 1
等 级:新手上路
帖 子:14
专家分:5
注 册:2013-4-7
收藏
得分:0 
回复 7楼 azzbcc
太感谢大大了,现在能执行下去了,每一步都好好写注释很重要啊,嗯嗯~就是胜利条件的检查貌似出问题了,游戏结束不了。。我在检查检查
2013-05-22 13:11
快速回复:五子棋,咋结束不了捏~【已完结】
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.059358 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved