三子棋(C语言)

前言

最近学会做三子棋了,从中学到了不少东西。现在把代码分享出来,如果有不足之处,希望指正。

思路

主要的模块有:

  1. 玩家下棋

  1. 电脑下棋

  1. 打印棋盘

  1. 判断玩家下棋位置是否合法

  1. 判断游戏是否结束

  1. 程序运行的一些提示语的处理

我总共分为了三个文件:

  1. 头文件

  1. 主函数文件

  1. 自定义函数文件

遇到的问题

  1. 全局变量不能在头文件中定义,这方面了解太少了

  1. 判断输赢考虑不周全

  1. 对程序的运行没有清晰的逻辑

代码

头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define row 3
#define col 3

void menu();
void game();
void start();
void show();
void playerplay();
void playercheck(int *x, int *y);
void computerplay();
char check();
主函数文件
#include"game.h"

int main() {
    srand((unsigned int)time(NULL));
    int a = 0;
    do {
        menu();
        printf("请选择:");
        scanf("%d", &a);
        switch (a) {
        case 1:
            game();
            break;
        case 0:break;
        default:
            printf("请输入正确的选项!");
            break;
        }
    } while (a);
}
自定义函数文件
#include"game.h"
char board[row][col];
void menu() {
    printf("******************\n");
    printf("******1.plat******\n");
    printf("******0.exit******\n");
    printf("******************\n");
}
int chance;
void game() {
    chance = 9;
    start();
    show();
    while (1) {
        playerplay();
        show();
        if (check() != 'y')
        {
            if (check() == '*') {
                printf("恭喜你赢了!\n");
                break;
            }
            if (check() == '#') {
                printf("电脑获胜\n");
                break;
            }
            if (check() == 'e') {
                printf("平局\n");
                break;
            }
        }
            computerplay();
            show();
            if (check() != 'y')
            {
                if (check() == '*') {
                    printf("恭喜你赢了!\n");
                    break;
                }
                if (check() == '#') {
                    printf("电脑获胜\n");
                    break;
                }
                if (check() == 'e') {
                    printf("平局\n");
                    break;
                }
            }


    }

}

void start()
{
    for(int i=0;i<3;i++)
    {
        for (int j = 0; j < 3; j++) {
            board[i][j] = ' ';
        }
    }
}
//显示棋盘
void show() {
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            printf(" %c ", board[i][j]);
            if(j<col-1)printf("|");
        }
        printf("\n");
        if (i < row - 1) {
            for (int j = 0; j < col; j++) {
                printf("----");
            }
            
        }
        printf("\n");
    }
}
void playerplay() {
    int x, y;
    printf("你的回合:\n请输入你要下的坐标:");
    scanf("%d %d", &x, &y);
    playercheck(x, y);
    chance--;
}

void playercheck(int x, int y) {
    
    if (x < 0 || y < 0 || x>row || y>col) {

        printf("坐标超出范围!\n");
        printf("请重新输入坐标:");
        scanf("%d %d", &x, &y);
        playercheck(x, y);
    }
    else if(board[x-1][y-1]=='*'|| board[x - 1][y - 1] == '#')
    {
        printf("改位置已经被占用!");
        printf("请重新输入坐标:");
        scanf("%d %d", &x, &y);
        playercheck(x, y);
    }
    else { board[x - 1][y - 1] = '*'; }
    
}

void computerplay() {
    int x, y;
    printf("电脑的回合:\n");
    do {
         x = rand() % 3;
         y = rand() % 3;
    } while (board[x][y] == '*' || board[x][y] == '#');
    board[x][y] = '#';
    chance--;
    }

char check() {
    for (int i = 0; i < row; i++) {
        if (board[i][0] == board[i][1]&& board[i][1] == board[i][2]&& board[i][2] == '#')
            return board[i][0];
        else if (board[i][0] == board[i][1]&& board[i][1] == board[i][2]&& board[i][2] == '*')
            return board[i][0];
        else if (board[0][i] == board[1][i]&& board[1][i] == board[2][i]&& board[2][i] == '#')
            return board[0][i];
        else if (board[0][i] == board[1][i]&& board[1][i] == board[2][i]&& board[2][i] == '*')
            return board[0][i];
        else if (board[0][0] == board[1][1]&& board[1][1] == board[2][2]&& board[2][2] == '*')
            return board[0][0];
        else if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] == '#')
            return board[0][0];
        else if (board[2][0] == board[1][1]&& board[1][1] == board[0][2]&& board[0][2] == '#')
            return board[2][0];
        else if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] == '*')
            return board[2][0];
    }
    if (chance == 0)return'e';
    else return 'y';
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值