【18.7.10】三子棋C语言小游戏,自制了判定规则。

写了好久的博客一直在草稿箱忘了发,到发下一篇才看到。qAq。
废话不说了上效果图。→_→
代码点开,control+F5,走!

这里写图片描述

输入开始游戏指令

这里写图片描述

干掉电脑了,不过瘾的话再来一把

这里写图片描述

接下来,是代码,将代码分为头文件game.h,游戏的核心文件game.c,和test.c

Game.c(我把它叫做游戏的核心文件)

初始化

使用memset函数将数组里的元素都初始化成‘空格’,注意添加string.h头文件
void Initboard(char Checkerboard[ROW][COL],int row,int col)
{
    memset(Checkerboard,' ',row*col*sizeof(Checkerboard[0][0]));
}

打印棋盘

这里用到了制表符,可以使我们的棋盘看起来更加的精美
void Printboard(char Checkerboard[ROW][COL],int row,int col)
{
        int i = 0;
        int j = 0;
        printf("┏");
        for(j=0;j<col-1;j++)
        {
            printf("━┳");
        }
        printf("━┓\n");
        for(i=0;i<row;i++)
        {
            printf("┃");
            for(j=0;j<col;j++)
            {
                printf(" %c",Checkerboard[i][j]);
                printf("┃");
            }
            printf("\n");
            if(i<row-1)
            {
                printf("┣");
                for(j=0;j<col-1;j++)
                {
                    printf("━╋");
                }
                printf("━┫\n");
            }
        }
        printf("┗");
        for(j=0;j<col-1;j++)
        {
            printf("━┻");
        }
        printf("━┛\n");
}

玩家下棋

首先玩家不是程序猿,他可不知道数组的下标是从0开始的,所以在‘下棋’的时候,我们要注意将玩家输入的坐标下标都进行-1的操作。而且要注意,这里的循环一定要用一个死循环,落棋再退出,因为玩家有无数种理由,无限输错。
void Playermove(char Checkerboard[ROW][COL],int row,int col)
{
    int i = 0;
    int j = 0;
    while(1)
    {
        printf("请玩家输入坐标:");
        scanf("%d%d",&i,&j);
        if(i>=1&&i<=row&&j>=1&&j<=col)
        {
            if(Checkerboard[i-1][j-1]==' ')
            {
                Checkerboard[i-1][j-1]='o';
                break;
            }
            else
            {
                printf("对不起,该坐标被占用,请重新输\n");
            }
        }
        else
        {
            printf("对不起,您的输入有误,请重新输\n");
        }
    }
}

电脑下棋

这里要用到rand产生一个随机数,先加头文件stdlib.h,但是rand()函数产生的随机数好像一点也不随机,那我们在加一个srand((unsigned int)time(NULL))(我放在的test.c里)进去让他在随机一点,记得头文件time.h。
void Computermove(char Checkerboard[ROW][COL],int row,int col)
{
    int i = 0;
    int j = 0;
    while(1)
    {
        i=rand()%row;
        j=rand()%col;
        if(Checkerboard[i][j]==' ')
        {
            Checkerboard[i][j]='x';
            break;
        }
    }
}

输赢判定

这里我把棋盘拆成了内块与外块,这样在判定时,不会访问到棋盘以外的地方,解决了越界的问题。
char Judge(char Checkerboard[ROW][COL],int row,int col)
{
    int i = 0;
    int j = 0;
    for(i=1;i<row-1;i++)
    {
        for(j=1;j<col-1;j++)
        {
            if(Checkerboard[i][j]==Checkerboard[i][j+1]&&Checkerboard[i][j]==Checkerboard[i][j-1]&&Checkerboard[i][j]!=' ')
            {
                return Checkerboard[i][j];
            }
            if(Checkerboard[i][j]==Checkerboard[i+1][j]&&Checkerboard[i][j]==Checkerboard[i-1][j]&&Checkerboard[i][j]!=' ')
            {
                return Checkerboard[i][j];
            }
            if(Checkerboard[i][j]==Checkerboard[i+1][j+1]&&Checkerboard[i][j]==Checkerboard[i-1][j-1]&&Checkerboard[i][j]!=' ')
            {
                return Checkerboard[i][j];
            }
            if(Checkerboard[i][j]==Checkerboard[i+1][j-1]&&Checkerboard[i][j]==Checkerboard[i-1][j+1]&&Checkerboard[i][j]!=' ')
            {
                return Checkerboard[i][j];
            }
        }
    }
    for(i=1;i<row-1;i++)
    {
        if(Checkerboard[i][0]==Checkerboard[i+1][0]&&Checkerboard[i][0]==Checkerboard[i-1][0]&&Checkerboard[i][0]!=' ')
            {
                return Checkerboard[i][0];
            }
        if(Checkerboard[i][col-1]==Checkerboard[i+1][col-1]&&Checkerboard[i][col-1]==Checkerboard[i-1][col-1]&&Checkerboard[i][col-1]!=' ')
            {
                return Checkerboard[i][col-1];
            }
    }
    for(j=1;j<col-1;j++)
    {
        if(Checkerboard[0][j]==Checkerboard[0][j+1]&&Checkerboard[0][j]==Checkerboard[0][j-1]&&Checkerboard[0][j]!=' ')
            {
                return Checkerboard[0][j];
            }
        if(Checkerboard[row-1][j]==Checkerboard[row-1][j+1]&&Checkerboard[row-1][j]==Checkerboard[row-1][j-1]&&Checkerboard[row-1][j]!=' ')
            {
                return Checkerboard[row-1][j];
            }
    }
    if (Full(Checkerboard,ROW,COL))
    {
        return 'W';
    }
    return ' ';
}
这里有一个平局(流局)的函数,赶紧带上
static int Full(char Checkerboard[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(Checkerboard[i][j] == ' ')
            {
                return 0;
            }
        }
    }
    return 1;
}

Test.c

这样一个简单的三子棋游戏核心的内容就完成了,然后我们进入test.c文件中,就可以直接调用之前写的文件。写完以后再用cls清一下屏幕,把多余的内容清理干净,玩家不会找不到自己玩到哪里了。
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
    printf("■■■■■■三子棋游戏■■■■■■\n");
    printf("■■■■■■■■■■■■■■■■■\n");
    printf("■■■■■■■■■■■■■■■■■\n");
    printf("■■■■■■1.开始游戏■■■■■■\n");
    printf("■■■■■■■■■■■■■■■■■\n");
    printf("■■■■■■0.退出游戏■■■■■■\n");
    printf("■■■■■■■■■■■■■■■■■\n");
}
void game()
{
    char ret = 0;
    char Checkerboard[ROW][COL] = {0};
    srand((unsigned int)time(NULL));
    Initboard(Checkerboard,ROW,COL);
    Printboard(Checkerboard,ROW,COL);
    while(1)
    {
        Playermove(Checkerboard,ROW,COL);
        system("cls");
        ret=Judge(Checkerboard,ROW,COL);
        if(ret!=' ')
        {
            break;
        }
        Computermove(Checkerboard,ROW,COL);
        ret=Judge(Checkerboard,ROW,COL);
        if(ret!=' ')
        {
            break;
        }
        Printboard(Checkerboard,ROW,COL);
    }
    if(ret=='o')
    {
        printf("恭喜您,击败电脑\n");
        Printboard(Checkerboard,ROW,COL);
    }
    else
    {
        if(ret=='x')
        {
            printf("很遗憾,您被电脑击败\n");
            Printboard(Checkerboard,ROW,COL);
        }
        else
        {
            if(ret=='W')
            {
                printf("很遗憾,您和电脑平局\n");
                Printboard(Checkerboard,ROW,COL);
            }
        }
    }
}
void test()
{
    int input = 0;
    do
    {
        menu();
        printf("请输入指令:");
        scanf("%d",&input);
        switch(input)
        {
        case 0:
            printf("即将退出游戏\n");
            Sleep(2000);
            system("cls");
            break;
        case 1:
            printf("游戏即将开始\n");
            Sleep(2000);
            system("cls");
            game();
            break;
        default :
            printf("输入错误,请您重新输入\n");
            break;
        }
    }
    while(input);
}

int main()
{
    test();
    return 0;
}

Game.h

头文件,这里定义了一个宏,row和col可以自行修改棋盘的大小,我这里演示用的5行5列的。注意test调用game的每一个函数都要写,不要偷懒TvT。
#ifndef __GAME_H__
#define __GAME_H__

#define ROW 5
#define COL 5

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>

void InitBoard(char board[ROW][COL], int row, int col);
void PrintBoard(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 Judge(char board[ROW][COL], int row, int col);
int Full(char board[ROW][COL], int row, int col);



#endif //__GAME_H__
一个简单三子棋游戏就搞定了,这是新手练手的很好的选择,入门的小伙伴们,还不赶紧动手试一下?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ASPOSE.WORDS是一个可以处理多种文档格式的.NET组件库,用于创建、转换、修改和管理文档内容。 ASPOSE.WORDS 18.7是该组件库的一次更新,其中包括一些新功能和修复了许多错误。此次更新提高了性能和稳定性,并进一步扩展了其文件格式支持。具体来说,ASPOSE.WORDS 18.7支持新的字体和形状样式、PDF转换中支持内置字体列表、填充和边框等文本框属性的导出、为JavaScript和HTML5提供的文件导出选项,以及针对DOCX便捷性的更新。此外,ASPOSE.WORDS 18.7增加了对ODT和OTT文档的更好支持,现在可以使用此组件库直接从PCL、PS、XPS、EPUB和MHTML文件中读取文本。总的来说,ASPOSE.WORDS 18.7作为一款全面的文档处理套件,提供了许多新功能和改进,进一步完善了文档处理功能,这将有助于用户更轻松地处理和管理各种文档格式。 ### 回答2: aspose.words 18.7是针对Microsoft Word文档处理的成熟的.NET开发者库。它使开发人员可以处理各种类型的Microsoft Word文档,包括(但不限于)DOC,DOCX,RTF,HTML,PDF,EPUB等。aspose.words 18.7内置了丰富的功能,使开发人员可以轻松地执行文档创建,编辑,转换和格式化等操作。此外,它还支持合并文档,保护文档,检查拼写和语法错误等功能,为开发人员提供了完善的工具,以简化Microsoft Word文档处理的工作。此外,aspose.words 18.7支持多种语言,包括C#,Java和Python等,可以轻松地集成到您的开发环境中。这使得它成为许多开发人员在处理Microsoft Word文档时的首选开发者库之一。由于它的广泛应用性和易用性,aspose.words 18.7已被许多企业和组织采用,并在全球范围内得到了广泛的认可。 ### 回答3: Aspose.Words 18.7是一款强大的文书处理工具,它为用户提供了许多有用的功能和工具,可以方便快捷地创建、编辑和转换各种类型的文档。其中包括Word文档、PDF文件、HTML网页和EPUB电子书等。 此版本的Aspose.Words针对某些功能进行了改进,如字体管理和文本布局。在字体管理方面,用户现在可以更容易地扫描文档中存在的所有字体,并轻松地替换它们。此外,新版本还增加了几个常用字体。 在文本布局方面,Aspose.Words 18.7提供了更好的支持,特别是处理复杂文本时。它提供了更好的段落控制、文本对齐和字体调整功能,从而使用户可以更加轻松地创建美观且易读的文档。 总的来说,Aspose.Words 18.7是一款灵活、易用且功能丰富的文书处理工具,可以大大提高用户工作效率。它能够满足所有不同类型的文档处理需求,并为用户带来更加便捷的操作体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值