博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用C语言简单实现小游戏三子棋
阅读量:7084 次
发布时间:2019-06-28

本文共 5856 字,大约阅读时间需要 19 分钟。

三子棋是大家都很熟悉且玩起来比较轻松的小游戏。那如何用C语言简单去实现这个小游戏呢?以下是我思路:

第一步:对于玩游戏的人来说都有选择玩或者不玩的权利,直接把游戏放在玩家面前让玩家去玩肯定是不合理的,所以我们得先打印出一个简单的游戏菜单供玩家选择,这里我们自定义一个函数menu()帮我们实现打印菜单。然后在用switch语句去判断玩家的选择。为了使玩家结束一局三子棋游戏后还可以选择是否继续三子棋游戏,这里可以使用do...while()循环。

第二步:自定义游戏函数game(),首先定义一个二维数组board[ ][ ]目的是为了玩家输入坐标以实现落子。在定义数组后再调用自定义函数init_board()将数组内元素初试化为' '。接下来得实现打印棋盘、玩家和电脑落子、根据已经落子的情况判断输赢。

1.定义函数display_board()来实现打印棋盘,用字符'-'和字符'|'我们可以打印出我们想要的棋盘。打印棋盘过程中先将棋盘中的每一行看成一个整体使用一个for循环打印,然后再将每行中的每一格用for循环将其依次打印。

2.定义函数PlayerMove()来实现玩家落子,玩家输入的棋子坐标的两个值必将都大于0但是有可能会超出棋盘范围,所以得判断玩家输入棋子坐标的合理性,如果超出棋盘范围就报错使其重新输入直到正确为止,其次在判断玩家输入的坐标位置是否已经有棋,如果有棋的话报错让玩家重新输入。这里将玩家下的棋子用来打印在棋盘上。再定义函数ComputerMove()来实现电脑落子,电脑落子相比玩家落子简单,只要随机生成坐标落子,然后生成坐标处是否有棋。没有直接落子,有的话继续随机生成坐标直到坐标处无棋。

3.既然是三子棋,那表示横线、竖线、两种对角线上有连续三个相同的棋子就表示该棋子方获胜,或者棋盘落满都没有连续的三个棋子时则判平局。

代码如下:

//头文件game.h#include 
#include
#include
#define ROW 3#define COL 3void maue();void game();void init_board(char board[ROW][COL], int row, int col);void display_board(char board[ROW][COL], int row, int col);void PlayerMove(char board[ROW][COL], int row, int col);void ComputerMoveint(char board[ROW][COL], int row, int col);char CheckWin(char board[ROW][COL], int row, int col);
game.c#include "game.h"void init_board(char board[ROW][COL] , int row, int col){    int i = 0;    int j = 0;    for (i = 0; i < row; i++)    {        for (j = 0; j < col; j++)        {            board[i][j] = ' ';        }    }}void display_board(char board[ROW][COL], int row, int col){    int i = 0;    int j = 0;    for (i = 0; i < row; i++)    {        for (j = 0; j < col; j++)        {            printf(" %c ",board[i][j] );            if (j < col - 1)            {                printf("|");            }        }        printf("\n");        if (i < row-1)        {            for (j = 0; j < col; j++)            {                printf("---");                if (j < col - 1)                {                    printf("|");                }            }            printf("\n");        }    }}void PlayerMove(char board[ROW][COL], int row, int col){    int x = 0;    int y = 0;    printf("玩家走:>\n");    while (1)    {        printf("请输入要落子的坐标:>");        scanf("%d%d", &x, &y);        if ((x>=1) && (x<=row) && (y>=1) && (y <=col))        {            if (board[x-1][y-1] != ' ')            {                printf("该位置有棋子,请重新落子\n");            }            else            {                board[x - 1][y - 1] = '*';                break;            }        }        else        {            printf("输入有误,请重新输入\n");        }    }}void ComputerMove(char board[ROW][COL], int row, int col){    int x = 0;    int y = 0;    printf("电脑走:>\n");    while (1)    {        x = rand() % row;        y = rand() % col;        if (board[x][y] == ' ')        {            board[x][y] = '#';            break;        }    }}static int IsFull(char board[ROW][COL], int row, int col){    int i = 0;    int j = 0;    for (i = 0; i < row; i++)    {        for (j = 0; j < col; j++)        {            if(board[i][j] == ' ')                return 0;        }    }    return 1;}char CheckWin(char board[ROW][COL], int row, int col){    int i = 0;    int j = 0;    for (i = 0; i < row; i++)    {        for (j = 0; j < col - 2; j++)        {            if ((board[i][j] == board[i][j + 1]) && (board[i][j + 1] == board[i][j + 2]) && (board[i][j] != ' '))                return board[i][j];        }    }    for (j = 0; j < col; j++)    {        for (i = 0; i < row - 2; i++)        {            if ((board[i][j] == board[i + 1][j]) && (board[i + 1][j] == board[i + 2][j]) && (board[i][j] != ' '))                return board[i][j];        }    }    for (i = 0; i < row - 2; i++)    {        for (j = 0; j < col - 2; j++)        {            if ((board[i][j] == board[i + 1][j + 1]) && (board[i + 1][j + 1] == board[i + 2][j + 2]) && (board[i][j] != ' '))                return board[i][j];        }    }    for (i = 0; i < row - 2 ; i++)    {        for (j = 2; j < col; j++)        {            if ((board[i][j] == board[i + 1][j - 1]) && (board[i + 1][j - 1] == board[i + 2][j - 2]) && (board[i][j] != ' '))                return board[i][j];        }    }    if (IsFull(board, row, col) == 1)    {        return 'Q';//平局    }    return 'C';//继续}
//实现三子棋的主函数#include "game.h"void maue(){    printf("**************************\n");    printf("******     1.play     ******\n");    printf("******     0.exit      ******\n");    printf("**************************\n");}void game(){    char board[ROW][COL] = { 0 };    char ret = 0;    init_board(board, ROW, COL);    display_board(board, ROW, COL);    while (1)    {        PlayerMove(board, ROW, COL);        display_board(board, ROW, COL);        ret = CheckWin(board, ROW, COL);        if (ret != 'C')            break;        ComputerMove(board, ROW, COL);        display_board(board, ROW, COL);        ret = CheckWin(board, ROW, COL);        if (ret != 'C')            break;    }    if (ret == '*')    {        printf("玩家赢\n");    }    else if (ret == '#')    {        printf("电脑赢\n");    }    else if (ret == 'Q')    {        printf("平局\n");    }}int main(){    int input = 0;    srand((unsigned int)time(NULL));    do    {        maue();        printf("请输入到你的选择:>");        scanf("%d", &input);        switch (input)        {        case 1:            game();            break;        case 0:            printf("退出游戏!\n");            break;        default:            printf("输入错误,请重新输入:>\n");            break;        }    } while (input);    system("pause");    return 0;}

注:

1.在定义二维数组board[ ][ ]时可以直接在填入具体的数值表示棋盘的大小,后期如果想改变棋盘大小时就必须得将整个代码中的board[ ][ ]的数值修改。由于过于繁琐所以在头文件中用#define来修饰ROW,COL来表示棋盘大小的值。后期只要改变头文件中这两个值就可以改变棋盘大小。
2.玩家落子和电脑落子后紧跟着打印棋盘,以保证落子后都能看到棋盘上落子的具体情况。每次落子后还得对棋盘的格局进行判断,如果没有任何一方获胜或者平局则继续落子,否则跳出循环判断哪方获胜或者平局。

代码中有有的表述可能过于繁琐,如有不当之处请指出,以便修改。

转载于:https://blog.51cto.com/14233687/2374918

你可能感兴趣的文章
deeplink技术的两篇资料
查看>>
矩阵求和及Kadane算法
查看>>
linux文件系统目录
查看>>
二叉查找树的前驱后继
查看>>
amazeui学习笔记--css(基本样式2)--基础设置Base
查看>>
Vue el-date-picker 日期组件的使用
查看>>
Qt实现控件内捕获鼠标位置
查看>>
客户端地址和服务端地址
查看>>
Linux命令-文件
查看>>
yaml模块
查看>>
2017.7.13
查看>>
JAVA将数字字符串强制转换成整型变量----求参数之和实验代码(附流程图)
查看>>
深入理解Java虚拟机-----------虚拟机类加载机制
查看>>
编程语言介绍
查看>>
javascrip this指向问题深入理解
查看>>
active admin
查看>>
如何配置pl/sql 连接远程oracle服务器
查看>>
c++ 循环左移
查看>>
【51NOD】独木舟
查看>>
windows下安装git
查看>>