返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >使用C语言实现五子棋游戏
  • 106
分享到

使用C语言实现五子棋游戏

C语言五子棋 2022-11-13 14:11:47 106人浏览 八月长安
摘要

目录一、实现的目的和意义二、实现内容描述三、实现原理四、实现模块五子棋实现分为三大模块五、模块代码分析六、实现结果七、总结本文实例为大家分享了C语言实现五子棋游戏的具体代码,供大家参

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

一、实现的目的和意义

1、巩固和加深对c语言知识的理解
2、学会使用编译器的各种调试
3、提高解决实际问题的能力

二、实现内容描述

实现简单的人人对战五子棋,此设计用的是C语言去实现

三、实现原理

采用二位数组保存棋盘信息,棋盘上面的任何一个位置,里头可以放三个信息:

1、空
2、用户1的落子
3、用户2的落子

下棋就是在二维数组种找对应的空位置,进行落子,落完之后立即就要判断落子位置是否有五字连珠,从而判断谁数输谁赢。每走一次棋会有四种情况:

*用户1赢
*用户2赢
*平局(这里说的平局是棋盘被占满的情况)
*没有出结果 意思就是时此用户没赢 下个用继续去下棋

四、实现模块五子棋实现分为三大模块

文件名                       作用
five_chress.h       五子棋的函数声明,头文件声明等
five_chress.c       五子棋函数接口的实现
main.c              五子棋函数测试功能

五、模块代码分析

1、five_chress.h

#pragma once
#include <stdio.h>
#include <string.h>
#include<windows.h>
#define ROW 10//数组号行号 按需求调整
#define COL 10//数组列数 按需求调整
#define PLAYER1 1//玩家编号,默认棋盘数据是0,玩家1落子,该位置被改成1
#define PLAYER2 2//玩家编号,默认棋盘数据是0,玩家2落子,该位置被改成2
#define NEXT        0//游戏继续
#define PLAYER1_WIN 1//玩家1赢
#define PLAYER2_WIN 2//玩家2赢
#define DRAW        3//平局

   enum Dir{
    LEFT,
    RIGHT,
    UP,
    DOWN,
    LEFT_UP,
    LEFT_DOWN,
    RIGHT_UP,
    RIGHT_DOWN
    };//用枚举去表示4个方向,上下,左右,左上右下,右上左下,统计用户当前棋子四个方向的棋数是否为大于等于5
    void Menu();//实现菜单
    void Game();//构建游戏入口Game()函数      

2、five_chress.c

#include "five_chress.h"

int x = 0;
int y = 0;

void Menu()
{
    printf("############################\n");
    printf("## 1. Play        0. Exit ##\n");
    printf("############################\n");
    printf("Please Select# ");
}

//按照x,y作为起点,按照特定的方向,求连续相对的最大格式
int ChessCount(int board[][COL], int row, int col, enum Dir d)
{
    int _x = x - 1; //从1
    int _y = y - 1; //从1

    int count = 0;
    while (1){
        switch (d){
        case LEFT://从当前位置向左移动统计 横坐标不变 纵坐标变了 所以是y--
            _y--;
            break;
        case RIGHT://从当前位置向右移动统计 横坐标不变 纵坐标变了 所以是_y++
            _y++;
            break;
        case UP://从当前位置向上移动统计 纵坐标不变 横坐标变了 所以是_x--
            _x--;
            break;
        case DOWN://从当前位置向下移动统计 纵坐标不变 横坐标变了 所以是_x++
            _x++;
            break;
        case LEFT_UP://从当前位置向左上移动统计 纵,横变都变了 所以是_x--,_y--
            _x--, _y--;
            break;
        case LEFT_DOWN://从当前位置左下移动统计 纵,横坐标都变了 所以是_x++,_y--
            _x++, _y--;
            break;
        case RIGHT_UP://从当前位置右上移动统计 纵,横坐标都变了 所以是_x--,_y++-
            _x--, _y++;
            break;
        case RIGHT_DOWN://从当前位置右下移动统计 纵,横坐标都变了 所以是_x++,_y++
            _x++, _y++;
            break;
        default:
            //Do Nothing
            break;
        }
        if (_x < 0 || _x > row - 1 || _y < 0 || _y > col - 1){
            break;/表示越界了就停止
        }
        //合法
        if (board[x - 1][y - 1] == board[_x][_y]){
            count++;//统计从旧位置出发统计和他一样的个数
        }
        else{
            break;//如果碰到不一样的就终止循环
        }
    }
    return count;//返回统计个数
}

//4种情况
//NEXT:表明要继续
//PLAYER1_WIN: 用户1赢了
//PLAYER2_WIN:用户2赢了
//DRAW: 平局
int IsOver(int board[][COL], int row, int col)
{
    
    int count1 = ChessCount(board, row, col, LEFT) + ChessCount(board, row, col, RIGHT) + 1; //?
    int count2 = ChessCount(board, row, col, UP) + ChessCount(board, row, col, DOWN) + 1; //?
    int count3 = ChessCount(board, row, col, LEFT_UP) + ChessCount(board, row, col, RIGHT_DOWN) + 1; //?
    int count4 = ChessCount(board, row, col, LEFT_DOWN) + ChessCount(board, row, col, RIGHT_UP) + 1; //?

    if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5){
        //有五子连珠
        //一定有人赢
        //x, y
        if (board[x - 1][y - 1] == PLAYER1){
            return PLAYER1_WIN;
        }
        else{
            return PLAYER2_WIN;
        }
    }

    int i = 0;
    for (; i < row; i++){
        int j = 0;
        for (; j < col; j++){
            if (board[i][j] == 0){
                return NEXT;//当前位置还没有被填写棋盘不满 当前用户没有赢返回next  让下个用户继续下
            }
        }
    }

    return DRAW;//最后一种情况棋盘满了 为平局
}

void ShowBoard(int board[][COL], int row, int col)
{
    //printf("\e[1;1H\e[2J");这是linux环境下用的清屏
    //讲数组内容,进行可视化
    system("cls");//vs环境下用的清屏
    
    int i = 0;
    for (i=1; i <= col; i++){
        printf("%3D", i);
    }
    printf("\n");

    for (i = 0; i < row; i++){
        int j = 0;
        printf("%2d",i + 1 );
        for (; j < col; j++){
            if (board[i][j] == 0){
                printf(" . ");
            }
            else if (board[i][j] == PLAYER1){
                printf(" x ");
            }
            else{
                printf (" y ");
            }
        }
        printf("\n");
    }
}

void PlayerMove(int board[][COL], int row, int col, int who)
{
    while (1){
        printf("Player[%d] Please Enter Your Pos# ", who);
        scanf("%d %d", &x, &y);
        if (x < 1 || x > row || y < 1 || y > col){
            printf("Pos Is Not Right!\n");
            continue;
        }
        else if (board[x - 1][y - 1] != 0){
            printf("Pos Is Occupied!\n");
            continue;
        }
        else{
            //合法性,去重
            board[x - 1][y - 1] = who;
            break;
        }
    }
}

void Game()
{
    int board[ROW][COL];
    memset(board, 0, sizeof(board));
    int result = NEXT;
    do{
        ShowBoard(board, ROW, COL);//显示棋盘
        PlayerMove(board, ROW, COL, PLAYER1);//Player1先走
        result = IsOver(board, ROW, COL);//判断游戏是否结束
        if (NEXT != result){
            break;//如果返回值不等于NEXT就跳出循环 说明当前用户赢了或者平局 如果=NEXT 下个用户继续下
        }
        ShowBoard(board, ROW, COL);//同上
        PlayerMove(board, ROW, COL, PLAYER2);
        result = IsOver(board, ROW, COL);
        if (NEXT != result){
            break;
        }
    } while (1);
    //p1 win, p2 win, draw
    switch (result){
    case PLAYER1_WIN:
        ShowBoard(board, ROW, COL);
        printf("恭喜用户1,你已经赢了!\n");
        break;
    case PLAYER2_WIN:
        printf("恭喜用户2,你已经赢了!\n");
        break;
    case DRAW:
        printf("平局\n");
        break;
    default:
        //do nothing!
        break;
    }
}

分析:

我们要先构建游戏入口void game()函数在里面构建上层本调用框架 例如一开始初始化数组把每个位置都置为0,然后构建调用框架:

1、我们要保存二位数组并可视化 就要构建ShowBoard函数;
2、之后 我们要让用户下棋 就要构建PlayerMove()函数
3、第一个用户下完之后就要立马判断当前用户是否赢,因为落子和判定是强相关的 这时候要构建 IsOver()函数
如果此用户没赢 那二个用户继续下。
当我们这些函数逻辑都明确好的时候 就用分而治之思想 ,实现他们的功能。
* 1、ShowBoard()函数里面我用到了一个c语言里面的清屏函数printf(“cls”);引上头文件window.h,这个的作用是在固定地方刷新视图,把上次的视图清理掉 ,显示当前位置视图。
后面就打印视图的内容。用户一和用户二可以用字符表示,也可以用圆圈图案表示这个图案可以在网上找复制一下就可
*2、 Playermove()函数让用户下棋,里面先考虑它的合法性 ,不能越界和重复,再然后用我们在five_chrsss.h文件定义宏来赋值 ,赋完之后再终止循环。
*3、 Isover()函数里面是让我们判断谁输谁赢 换句话游戏是否结束。游戏结束标志是分为四种情况。用户一赢,用户二赢,平局,继续。前两种情况则需要判断从当前位置出发 沿四个方向当前用户棋的个数是否为大于等于5,在判断一下是哪个用户的棋 就返回哪个用户。 而这判断需要在构建并调用ChressCount()函数去统计当前用户的个数是否大于等于5,有4个方向,例如上和下为一个方向,左和右为一个方向,左上和右下为一个方向,右上和左下为一个方向,分别各自相加之后在加上1就是当前的棋,如果满足这个4个方向大于等于5的一个条件,我们就能知道一定有人赢,否则在继续判断周围是否有空位置,有则返回NEXT让下个用户继续下,没有则返回平局*ChressCoun()函数具体分析请看代码块

这些函数实现完之后再在Game()函数里面来个Switch循环,来结收宏 去打印谁赢 还是平局。

3、main.c

#include "five_chress.h"

int main()
{
    int quit = 0;
    int select = 0;
    while (!quit){
        Menu();
        scanf("%d", &select);
        switch (select){
        case 1:
            Game();
            break;
        case 0:
            quit = 1;
            printf("ByeBye!\n");
            break;
        default:
            printf("Enter Error, Try Again!\n");
            break;
        }
    }

    return 0;
}

main函数作为测试入口,相比较里面的逻辑是很简单的,创建一个菜单函数和调用一个Game函数,再增添点其他的内容。

六、实现结果

七、总结

实现五子棋给我最大的体会是应用比理论学习难得多,首先要逻辑清楚,也会涉及到各种实际问题,但是加深了我对知识的理解和运用,也知道了只有多练习 多写代码才能更好的提升编程技术。同时我也学到了实现一个复杂的项目时,先去构建一个框架,一个清晰的逻辑。再去逐个击破每个问题,要学会用分而治之的思想去解决问题。

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

--结束END--

本文标题: 使用C语言实现五子棋游戏

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

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

猜你喜欢
  • 使用C语言实现五子棋游戏
    目录一、实现的目的和意义二、实现内容描述三、实现原理四、实现模块五子棋实现分为三大模块五、模块代码分析六、实现结果七、总结本文实例为大家分享了C语言实现五子棋游戏的具体代码,供大家参...
    99+
    2022-11-13
    C语言 五子棋
  • 用C语言实现五子棋游戏
    C语言写五子棋,使用多文件形式,使用代码看起来更好看;在这里我实现的功能是双人博弈,如果要实现人机对战,那么代码就会很复杂; 一.main.c 在主调函数中首先要提供一个给用户选择的...
    99+
    2024-04-02
  • 用C语言实现五子棋小游戏
    简介 本次五子棋使用的是光标控制移动,通过按空格键(键值32)来落子,实现游戏的。 我们额外用到的头文件有: #include<getch.h>  Q...
    99+
    2024-04-02
  • 利用C语言实现五子棋游戏
    本文实例为大家分享了C语言实现五子棋游戏的具体代码,供大家参考,具体内容如下 一、前言 本文将先介绍五子棋运行所需要的函数,最后串联成完整代码。 我们需要实现的功能有:1.菜单men...
    99+
    2024-04-02
  • 怎么用C语言实现五子棋游戏
    这篇文章主要介绍“怎么用C语言实现五子棋游戏”,在日常操作中,相信很多人在怎么用C语言实现五子棋游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言实现五子棋游戏”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • C语言实现双人五子棋游戏
    本文实例为大家分享了C语言实现双人五子棋游戏的具体代码,供大家参考,具体内容如下 实现功能 生成棋盘玩家1与玩家2对战,哪个玩家率先有连续5子连线,哪个玩家赢。 如何实现 组成: ...
    99+
    2024-04-02
  • C语言实现简单五子棋游戏
    在生活中五子棋是一个十分普遍的一款游戏,今天让我们一起来实现这款游戏。 1.初始化棋盘 char ret; //数据存储在一个二维数组中,玩家下去*,电脑下去#. char ...
    99+
    2024-04-02
  • 如何使用C语言实现五子棋小游戏
    这篇文章主要介绍如何使用C语言实现五子棋小游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!需要的数据:(全局)定义棋盘二维数组 15* 15 空位置 ' * '2、定义棋子角色变量 白棋为 '...
    99+
    2023-06-20
  • 用C语言实现简单五子棋小游戏
    本文实例为大家分享了C语言实现简单五子棋小游戏的具体代码,供大家参考,具体内容如下 在vs2019创建新项目,然后添加两个源文件test.c和game.c,接着创建一个头文件game...
    99+
    2024-04-02
  • C语言实现简易五子棋小游戏
    本文实例为大家分享了C语言实现简单五子棋小游戏的具体代码,供大家参考,具体内容如下 效果图如下: 设计思路: 棋盘设计为15×15格,初始状态光标在棋盘的中央,白棋先走...
    99+
    2024-04-02
  • C语言实现简单的五子棋游戏
    本文实例为大家分享了c语言实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 环境vs2017 一、游戏设计思想 1.该代码设置为 玩家1(*) vs 玩家2(O) 2.选择玩游...
    99+
    2024-04-02
  • C语言五子棋小游戏实现代码
    本文实例为大家分享了C语言实现五子棋小游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<windows.h> #...
    99+
    2022-11-13
    C语言 五子棋
  • 怎么利用C语言实现AI五子棋游戏
    本篇内容介绍了“怎么利用C语言实现AI五子棋游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录一.如何实现二.实现代码及分析(1)菜单的...
    99+
    2023-06-20
  • 怎么用C语言实现简单五子棋游戏
    这篇文章主要介绍“怎么用C语言实现简单五子棋游戏”,在日常操作中,相信很多人在怎么用C语言实现简单五子棋游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言实现简单五子棋游戏”的疑惑有所帮助!接下来...
    99+
    2023-06-25
  • 使用C语言实现三子棋游戏
    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 先简单介绍一下我的三子棋小游戏是怎么玩的,就是自己跟电脑pk,只不过电脑没这么智能。自己输入想要下的坐标...
    99+
    2024-04-02
  • C语言实现控制台五子棋小游戏
    这是一个用C语言实现的控制台小游戏—-五子棋,棋盘大小和获胜棋子数目是用宏定义的,可以自定义,所以可以轻松改为三子棋、六子棋等等。此游戏设定为人机对战(PVE),电脑走棋是随机的。 ...
    99+
    2024-04-02
  • C语言版五子棋游戏的实现代码
    这次看了几位大佬的做法,我们也做了很多修改尝试。算是第一次尝试合作完成项目。 我认为学到的东西: 1、第一次尝试写项目,把函数分到不同的.c文件中后更好看了一些。 2、在研究过程中应...
    99+
    2024-04-02
  • 基于C语言实现简单五子棋游戏
    本文实例为大家分享了C语言实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 五子棋大家都玩儿过,所以规则就不介绍了 今天遇到一个学弟在实现的时候遇到一些问题,所以将实现的过程记...
    99+
    2024-04-02
  • C语言实现简单的五子棋小游戏
    本文实例为大家分享了C语言实现五子棋小游戏的具体代码,供大家参考,具体内容如下 我们需要一个二维数组去储存当前的棋盘状态,然后打印出来。 我们游戏的逻辑是初始化棋盘,打印棋盘,人下棋...
    99+
    2024-04-02
  • C++实现五子棋小游戏
    本文实例为大家分享了C++实现五子棋小游戏的具体代码,供大家参考,具体内容如下 思路:先用用system(“color 70”)改变控制台的背景色为灰白色,前...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作