C语言小游戏-N子棋

简介: C语言通过数组实现的小游戏逻辑

目录

前言😄

游戏逻辑的基本框架下🚩

1.游戏逻辑💧

2.代码实现💧

代码实现🚩

test.c

game.h

game.c

与电脑斗智斗勇🚩

结语✍


游戏逻辑的基本框架🚩

开始之前,很有必要先说说游戏逻辑的基本框架,我看许多别的博客基本都是一上来就直接开始代码了,代码的事情并不着急,重要的是我们要先理清楚游戏的逻辑是怎么一回事。这里我会分成两个部分:

1.游戏逻辑💧

🌀游戏可以支持玩家多次玩,反复玩

🌀需要一个菜单界面提示玩家做出选择

🌀游戏需要一个棋盘(基于二维数组)

🌀打印棋盘,看看初始化界面

🌀玩家下棋,输入坐标

🌀判断输赢,打印棋盘,看看效果如何

🌀电脑下棋,产生范围内的随机坐标(可以自己自行设计算法,优化电脑下棋,本篇博客并不讨论此问题)

🌀判断输赢,打印棋盘,看看效果如何

本篇博客将以*作为玩家的棋子,以#作为电脑的棋子

用*来代表玩家赢,用#代表电脑赢,以'Q'代表平局,以‘C’代表继续


2.代码实现💧

通过模块化设计,分为3个部分:

test.c

主函数部分,对游戏的逻辑进行测试运行

game.h

库函数头文件的包含

行列的自定义设置

函数的定义

game.c

游戏功能的实现,即对game.h中定义的函数进行实现

好了,通过上面的介绍对游戏有了一定的认识。下面,进入我们的代码实现部分👇


代码实现🚩

test.c

1.我们知道,要支持玩家多次重复玩游戏,这里采用dowhile循环来实现,无论如何,我们至少都能够进入游戏一次🚀

2.菜单,可通过简单的打印printf提示玩家进行选择,根据玩家的输入我们可以通过switch来作为选择🚀

3.主体部分game()游戏的实现:定义初始化一个棋盘,打印看看效果,while()循环,玩家下棋,打印棋盘,判断输赢

电脑下棋,打印棋盘,判断输赢🚀

下面来一起看看我们的代码🎁

//头文件的包含
#include "game.h"
//开始界面
void menu()
{
    printf("*************************\n");
    printf("***** 1.play  0.exit ****\n");
    printf("*************************\n");
}
//游戏逻辑
void game()
{
    char board[ROW][COL] = { 0 };
    //初始化棋盘
    InitBoard(board,ROW, COL);
    //打印棋盘
    DisplayBoard(board,ROW,COL);
    char ret = 0;
    while (1)
    {
        //玩家下棋
        PlayerMove(board,ROW,COL);
        //显示棋盘
        DisplayBoard(board, ROW, COL);
        //判断输赢
        ret = IsWin(board, ROW, COL);
        if (ret != 'C')
        {
            break;
        }
        //电脑下棋
        ComputerMove(board, ROW, COL);
        //显示棋盘
        DisplayBoard(board, ROW, COL);
        //判断输赢
        ret = IsWin(board, ROW, COL);
        if (ret != 'C')
        {
            break;
        }
    }
    if (ret == '*')
    {
        printf("恭喜你赢了\n");
    }
     if (ret == '#')
    {
        printf("什么?电脑赢了,你连人机都打不过\n");
    }
     if (ret == 'Q')
    {
         printf("平局\n");
    }
    DisplayBoard(board, ROW, COL);
}
int main()
{
    //随机数
    srand((unsigned int)time(NULL));
    int input = 0;
    do {
        //菜单
        menu();
        printf("请选择进行的操作:");
        scanf("%d", &input);
        switch(input)
        {
            case 1:
                //进入游戏
                game();
                break;
            case 0:
                printf("退出游戏!\n");
                break;
            default:
                printf("选择错误!\n");
                break;
        }
    } while (input);
    return 0;
}

image.gif

image.gif编辑

注:上面的函数都会在game.h中定义,接着往下走吧👇

game.h

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//自定义行列
#define ROW 4//行
#define COL 4//列
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(char board[ROW][COL],int row,int col);
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);
//判断输赢
char IsWin(char board[ROW][COL], int row, int col);
//判断是否满棋
int isFull(char board[ROW][COL], int row, int col);

image.gif

image.gif编辑

本游戏以4行4列为例子。当你想改行和列之时,只需要通过改变#define后面的数字即可

image.gif编辑

注意:#define这里有一个小细节处:那就是定义的数字后面千万不能加分号(;)可千万不要因为敲代码敲多成习惯了❌

game.c

#include "game.h"
//初始化棋盘
void InitBoard(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 DisplayBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        //打印数据
        //printf(" %c | %c | %c \n"
        for (j = 0; j < row; j++)
        {
            printf(" %c ", board[i][j]);
            //打印出|
            if(j<col-1)
              printf("|");
        }
        printf("\n");
        //打印分割信息
        //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] == ' ')
            {
                board[x - 1][y - 1] = '*';
                break;
            }
            else
            {
                printf("坐标被占用,重新选择一个位置\n");
            }
        }
        else
        {
            printf("坐标非法,重新输入\n");
        }
    }
}
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
    printf("电脑下棋:\n");
    int x = 0;
    int y = 0;
    while (1)
    {
        x = rand() % row;
        y = rand() % col;
        //判断坐标是否为空
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}
//判断棋盘是否已满
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 IsWin(char board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    char ret = 0;
    //行的判断
    for (i = 0; i < row; ++i)
    {
        ret = 1;
        for (j = 0; j < col - 1; ++j)
        {
            if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')
                ;
            else
            {
                ret = 0;
                break;
            }
        }
        if (ret)
            return board[i][j];
    }
    //列的判断
    for (j = 0; j < col; j++)
    {
        ret = 1;
        for (i = 0; i < row - 1; i++)
        {
            if (board[i][j] == board[i + 1][j] && board[i][j] != ' ')
                ;
            else
            {
                ret = 0;
                break;
            }
        }
        if (ret)
            return board[i][j];
    }
    //左对角线的判断
    ret = 1;
    for (i = 0, j = 0; i < row - 1 && j < col - 1; i++, j++)
    {
        if (board[i][i] == board[i + 1][i + 1] && board[i][i] != ' ')
            ;
        else
        {
            ret = 0;
            break;
        }
    }
    if (ret)
        return board[i][i];
    //右对角线的判断
    ret = 1;
    for (i = 0, j = col - 1; i < row - 1 && j > 0; i++, j--)
    {
        if (board[i][j] == board[i + 1][j - 1] && board[i][j] != ' ')
            ;
        else
        {
            ret = 0;
            break;
        }
    }
    if (ret)
        return board[i][j];
    //判断是否平局
    if (isFull(board, row, col))
        return 'Q';
    //继续
    return 'C';
}

image.gif

image.gif编辑

好啦,代码的实现就到这里结束了,下面我们来简单看看运行效果如何,走你🛫


与电脑斗智斗勇🚩

image.gif编辑

输入1时我们进入了游戏界面,现在我们开始下棋:

image.gif编辑

这时候我们就可以与电脑斗争斗勇了(这里如果觉得电脑不够灵活的话可以自己设置一个算法,这里只是基于能够让电脑下起棋来,通俗易懂

image.gif编辑

最后,不出意外我们赢了!😂

最后,这里还测试了一下10*10

image.gif编辑

image.gif编辑

逻辑上还是行得通的。🎯


结语✍

好啦,本次关于N子棋游戏的实现就到这里结束了,如果觉得不错的话,记得点赞加收藏哦🌹

相关文章
|
4天前
|
C语言
【C语言】猜数字小游戏的一步一步实现2
【C语言】猜数字小游戏的一步一步实现
|
4天前
|
算法 C语言
【C语言】猜数字小游戏的一步一步实现1
【C语言】猜数字小游戏的一步一步实现
|
4天前
|
C语言
C语言之三子棋小游戏
C语言之三子棋小游戏
|
4天前
|
C语言
C语言之实现贪吃蛇小游戏篇(2)
C语言之实现贪吃蛇小游戏篇(2)
26 1
|
4天前
|
存储 小程序 编译器
C语言之三子棋小游戏的应用
C语言之三子棋小游戏的应用
|
4天前
|
算法 编译器 C语言
C语言猜数字小游戏(也包含python实现的用法)
本文基于VS2022、pycharm和前面的知识,写一个凭借分支与循环的小游戏,比如: 写一个猜数字游戏 游戏要求: 电脑自动生成1~100的随机数 玩家猜数字,猜数的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束 在pyhton中生成随机数是比较简单的,可以直接导入random的包,直接生成随机数,导致写猜数字小游戏变成了判读语句和循环语句嵌套就能写出来,所以我不做过多的介绍了,可以直接看后面的代码展示,想了解更多的python可看python的基础知识,这里面有我在学习python的过程中写的笔记
35 0
|
4天前
|
C语言
爱上C语言:扫雷小游戏,展开一片功能实现
爱上C语言:扫雷小游戏,展开一片功能实现
爱上C语言:扫雷小游戏,展开一片功能实现
|
4天前
|
人工智能 机器人 测试技术
【C语言】C语言实现猜单词小游戏(源码+报告)【独一无二】
【C语言】C语言实现猜单词小游戏(源码+报告)【独一无二】
|
4天前
|
存储 定位技术 C语言
基于C语言实现扫雷小游戏
本文介绍了使用C语言实现扫雷小游戏的过程。扫雷是一款经典的单机游戏,玩家需要通过点击方格来揭示数字或地雷,最终清除所有非地雷方格。实现过程中,首先定义了游戏所需的数据结构,如游戏地图、玩家信息等。然后,实现了游戏的初始化、渲染、输入处理等核心功能。在游戏逻辑方面,处理了点击事件、数字计算和胜负判断等。通过不断优化和完善,最终完成了基于C语言的扫雷小游戏实现,为玩家提供了一种简单有趣的游戏体验。
28 0
|
4天前
|
机器学习/深度学习 小程序 C语言
C语言初学者:原来我也可以实现扫雷小游戏(简易版)!
C语言初学者:原来我也可以实现扫雷小游戏(简易版)!