三子棋游戏

一,游戏规则

玩家棋子用“#”,电脑棋子用“*”,哪方棋子先连成一条线,则获得胜利。 

二,游戏步骤 

第一步:玩家下棋

第二步:电脑下棋

第三步:一旦有一方胜利则游戏终止,否则继续 

【注意】

1,游戏执行之前,我们需要一个菜单来满足我们是否选择进行游戏,游戏结束后也需要一个游戏菜单由玩家选择是否继续游戏。

2,执行游戏步骤时,玩家和电脑落子后都要判断输赢。

3,三子棋有九格,要用3*3的二维数组来实现。我们不能在屏幕上直接落子,要用坐标代替。

三,游戏实现
3.1游戏构思和框架

首先我们需要三个文件来分工合作:

 <test.c>测试游戏的逻辑

<game.h>游戏代码的声明(函数声明,符号定义)

<game.c>游戏代码的实现

先在<game.h>头文件中加个库函数<stdio.h>,再将3分别赋值给ROW和LOW,这样是为了以后用四子棋、五子棋只用修改ROW和LOW的赋值就够了。

#include <stdio.h>
#define ROW 3
#define LOW 3

 将头文件game.h作为test.c的库函数,这样就相当于直接调用game.h里的内容了。

 以下是test.c的大致框架:

#include "game.h"

void mune()
{
    printf("**********************\n");
    printf("****1.PLAY  0.EXIT****\n");
    printf("**********************\n");
}

int main()
{
    int input=0;
    srand((unsigned)time(NULL));  //随机数的起点
    do {
        mune();  //打印游戏菜单
        printf("请选择:>");
        scanf("%d",&input);
        switch (input)
        {
            case 1:
                game();
                break;
            case 0:
                break;
            default:
                printf("选择错误,请重新输入\n");
                break;
        }
    } while (input);
    return 0;
}

用do...while()语句来实现整个框架——先打印菜单,再进行选择,将选项赋值在变量input中,再用switch语句执行不同选项,将游戏实现过程放在game.h()函数中 

3.2棋盘的初始化和打印

接下来我们编写game()函数。

在该函数中创建一个3*3棋盘并进行初始化——让棋盘中的内容变成空格 

void game()
{
    char board[ROW][LOW]={0}; //创建3*3棋盘
    //初始化棋盘的函数
    InitBoard(board,ROW,LOW); //初始化棋盘
    DisplayBoard(board,ROW,LOW); //打印棋盘
}

我们将棋盘的初始化和打印的实现放在game.c中,game.c也将game.h作为库函数调用。 

#include "game.h"
void InitBoard(char board[ROW][COL],int row,int col) //初始化键盘
{
    int i,j;
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++);
        {
            board[i][j]=' ';  //先把棋盘中的数打印成空格
        }
    }
}
void DisplayBoard(char board[ROW][COL],int row,int col) //打印棋盘
{
    int i,j;
    for (int i = 0; i < row; i++) //运行三次后打印棋盘
    {
        for (int j = 0; j < col; j++) {
            if (j == col - 1)
                printf("%c ", board[i][j]);
            else
                printf("%c |", board[i][j]);
        }

        printf("\n");
        for (int j = 0; j < col; j++) //运行三次后:---|---|---
        {
            if (i < 2) {
                if (j == col - 1)
                    printf("---");
                else
                    printf("---|");
            }
        }
        printf("\n");
    }
3.3 玩家和电脑下棋实现

我们在game.c中实现玩家和电脑下棋的操作。玩家通过输入坐标下棋,电脑通过运用rand()来生成随机数进行下棋。在test.c中加一个随机起点(srand((unsigned)time(NULL))) 

void game()
{
    char board[ROW][COL]={0}; //创建3*3棋盘
    //初始化棋盘的函数
    InitBoard(board,ROW,COL); //初始化棋盘
    DisplayBoard(board,ROW,COL); //打印棋盘
    player_chess(board,ROW,COL); //玩家下棋
    judge(board,ROW,COL); //判断输赢
    com_chess(board,ROW,COL); //电脑下棋
//玩家下棋
void player_chess(char board[ROW][COL],int row,int col)
{
    int input=1;
    while(input)
    {
        printf("请输入下棋的坐标:>\n");
        int a=0; //创建a,b两个变量来储存坐标
        int b=0;
        scanf("%d %d",&a,&b);
        if(a>0 && a<row+1 && b>0 && b<col+1) //坐标必须在0~row(col)+1之间,该步判断坐标是否合法
        {
            if(board[a-1][b-1]==' ') //判断坐标是否被占用
            {
                board[a-1][b-1]=='#';
                input=0;
            }
            else
                printf("该坐标已被占用,请重新输入");
        }
        else
        {
            printf("坐标非法,请重新输入");
        }
    }
    print_board(board,row,col);  //打印下棋后的棋盘
}
//电脑下棋
void com_chess(int board[ROW][COL],int row,int col)
{
    int input=1;
    while(input)
    {
        int a=rand()%row;  //用a,b装0~2的随机数
        int b=rand()%col;  
        if(board[a-1][b-1]==' ') //判断输入坐标的地方是否为空
        {
            board[a-1][b-1]=='*';
            input=0;
        }
    }
    print_board(board,row,col);  //打印下棋后的棋盘
}
3.4判断输赢

电脑和玩家下棋后都要判断输赢,依然在game.c中实现,若平局返回‘Q’;若都没赢返回‘P’,游戏继续。 

char judge(int board[ROW][COL],int row,int col)
{
    int i=0;
    for (int i = 0; i < row; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') {
            return board[i][0]; //判断一行是否相同
        }
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') {
            return board[0][i]; //判断一列是否相同
        }
    }
    if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[0][0]!=' ')
    {
        return board[0][0]; //判断右斜线是否相同
    }
    if(board[0][2]==board[1][1] && board[1][1]==board[2][0] && board[1][1]!=' ')
    {
        return board[0][2]; //判断左斜线是否相同
    }
    if(if_full(board,row,col))
    {
        return 'Q'; //判断是否平局,平局返回‘Q’
    }
    return 'P';
}

若棋盘还未满,在test.c中加一个while循环。 

void game() 
{
    char ret=0;
    char board[ROW][COL] = {0}; //创建3*3棋盘
    //初始化棋盘的函数
    InitBoard(board, ROW, COL); //初始化棋盘
    system("cls"); //清空屏幕函数
    DisplayBoard(board, ROW, COL); //打印棋盘
    while(1)
    {
        player_chess(board, ROW, COL); //玩家下棋
        print_board(board,ROW,COL); //打印下棋后的棋盘
        judge(board, ROW, COL); //判断输赢
        if(ret!='P') //judge函数返回‘P’,游戏继续
        {
            break;
        }
        com_chess(board, ROW, COL); //电脑下棋
        ret=judge(board,ROW,COL); //判断输赢
        if(ret!='P')
        {
            break;
        }
    }
    if(ret=='#')
    {
        printf("玩家胜利!\n");
    }
    if(ret=='*')
    {
        printf("电脑胜利!\n");
    }
    if(ret=='Q')
    {
        printf("游戏平局!\n");
    }
    print_board(board,ROW,COL); //游戏结束再打印一次键盘
}
3.5 游戏平局

在game.c中用if_full判断棋盘是否满了,若满了则返回1,在judge函数中返回‘Q’,来表示平局。

int if_full(int board[ROW][COL],int row,int col)
{
    int i=0;
    for (i = 0; i < row; i++)
    {
        int j = 0;
        for (j = 0; j < col; j++) {
            if (board[i][j] == ' ')
                return 0; //遍历一遍是否有空格,有返回0
        }
    }
    return '1'; //如果都没有空格,返回‘1’
}
3.6游戏头文件 game.h
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL],int row,int col);
void DisplayBoard(char board[ROW][COL],int row,int col);
void player_chess(char board[ROW][COL],int row,int col);
void com_chess(char board[ROW][COL],int row,int col);
char judge(char board[ROW][COL], int row, int col);
四,游戏优化 

为了提高用代码下棋的水平,我们需要电脑来“拦截”我们的棋子,当我们的棋子有两个相连的时候就要进行拦截,可提高智能性。 我们在game.c中实现

int intell_com(char board[ROW][COL],int row,int col)
{
    int i;
    //行
    for (i = 0; i < row; i++)
    {
        if(board[i][0]==board[i][1] && board[i][2]==' ')
        {
            board[i][2]='*';
            return 1;
        }
        if(board[i][0]==board[i][2] && board[i][1]==' ')
        {
            board[i][1] = '*';
            return 1;
        }
        if(board[i][1]==board[i][2] && board[i][0]==' ')
        {
            board[i][0]='*';
            return 1;
        }
    }
 //列
    for (i = 0; i < col; i++)
    {
        if (board[0][i] == board[1][i] && board[2][i] == ' ')
        {
            board[2][i] = '*';
            return 1;
        }
        if (board[0][i] ==board[2][i] && board[1][i] == ' ')
        {
            board[1][i] = '*';
            return 1;
        }
        if (board[1][i] == board[2][i] && board[0][i] == ' ')
        {
            board[0][i] = '*';
            return 1;
        }
    }
    //对角线判断
    if (board[1][1] == board[0][0] && board[2][2] == ' ')
    {
        board[2][2] = '*';
        return 1;
    }
    if (board[0][0] == board[2][2] && board[1][1] == ' ')
    {
        board[1][1] = '*';
        return 1;
    }
    if (board[1][1] == board[2][2] && board[0][0] == ' ')
    {
        board[0][0] = '*';
        return 1;
    }
    //斜对角线判断
    if (board[1][2] == board[2][1] && board[3][0] == ' ')
    {
        board[3][i] = '*';
        return 1;
    }
    if (board[1][2] == board[3][0] && board[2][1] == ' ')
    {
        board[2][1]='*';
        return 1;
    }
    if (board[2][1] == board[3][0] && board[1][2] == ' ')
    {
        board[1][2]='*';
        return 1;
    }
    return 0;
}

 再将上面的代码插入com_chess中实现。

void com_chess(char board[ROW][COL],int row,int col)
{
    printf("电脑下棋\n");
    if(intell_com(board,row,col)) //判断是否符合拦截条件,符合进行拦截
    {
        ;
    }
    else
    {
        while(1)
        {
            int a=rand()%row;  //用a,b装0~2的随机数
            int b=rand()%col;
            if(board[a][b]==' ') //判断输入坐标的地方是否为空
            {
                board[a][b]='*';
                break;
            }
        }
    }

    DisplayBoard(board,row,col);  //打印下棋后的棋盘
}
五,游戏代码
  • game.h 
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL],int row,int col);
void DisplayBoard(char board[ROW][COL],int row,int col);
void player_chess(char board[ROW][COL],int row,int col);
void com_chess(char board[ROW][COL],int row,int col);
char judge(char board[ROW][COL], int row, int col);
  • game.c 
#include "game.h"
int intell_com(char board[ROW][COL],int row,int col)
{
    int i;
    //行
    for (i = 0; i < row; i++)
    {
        if(board[i][0]==board[i][1] && board[i][2]==' ')
        {
            board[i][2]='*';
            return 1;
        }
        if(board[i][0]==board[i][2] && board[i][1]==' ')
        {
            board[i][1] = '*';
            return 1;
        }
        if(board[i][1]==board[i][2] && board[i][0]==' ')
        {
            board[i][0]='*';
            return 1;
        }
    }
 //列
    for (i = 0; i < col; i++)
    {
        if (board[0][i] == board[1][i] && board[2][i] == ' ')
        {
            board[2][i] = '*';
            return 1;
        }
        if (board[0][i] ==board[2][i] && board[1][i] == ' ')
        {
            board[1][i] = '*';
            return 1;
        }
        if (board[1][i] == board[2][i] && board[0][i] == ' ')
        {
            board[0][i] = '*';
            return 1;
        }
    }
    //对角线判断
    if (board[1][1] == board[0][0] && board[2][2] == ' ')
    {
        board[2][2] = '*';
        return 1;
    }
    if (board[0][0] == board[2][2] && board[1][1] == ' ')
    {
        board[1][1] = '*';
        return 1;
    }
    if (board[1][1] == board[2][2] && board[0][0] == ' ')
    {
        board[0][0] = '*';
        return 1;
    }
    //斜对角线判断
    if (board[1][2] == board[2][1] && board[3][0] == ' ')
    {
        board[3][i] = '*';
        return 1;
    }
    if (board[1][2] == board[3][0] && board[2][1] == ' ')
    {
        board[2][1]='*';
        return 1;
    }
    if (board[2][1] == board[3][0] && board[1][2] == ' ')
    {
        board[1][2]='*';
        return 1;
    }
    return 0;
}
void InitBoard(char board[ROW][COL],int row,int col) //初始化键盘
{
    int i,j;
    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,j;
    for (i = 0; i < row; i++) //运行三次后打印棋盘
    {
        for (j = 0; j < col; j++)
        {
            if (j == col - 1)
                printf("%c ", board[i][j]);
            else
                printf("%c |", board[i][j]);
        }

        printf("\n");
        for (j = 0; j < col; j++) //运行三次后:---|---|---
        {
            if (i < row-1) {
                if (j == col - 1)
                    printf("---");
                else
                    printf("---|");
            }
        }
        printf("\n");
    }

}
//玩家下棋
void player_chess(char board[ROW][COL],int row,int col)
{
    printf("玩家下棋\n");
    int a=0; //创建a,b两个变量来储存坐标
    int b=0;
    int input=1;
    while(input)
    {
        printf("请输入下棋的坐标:>\n");
        scanf("%d %d",&a,&b);
        if(a>0 && a<row+1 && b>0 && b<col+1) //坐标必须在0~row(col)+1之间,该步判断坐标是否合法
        {
            if(board[a-1][b-1]==' ') //判断坐标是否被占用
            {
                board[a-1][b-1]='#';
                input=0;
            }
            else
                printf("该坐标已被占用,请重新输入");
        }
        else
        {
            printf("坐标非法,请重新输入");
        }
    }
    DisplayBoard(board,row,col);  //打印下棋后的棋盘
}
//电脑下棋
void com_chess(char board[ROW][COL],int row,int col)
{
    printf("电脑下棋\n");
    if(intell_com(board,row,col)) //判断是否符合拦截条件,符合进行拦截
    {
        ;
    }
    else
    {
        while(1)
        {
            int a=rand()%row;  //用a,b装0~2的随机数
            int b=rand()%col;
            if(board[a][b]==' ') //判断输入坐标的地方是否为空
            {
                board[a][b]='*';
                break;
            }
        }
    }

    DisplayBoard(board,row,col);  //打印下棋后的棋盘
}
static int if_full(char board[ROW][COL],int row,int col)
{
    int i;
    for (i = 0; i < row; i++)
    {
        int j;
        for (j = 0; j < col; j++) {
            if (board[i][j] == ' ')
                return 0; //遍历一遍是否有空格,有返回0
        }
    }
    return '1'; //如果都没有空格,返回‘1’
}

char judge(char board[ROW][COL],int row,int col)
{
    int i;
    for (i = 0; i < row; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') {
            return board[i][0]; //判断一行是否相同
        }
    }
    for (i = 0; i < row; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
        {
            return board[0][i]; //判断一列是否相同
        }
    }


    if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[0][0]!=' ')
    {
        return board[0][0]; //判断右斜线是否相同
    }
    if(board[0][2]==board[1][1] && board[1][1]==board[2][0] && board[01][1]!=' ')
    {
        return board[0][2]; //判断左斜线是否相同
    }
    if(if_full(board,row,col))
    {
        return 'Q'; //判断是否平局,平局返回‘Q’
    }
    return 'P';
}
  • test.c 
#include "game.h"

void menu()
{
    printf("**********************\n");
    printf("****1.PLAY  0.EXIT****\n");
    printf("**********************\n");
}

void game()
{
    char ret;
    char board[ROW][COL] = {0}; //创建3*3棋盘
    //初始化棋盘的函数
    InitBoard(board, ROW, COL); //初始化棋盘
    system("cls"); //清空屏幕函数
    DisplayBoard(board, ROW, COL); //打印棋盘
    while(1)
    {
        player_chess(board, ROW, COL); //玩家下棋
        DisplayBoard(board,ROW,COL); //打印下棋后的棋盘
        ret=judge(board,ROW,COL);  //判断输赢
        if(ret!='P') //judge函数返回‘P’,游戏继续
        {
            break;
        }
        DisplayBoard(board,ROW,COL); //打印下棋后的棋盘
        com_chess(board, ROW, COL); //电脑下棋
        ret=judge(board, ROW, COL); //判断输赢
        if(ret!='P')
        {
            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:
                break;
            default:
                printf("选择错误,请重新输入\n");
                break;
        }
    } while (input);
    return 0;
}

完结撒花!! 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值