简易三子棋游戏的设计(C语言)

文章介绍了一位学习C++18天的新手开发者如何按照借鉴、分析和再编译的流程,制作了一个简单的三子棋游戏。游戏分为三个文件,包括头文件和两个源文件,实现了玩家与电脑(通过随机数决定落子)之间的对弈,包含游戏菜单、落子判断和胜负检测等功能。
摘要由CSDN通过智能技术生成

前言:呕心沥血(4小时)之作,人类与“AI”(随机数)之间的较量,简洁明了(劣质)的操作画面,简易三子棋你值得拥有(来自一个学习C++18天的新手)这是一款模仿之作.作为萌新的我呢,按照借鉴-分析-自行再编译的流程完成了这款简易三子棋游戏。

设计思路如下:首先我将程序分为三个文件,一个头文件game.h与两个源文件game.c与test.c。其中头文件用于声明自定义的大部分函数,源文件game.c用于定义大部分函数,源文件test.c用于编译游戏主体。

代码如下

源文件test.c 主体

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include "game.h"
menu() {//菜单
    printf("****************\n");
    printf("*****1.play*****\n");
    printf("*****0.退出*****\n");
    printf("****************\n");

}
void game(int n) {//游戏的主体
    if (n == 1) {
        printf("游戏开始\n");
        char arr[ROW][COL] = {1};//创建一个3*3的二维数组存储数据
        Initialize_board( arr,ROW,COL);//初始化棋盘
        printf_board(arr,ROW,COL);//打印棋盘
        
        while (1) {
            player_move(arr, ROW, COL);//玩家落子
            is_win1(arr, ROW, COL);//每次玩家落子后判断并返回一个符号,决定程序接下来走向(此处自定义即可,例如*代表玩家胜利,a代表继续,b代表平局)
                                   //is_win2同理
            if (is_win1(arr, ROW, COL) == '*') {
                printf("玩家胜利!!!");
                break;
            }
            else if (is_win1(arr, ROW, COL) == 'b') {
                printf("平局。");
                    break;
            }
            computer_move(arr, ROW, COL);//电脑落子
            is_win2(arr, ROW, COL);
            if (is_win2(arr, ROW, COL) == '#') {
                printf("电脑胜利!!!");
                break;
            }
            else if (is_win2(arr, ROW, COL) == 'b') {
                printf("平局。");
                break;
            }

        }
    }
    else if (n == 0) {
        printf("游戏结束\n");
    }
    else printf("非法选择,请重新选择:\n");
}
int main() {
    
    
    int n = 0;
    do {
        menu();//打印菜单
        srand((unsigned int)time(NULL));
        scanf("%d", &n);//输入n的作用在于在菜单中选择进入游戏或者退出游戏
        game(n);//游戏主体函数
    } while (n);
    return 0; }

头文件game.h

#define _CRT_SECURE_NO_WARNINGS 1
#define  ROW 3
#define  COL 3
#include<time.h>
#include<stdlib.h>
void Initialize_board(char arr[][COL],int row,int col );//初始化棋盘
void printf_board(char arr[][COL],int row, int col);//打印棋盘
void player_move(char arr[][COL],int row,int col );//玩家落子
void computer_move(char arr[][COL],int row,int col);//电脑落子
char is_win1(char arr[][COL], int row, int col);//判断玩家胜负
char is_win2(char arr[][COL], int row, int col);//判断电脑胜负

源文件 game.c 大部分自定义函数的定义

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Initialize_board(char arr[][COL], int row, int col) {//初始化棋盘函数,利用for循环将二维数组每一个位置都赋值为空格
    int i = 0;
    int j = 0;
    for (i = 0; i < ROW; i++) {
        for (j = 0; j < COL; j++) {
            arr[i][j] = ' ';
        }
    }
}
void printf_board(char arr[][COL],int row,int col) {//打印棋盘,这里利用for循环不断打印即可
                                                    //注意,先正确打印出来再想办法美化
    int i = 0;
    int j = 0;
    for (i = 0; i < ROW ; i++) {
        for (j = 0; j < COL ; j++) {
            printf(" %c ", arr[i][j]);
            if(j<COL-1)
            printf("|");
        }
        printf("\n");
        for (j = 0; j < COL ; j++) {
            if(i<ROW-1)
            printf("---");
            if(j<COL-1&&i<ROW-1)
            printf("|");
        }
        printf("\n");
    }
}
void player_move(char arr[][COL],int row,int col) {//玩家落子函数
    int i = 0;
    int j = 0;
    int flag = 1;//利用变量flag控制循环的进行,落子再跳出,未落子则直到落子为止
    
    do {
        printf("请玩家选择落子点:形如 x y\n");
        scanf("%d %d", &i, &j);
        if ((0 < i && i < 4) && (0 < j && j < 4)) {//先判断,因为落子点不可超出二维数组范围

            if (arr[i-1][j-1]==' ') {//这里利用有空位就打印,避免了判断,算是比较巧妙吧
                arr[i - 1][j - 1] = '*';
                flag = 0;
                printf_board(arr, ROW, COL);            
            }
            else {
                printf("此区域已经落子,请重新选择:\n");                
            }
        }
        else {
            printf("非法输入,请重新选择落子点:\n");
            flag = 1;;
        }
    } while (flag);

}
void computer_move(char arr[][COL], int row, int col) {//电脑落子函数


    int flag = 1;
    do {
        int i = rand()%ROW;//生成随机数,对应的srand在主函数中,每次游戏(并非每次打开程序)仅生成一个
        int j = rand()%COL;//生成随机数
        if (arr[i][j] == ' ') {
            arr[i][j] = '#';
            printf_board(arr, ROW, COL);
            flag = 0;
        }
    } while (flag);
}
char is_win1(char arr[][COL], int row, int col) {//判断胜负,游戏主体根据该函数的不同返回值控制游戏的不同走向(玩家胜利/电脑胜利/平局/游戏继续),is_win2同理
    int i = 0;
    int j = 0;
    for (i = 0; i < ROW; i++) {
        if (arr[i][0] == arr[i][1] && arr[i][2] == arr[i][1] && arr[i][1]!= ' ')//判断行
        {
            return '*';
        }
        if (arr[0][i] == '*' && arr[1][i] == '*' && arr[2][i] == '*')//判断列
        {
            return '*';
        }
    }if (arr[0][0] == '*' && arr[1][1] == '*' && arr[2][2] == '*')//判断对角线
    {
        return '*';
    }if (arr[0][2] == '*' && arr[1][1] == '*' && arr[2][0] == '*')//判断对角线
    {
        return '*';
    }
    for (i = 0; i < ROW; i++) {
        for (j = 0; j < COL; j++) {
            if (arr[i][j] == ' ') {
                return 'a';//游戏继续
            }
        };
    }
    return 'b';
}
char is_win2(char arr[][COL], int row, int col) {//判断胜负
    int i = 0;
    int j = 0;
    for (i = 0; i < ROW; i++) {
        if (arr[i][0] == '#' && arr[i][1] == '#' && arr[i][2] == '#')//判断行
        {
            return '#';
        }
        if (arr[0][i] == '#' && arr[1][i] == '#' && arr[2][i] == '#')//判断列
        {
            return '#';
        }
    }
    if (arr[0][0] == '#' && arr[1][1] == '#' && arr[2][2] == '#')//判断对角线
    {
        return '#';
    }if (arr[0][2] == '#' && arr[1][1] == '#' && arr[2][0] == '#')//判断对角线
    {
        return '#';
    }
    for (i = 0; i < ROW; i++) {
        for (j = 0; j < COL; j++) {
            if (arr[i][j] == ' ') {
                return 'a';//游戏继续
            }
        }
    }
    return 'b';//平局
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值