数组应用————三子棋

数组应用————三子棋

测试代码

放进test.c之中,用于代码的测试和运行。
基本方法
1.开始游戏前玩家进入菜单输入数字表示参加与否,1表示参加游戏,0表示结束游戏,通过循环使游戏可以多次进行。
2.玩家参加游戏,则进入游戏代码。
代码实现

int main( ){
    srand((unsigned int)time(NULL));
    int input = 0;
    do{
        meun( );
        printf("please choose:>");//请选择
        scanf("%d",&input);
        switch(input){
            case 1:
                game( );//三子棋游戏
                break;
            case 0:
                printf("quit a game\n");//退出游戏
                break;
            default:
                printf("please input again\n");//重新输入
                break;
        }
    }
    while(input);
    return 0;
}

输出结果
在这里插入图片描述

游戏初始化准备

基本实现方式
通过菜单meun函数准备,直接用printf即可实现

void meun( ){
    printf("**************************\n");
    printf("********* 1. play ********\n");
    printf("********* 0. exit ********\n");
    printf("**************************\n");
}

棋盘的创建和打印

基本实现目的
1.创建一个较为美观的棋盘便于玩家观看
2.将棋盘各个位置置空,即空格
实现方法
主要通过循环打印出3行棋盘,每个棋盘之间有分割线,再通过双重循环使二维数组元素为空格
代码实现

//清空棋盘
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 = 0,j = 0;
    printf("+---+---+---+\n");
    for(i = 0;i < row;i++){
        //打印数据
        for(j = 0;j < col;j++){
            printf("| %c ",board[i][j]);
        }
        printf("|\n");
        //打印分割行
        printf("+---+---+---+\n");
    }
}

输出结果
在这里插入图片描述

玩家和电脑的棋子输入

目的
通过玩家和电脑的交替输出坐标,使对应棋盘上打印出棋子布局情况
注意事项
1.玩家实际上写的是从1开始的3*3坐标盘,但是在数组实现时数组起始下标为0,所以要在对应输入坐标中-1,才为数组下标。
2.电脑置棋子为随机,所以要用#include<stdlib.h>和#include<time.h>头文件,以及在主函数使用srand((unsigned int)time(NULL));然后将电脑的x,y分别取余3即可获得0到3的随机值
代码实现

void playmove(char board[ROW][COL],int row,int col){
    int x = 0,y = 0;
    printf("the player input:>\n");
    while(1){  
        printf("please input coordinates:>");//输入坐标
        scanf("%d%d",&x,&y);
        if(x >= 1 && x <= row && y >= 1 && y <= col){
            if(board[x-1][y-1] != ' '){
                printf("this position is occupied,please input again\n");//已被占用,需重新输入
                continue;
            }
            else{
                board[x-1][y-1] = '*';
                break;
            }
        }
        else
            printf("the input is illegal,please input again\n");//输入不合法,重新输入
    }
}

void computemove(char board[ROW][COL],int row,int col){
    printf("the computer:>\n");
    while(1){
        int x = rand() % row;//取得范围在0到3的随机值
        int y = rand() % col;
        if(board[x][y] == ' '){
            board[x][y] = '#';
            break;
        }
    }
}

输出结果
在这里插入图片描述

输赢结果的判断

目的
通过对于当前棋盘的局势判断本局结果,采用IsWin函数的返回值来判断结果,’*‘为玩家赢,’#'为电脑赢,'C’为继续,'Q’为平局
注意事项
1.一方赢的情况可分为横三,竖三或者对角线三种情况,要全部包含
2.平局只有在棋盘满了的情况下出现,可另写一个函数判断是否是平局
代码实现

//判断棋盘是否已满
int isfull(char board[ROW][COL],int row,int col){
    for(int i = 0;i < row;i++){
        for(int j = 0;j < col;j++){
            if(board[i][j] != ' '){
                return 0;
                break;
            }
        }
    }
    return 1;
}
//判断输赢关系,赢了返回相应字符,平局返回'Q',继续返回'C'
char IsWin(char board[ROW][COL],int row,int col)
{
    int i,j;
    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(j = 0;j < col;j++){
        if(board[0][j]==board[1][j] && board[1][j]==board[2][j] && board[1][j]!=' '){
            return board[0][j];
        }
    }
    if (board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[1][1]!=' ')
    {
        return board[1][1];
    }
    if(board[0][2]==board[1][1] && board[1][1]==board[2][0]&& board[1][1]!=' '){
        return board[1][1];
    }
    if(isfull(board,row,col)){
        return 'Q';
    }
    return 'C';
}

结果
在这里插入图片描述

game代码的实现
要在每一次输入后判断结果,以求接下的步骤
代码:

void game( ){
    char board[ROW][COL];//初始化为空格
    initboard(board,ROW,COL);
    displayboard(board,ROW,COL);
    while(1){
        //玩家下棋
        playmove(board,ROW,COL);
        displayboard(board,ROW,COL);
        if(IsWin(board,ROW,COL) != 'C'){
            break;
        }
        //电脑下棋
        computemove(board,ROW,COL);//随机下棋
        displayboard(board,ROW,COL);
        if(IsWin(board,ROW,COL) != 'C'){
            break;
        }
    }
    if(IsWin(board,ROW,COL) == '*'){
        printf("the player win\n");
        displayboard(board,ROW,COL);
    }
    if(IsWin(board,ROW,COL) == '#'){
        printf("the computer win\n");
        displayboard(board,ROW,COL);
    }
    if(IsWin(board,ROW,COL) == 'Q'){
        printf("dogfall\n");//平局
        displayboard(board,ROW,COL);
    }
}

最终完整代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
//清空棋盘
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 = 0,j = 0;
    printf("+---+---+---+\n");
    for(i = 0;i < row;i++){
        //打印数据
        for(j = 0;j < col;j++){
            printf("| %c ",board[i][j]);
        }
        printf("|\n");
        //打印分割行
        printf("+---+---+---+\n");
    }
}

void playmove(char board[ROW][COL],int row,int col){
    int x = 0,y = 0;
    printf("the player input:>\n");
    while(1){  
        printf("please input coordinates:>");//输入坐标
        scanf("%d%d",&x,&y);
        if(x >= 1 && x <= row && y >= 1 && y <= col){
            if(board[x-1][y-1] != ' '){
                printf("this position is occupied,please input again\n");//已被占用,需重新输入
                continue;
            }
            else{
                board[x-1][y-1] = '*';
                break;
            }
        }
        else
            printf("the input is illegal,please input again\n");//输入不合法,重新输入
    }
}

void computemove(char board[ROW][COL],int row,int col){
    printf("the computer:>\n");
    while(1){
        int x = rand() % row;//取得范围在0到3的随机值
        int y = rand() % col;
        if(board[x][y] == ' '){
            board[x][y] = '#';
            break;
        }
    }
}
//判断棋盘是否已满
int isfull(char board[ROW][COL],int row,int col){
    for(int i = 0;i < row;i++){
        for(int j = 0;j < col;j++){
            if(board[i][j] != ' '){
                return 0;
                break;
            }
        }
    }
    return 1;
}
//判断输赢关系,赢了返回相应字符,平局返回'Q',继续返回'C'
char IsWin(char board[ROW][COL],int row,int col)
{
    int i,j;
    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(j = 0;j < col;j++){
        if(board[0][j]==board[1][j] && board[1][j]==board[2][j] && board[1][j]!=' '){
            return board[0][j];
        }
    }
    if (board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[1][1]!=' ')
    {
        return board[1][1];
    }
    if(board[0][2]==board[1][1] && board[1][1]==board[2][0]&& board[1][1]!=' '){
        return board[1][1];
    }
    if(isfull(board,row,col)){
        return 'Q';
    }
    return 'C';
}
void meun( ){
    printf("**************************\n");
    printf("********* 1. play ********\n");
    printf("********* 0. exit ********\n");
    printf("**************************\n");
}
void game( ){
    char board[ROW][COL];//初始化为空格
    initboard(board,ROW,COL);
    displayboard(board,ROW,COL);
    while(1){
        //玩家下棋
        playmove(board,ROW,COL);
        displayboard(board,ROW,COL);
        if(IsWin(board,ROW,COL) != 'C'){
            break;
        }
        //电脑下棋
        computemove(board,ROW,COL);//随机下棋
        displayboard(board,ROW,COL);
        if(IsWin(board,ROW,COL) != 'C'){
            break;
        }
    }
    if(IsWin(board,ROW,COL) == '*'){
        printf("the player win\n");
        displayboard(board,ROW,COL);
    }
    if(IsWin(board,ROW,COL) == '#'){
        printf("the computer win\n");
        displayboard(board,ROW,COL);
    }
    if(IsWin(board,ROW,COL) == 'Q'){
        printf("dogfall\n");//平局
        displayboard(board,ROW,COL);
    }
}
int main( ){
    srand((unsigned int)time(NULL));
    int input = 0;
    do{
        meun( );
        printf("please choose:>");//请选择
        scanf("%d",&input);
        switch(input){
            case 1:
                game( );//三子棋游戏
                break;
            case 0:
                printf("quit a game\n");//退出游戏
                break;
            default:
                printf("please input again\n");//重新输入
                break;
        }
    }
    while(input);
    return 0;
}

输出
在这里插入图片描述
在这里插入图片描述
更多情况请自行尝试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值