马上五一了,带大家玩一下五子棋——C语言

这篇具有很好参考价值的文章主要介绍了马上五一了,带大家玩一下五子棋——C语言。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

五一祝福

因为这篇博文实在五一这天完成的,所以呢,在介绍五子棋之前,先祝各位支持小白的大佬都五一快乐!
花了点时间下了个“五一快乐”的五子棋,哈哈哈哈哈哈,还不太熟练,所以写的有点丑,勉强过的去就行,不知道佬们看不看得出来,还是说实在一点都不像,不过没关系,佬们阅读了之后希望可以给我修正一下,去玩玩。那个’乐‘字确实没整好,哈哈哈,看起来超别扭
如下图所示:
马上五一了,带大家玩一下五子棋——C语言
祝福送给打架了之后就让我们来说一说正文吧。

五子棋的实现

五子棋的实现分为一下几个功能的实现:

  1. 首先是先构建棋盘,我们这里用了一个二维数组chessboard来对我们的棋盘进行初始化和放置棋子
  2. 实现展示棋盘的函数void ShowChessBoard(int board[ROW][COL])
  3. 玩家1下棋,我们用函数void PlayerMove(int board[ROW][COL], int who)来实现,后面那个参数who 传的是谁就是到谁下棋
  4. 玩家1下棋之后棋盘会有变化,我们要对棋局进行判断是否达成了五子连珠,或者说整个棋盘的棋子都放满了还没结束,那就是平局,否则就是继续进行棋局,我们用函数int IsOver(int board[ROW][COL])来进行判断,其中这个函数的判断方法是通过调用函数int ChessCount(int board[ROW][COL], enum Dir d)来判断每下一步棋之后该位置的八个方向都进行判断,看是否达成其中至少有一个方向满足五子连珠来判断当前棋局的情况
  5. 玩家2下棋,将第3 ,4中的玩家1变成玩家2重复上述第3 , 4步。

1 菜单

代码实现:

void menu()
{
    printf("****************************\n");
    printf("******1. 开始   0.退出******\n");
    printf("****************************\n");
    printf("请选择 :> ");

}

2.展示棋盘

代码实现:

void ShowChessBoard(int board[ROW][COL])
{
    printf("\033c");
    printf("玩家1——●\n");
    printf("玩家2——○\n");
    printf("\n\n  ");
    //打印y坐标轴
    for (int i = 0; i < COL; i++) {
        printf("%3d", i);
    }
    printf("\n");
    for (int i = 0; i < ROW; i++) {
        printf("%3d", i);//打印x坐标轴
        for (int j = 0; j < COL; j++) {
            if (board[i][j] == Player1) {
                //player1
                printf(" ●");//用黑棋表示玩家1的棋子
            }
            else if (board[i][j] == Player2) {
                //player2
                printf(" ○");//用白棋表示玩家2的棋子
            } 
            else {
                //Space
                printf(" + ");//空余部分默认为'+'
            }
        }
        printf("\n");
    }
}

3.玩家下棋

代码实现:

void PlayerMove(int board[ROW][COL], int who)
{
    while (1) {
        printf("\n玩家[%d] 请输入你需要下棋的位置:> ", who);
        scanf("%d %d", &x, &y);//输入一个下棋的坐标
        if (x<0 || y > COL) {
            printf("非法坐标,重新输入!\n");
        }
        else if (board[x][y] != 0) {
            printf("该位置已被占用!\n");
        }
        else {
            board[x][y] = who;//把下棋的玩家对应的常量值赋值给该位置对应的值
            break;
        }
    }
}

4.统计下棋位置所对应的同种棋子的个数

代码实现:

int ChessCount(int board[ROW][COL], enum Dir d)
{
    int _x = x;
    int _y = y;

    int count = 0;
    while (1) {
        switch (d) {
        case LEFT:
            _y--;
            break;
        case RIGHT:
            _y++;
            break;
        case UP:
            _x--;
            break;
        case DOWN:
            _x++;
            break;
        case LEFT_UP:
            _x--, _y--;
            break;
        case RIGHT_DOWN:
            _x++, _y++;
            break;
        case RIGHT_UP:
            _x--, _y++;
            break;
        case LEFT_DOWN:
            _x++, _y--;
            break;
        }
        if (_x < 0 || _x > ROW - 1 || _y < 0 || _y > COL - 1) {
            break;
        }//对下的棋子位置进行八个方向位置的连续的同种棋子个数进行统计
        if (board[x][y] == board[_x][_y]) {
            count++;
        }
        else {
            break;
        }
    }
    return count;
}

5.判断棋局是否结束

代码实现:

int IsOver(int board[ROW][COL])
{
    //将八个方向对应的同种棋子转变为统计四条直线上对应的同种棋子总数
    int count1 = ChessCount(board, LEFT) + ChessCount(board, RIGHT) + 1;
    int count2 = ChessCount(board, UP) + ChessCount(board, DOWN) + 1;
    int count3 = ChessCount(board, LEFT_UP) + ChessCount(board, RIGHT_DOWN) + 1;
    int count4 = ChessCount(board, LEFT_DOWN) + ChessCount(board, RIGHT_UP) + 1;
    //只要有一个方向连续的同种棋子数满足大于等于5个,那么相对应的玩家获得胜利
    if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5) {
        if (board[x][y] == Player1) {
            return PLAYER1_WIN;
        }
        else {
            return PLAYER2_WIN;
        }
    }
    //否则如果棋盘还没下满,也就是只要还有位置没放棋子,则对局继续
    for (int i = 0; i < ROW; i++) {
        for (int j = 0; j < COL; j++) {
            if (board[i][j] == 0) {
                return CONTINUE;
            }
        }
    }
    //以上情况都不符合那就是平局
    return DROW;
}

6.将以上函数功能进行结合的game 函数

代码实现:

void game()
{
	 //初始化
    int chessboard[ROW][COL];
    memset(chessboard, '\0', sizeof(chessboard));
    //判断结果的变量,默认初始化为对局继续
    int result = CONTINUE;
    do {
        ShowChessBoard(chessboard);
        PlayerMove(chessboard, Player1);
        result = IsOver(chessboard);
        if (CONTINUE != result) {
            break;
        }
        ShowChessBoard(chessboard);
        PlayerMove(chessboard, Player2);
        result = IsOver(chessboard);
        if (CONTINUE != result) {
            break;
        }
    } while (1);

    ShowChessBoard(chessboard);
    switch (result) {
    case PLAYER1_WIN:
        printf("恭喜玩家1获胜!\n");
        break;
    case PLAYER2_WIN:
        printf("恭喜玩家2获胜了!\n");
        break;
    case DROW:
        printf("平局,不服可以再战!\n");
        break;
    }
}

完整代码

game.h
#pragma once

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

#define ROW 30               
#define COL 30
#define Player1 1
#define Player2 2
#define CONTINUE 0
#define PLAYER1_WIN 1
#define PLAYER2_WIN 2
#define DROW   3

enum dir
{
	LEFT,
	RIGHT,
	UP,
	DOWN,
	LEFT_UP,
	RIGHT_UP,
	LEFT_DOWN,
	RIGHT_DOWN
};


void menu();

void game();

void ShowChessBoard(int chessboard[ROW][COL]);

int IsOver(int chessboard[ROW][COL]);

void PlayerMove(int chessboard[ROW][COL], int who);

int ChessCount(int chessboard[ROW][COL], enum dir d);




game.c
#include "game.h"

int x = 0;
int y = 0;

void menu()
{
    printf("****************************\n");
    printf("******1. 开始   0.退出******\n");
    printf("****************************\n");
    printf("请选择 :> ");

}

void ShowChessBoard(int board[ROW][COL])
{
    printf("\033c");
    printf("玩家1——●\n");
    printf("玩家2——○\n");
    printf("\n\n  ");
    //打印y坐标轴
    for (int i = 0; i < COL; i++) {
        printf("%3d", i);
    }
    printf("\n");
    for (int i = 0; i < ROW; i++) {
        printf("%3d", i);//打印x坐标轴
        for (int j = 0; j < COL; j++) {
            if (board[i][j] == Player1) {
                //player1
                printf(" ●");//用黑棋表示玩家1的棋子
            }
            else if (board[i][j] == Player2) {
                //player2
                printf(" ○");//用白棋表示玩家2的棋子
            } 
            else {
                //Space
                printf(" + ");//空余部分默认为'+'
            }
        }
        printf("\n");
    }
}
void PlayerMove(int board[ROW][COL], int who)
{
    while (1) {
        printf("\n玩家[%d] 请输入你需要下棋的位置:> ", who);
        scanf("%d %d", &x, &y);//输入一个下棋的坐标
        if (x<0 || y > COL) {
            printf("非法坐标,重新输入!\n");
        }
        else if (board[x][y] != 0) {
            printf("该位置已被占用!\n");
        }
        else {
            board[x][y] = who;//把下棋的玩家对应的常量值赋值给该位置对应的值
            break;
        }
    }
}

int ChessCount(int board[ROW][COL], enum Dir d)
{
    int _x = x;
    int _y = y;

    int count = 0;
    while (1) {
        switch (d) {
        case LEFT:
            _y--;
            break;
        case RIGHT:
            _y++;
            break;
        case UP:
            _x--;
            break;
        case DOWN:
            _x++;
            break;
        case LEFT_UP:
            _x--, _y--;
            break;
        case RIGHT_DOWN:
            _x++, _y++;
            break;
        case RIGHT_UP:
            _x--, _y++;
            break;
        case LEFT_DOWN:
            _x++, _y--;
            break;
        }
        if (_x < 0 || _x > ROW - 1 || _y < 0 || _y > COL - 1) {
            break;
        }//对下的棋子位置进行八个方向位置的连续的同种棋子个数进行统计
        if (board[x][y] == board[_x][_y]) {
            count++;
        }
        else {
            break;
        }
    }
    return count;
}

int IsOver(int board[ROW][COL])
{
    //将八个方向对应的同种棋子转变为统计四条直线上对应的同种棋子总数
    int count1 = ChessCount(board, LEFT) + ChessCount(board, RIGHT) + 1;
    int count2 = ChessCount(board, UP) + ChessCount(board, DOWN) + 1;
    int count3 = ChessCount(board, LEFT_UP) + ChessCount(board, RIGHT_DOWN) + 1;
    int count4 = ChessCount(board, LEFT_DOWN) + ChessCount(board, RIGHT_UP) + 1;
    //只要有一个方向连续的同种棋子数满足大于等于5个,那么相对应的玩家获得胜利
    if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5) {
        if (board[x][y] == Player1) {
            return PLAYER1_WIN;
        }
        else {
            return PLAYER2_WIN;
        }
    }
    //否则如果棋盘还没下满,也就是只要还有位置没放棋子,则对局继续
    for (int i = 0; i < ROW; i++) {
        for (int j = 0; j < COL; j++) {
            if (board[i][j] == 0) {
                return CONTINUE;
            }
        }
    }
    //以上情况都不符合那就是平局
    return DROW;
}

void game()
{
	 //初始化
    int chessboard[ROW][COL];
    memset(chessboard, '\0', sizeof(chessboard));
    //判断结果的变量,默认初始化为对局继续
    int result = CONTINUE;
    do {
        ShowChessBoard(chessboard);
        PlayerMove(chessboard, Player1);
        result = IsOver(chessboard);
        if (CONTINUE != result) {
            break;
        }
        ShowChessBoard(chessboard);
        PlayerMove(chessboard, Player2);
        result = IsOver(chessboard);
        if (CONTINUE != result) {
            break;
        }
    } while (1);

    ShowChessBoard(chessboard);
    switch (result) {
    case PLAYER1_WIN:
        printf("恭喜玩家1获胜!\n");
        break;
    case PLAYER2_WIN:
        printf("恭喜玩家2获胜了!\n");
        break;
    case DROW:
        printf("平局,不服可以再战!\n");
        break;
    }
}
test.c
#include "game.h"


int main()
{
    int input = 0;
    do
    {
        menu();
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("欢迎来到五子棋---玩家1vs玩家2\n");
            printf("祝您游戏愉快\n");
            game();
            break;
        case 0:
            printf("游戏已退出\n");
            break;
        default:
            printf("选择错误,请重新输入!\n");
            break;
        }
    } while (input);
    return 0;
}

好了,我们的五子棋实现就到这了,五一快乐哦~文章来源地址https://www.toymoban.com/news/detail-433698.html

到了这里,关于马上五一了,带大家玩一下五子棋——C语言的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python五子棋代码最简单的,python五子棋代码手机版

    大家好,本文将围绕python五子棋代码最简单的展开说明,python五子棋代码手机版是一个很多人都想弄明白的事情,想搞清楚python五子棋代码画棋盘需要先了解以下几个事情。 【实例简介】 【实例截图】 【核心代码】 \\\"\\\"\\\"五子棋之人机对战\\\"\\\"\\\" import sys import random import pygame from

    2024年01月19日
    浏览(43)
  • 中秋时节赏明月,五子棋戏月饼趣 — Flutter中秋限定版五子棋

    前言 当中秋时节来临,我们都期待着与亲人朋友共度这个美好的节日。这个时候,除了传统的赏月和品尝美味的月饼,我还有一个特别的建议——尝试一款有趣的Flutter五子棋游戏!这款五子棋游戏以中秋为主题,游戏的棋子也可爱地模仿了月饼和玉兔的形状,让我们在这个

    2024年02月06日
    浏览(57)
  • 五子棋游戏

    一。画出棋盘x和y  横和竖个15条线,画出中央的小点 二,创建列表,计算出x和y的当前坐标的位置,且存储二维列表的值,画出圆形白色棋子 三.黑白棋子交替出现 四,提示已经被其他棋子占领了,不能重复占领 五。创建检测五子相连的函数  def  check 六.,实现水平向左和

    2024年02月05日
    浏览(40)
  • 在线五子棋对战

    目录   数据管理模块(数据库设计) 前端界面模块 业务处理模块 会话管理模块网络通信模块(session,cookie) 在线管理模块 房间管理模块 用户匹配模块 项目扩展 数据库中有可能存在很多张表,每张表中管理的数据⼜有不同,要进⾏的数据操作也各不相同,因此我们可以为每⼀

    2024年02月14日
    浏览(44)
  • 五子棋(Python实现)

    2024年02月11日
    浏览(44)
  • Python实现五子棋

    我认为这个五子棋核心还是在于二维数组,将实际当中鼠标点击的物理位置转换到棋盘中的逻辑地址,之后便用数组的方法进行操作,例如检测是否获胜,电脑下棋策略等。 是否可落子 是否有输赢 每次标记最新下棋的位置即可 电脑下棋 策略:主要根据一个网上的经验评分

    2024年02月06日
    浏览(42)
  • C++制作五子棋

    正文 01 思路 我没有选择专业的五子棋棋型,用我自己的逻辑(初高中玩五子棋的方法),去实现简单的人机对战。 首先因为要计算五子棋每一步的分数,那么你就要分析每一步形成的棋盘,以下图为例: 当你即将在红色方框区域内落子时,通过数据处理获取四个方向的棋子

    2024年02月11日
    浏览(39)
  • 鸿蒙小案例-五子棋

    刚开始以为挺简单的,越写越…emo 因为代码有点多,所以这里就简单讲下逻辑,文末贴上代码 逻辑只是我个人想的,不代表只有这一种实现方式,有其他想法可以在下面留言 另外功能做的比较简单,有一些没实现,但是基本功能都有,大家可以自行优化 组件就比较简单,采

    2024年02月21日
    浏览(40)
  • python实现《五子棋》

            今天突然心血来潮,想全程自己写一个小游戏(毕竟对于一个才接触python不到一个月的小白来说,还是比较为难,虽然不算是完全成功,因为棋盘大小和布局还是借鉴了其它博主的,但这都是小问题,重要是其它的都是自己写的嘛!!!(咦,这小编真能扯,还不上

    2024年02月12日
    浏览(33)
  • Pygame 五子棋编程

    编程说明:  pygame编程五子棋程序。 设计流程 :新建棋盘,落子画圆,校验五子相连,赢家信息显示,自动重启下一局,程序打包成exe。 关键点 :     新建棋盘:考虑线的间隔,需提前计算好。     落子画圆:考虑黑白交替,已落子坐标位不可重复落子。     校验五子

    2024年02月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包