c语言小程序之三子棋

来源:互联网 发布:js 获取get url参数 编辑:程序博客网 时间:2024/05/21 19:46

第一次写这么长的程序,再此总结一下。
首先考虑test.c的功能:
1)main函数内实现一个游戏界面,用一个循环可以让游戏一直循环进行,并且再循环内部使用分支用来选择开始游戏or退出游戏。
2)写一个menu函数,作用是打印游戏菜单界面。
3)写一个game函数,主要在函数内部调用各个步骤的函数,实现一个玩游戏的过程,并且输出谁赢谁输。
game.c内部主要实现各个test.c里各个函数:
1)初始化棋盘,再次全部初始化为空格。(使用memset库函数)
2)展示即打印该棋盘。(其实就是利用循环将这个棋盘画出来)
3)玩家落子,在此落子之前需要判断该格子是否为空,为空才能下子,并且判断是否为非法坐标(即x,y都有限定范围)
4)电脑移动,设置一个随机数生成器,随机坐标在3*3以内随机落子,同上一步一样,每次落子之前需要判断该坐标是否为空。
5)判断输赢。即每一行都相等且不为空格(或每一列,或两个对角线)此时给一个返回值,建议再此用落在该坐标上的标志(即你下的棋子)作为返回值,在主函数内只需要判断返回值是你下的棋子还是电脑下的棋子就可以判断谁输谁赢了,此时还要判断平局的可能性。
在判断每行(每列,每个对角线)之后加一个对棋盘的判断,判断棋盘是否全满,全满才能有输家赢家之分。
附上代码(仅供参考):

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <stdlib.h>#include <windows.h>#include "game.h"void menu(){    printf("******************************\n");    printf("******欢迎来到三子棋游戏******\n");    printf("********1.开始游戏************\n");    printf("********0.退出游戏************\n");    printf("******************************\n");}void game(){    char board[ROWS][COLS];    char ret = Check_win(board, ROWS, COLS);    Init_board(board, ROWS, COLS);//初始化棋盘    Display_board(board, ROWS, COLS);//展示该棋盘    srand((unsigned int)time(NULL));//随机数生成器    //    while (1)    {        Player_move(board, ROWS, COLS);//玩家走        if((ret = Check_win(board, ROWS, COLS)) != ' ')            break;        Display_board(board, ROWS, COLS);//每走一步打印一次棋盘        Computer_move(board, ROWS, COLS);//电脑走        if ((ret = Check_win(board, ROWS, COLS)) != ' ')            break;        Display_board(board, ROWS, COLS);//每走一步打印一次棋盘    }    if (ret == 'A')    {        printf("恭喜你!玩家获胜!\n");    }    else if (ret == 'C')    {        printf("很遗憾!电脑获胜!\n");    }    else if (ret == 'q')    {        printf("啊哦!平局了!\n");    }    Display_board(board, ROWS, COLS);}int main(){        int button = 0;        do        {            menu();            printf("请选择>:");            scanf("%d", &button);            switch (button)            {            case 1:game();                break;            case 0:                printf("退出游戏!");                break;            default:                printf("选择错误,请重新选择!");                break;  }        } while (button);        system("pasue");        return 0;    }
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void Init_board(char board[ROWS][COLS], int row, int col){    memset(board, ' ', col*row*sizeof(char));//数组全部初始化为空格}void Display_board(char board[ROWS][COLS], int row, int col){    int i = 0, j = 0;    for (i = 1; i <=row; i++)    {        printf("  %d ", i);    }    printf("\n");    for (i = 0; i < row; i++)    {        printf("%d", i+1);        printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);        if (i != 2)        {            printf(" ---|---|---\n");        }    }}void Player_move(char board[ROWS][COLS], int row, int col){    int x = 0, y = 0;    while (1)    {        printf("请输入坐标(x y):");        scanf("%d%d", &x, &y);        x--;        y--;        if (((x >= 0) && (x <= 2)) && ((y >= 0) && (y <= 2)))        {            if (board[x][y] == ' ')            {                board[x][y] = 'A';                break;            }            else            {                printf("该坐标已被占,请重新输入!");            }        }        else        {            printf("非法坐标!请重新输入!");        }    }}void Computer_move(char board[ROWS][COLS], int row, int col){    while (1)    {        int x = rand() % 3;        int y = rand() % 3;        if (board[x][y] == ' ')        {            board[x][y] = 'C';            break;        }    }}static int Is_Full(char board[ROWS][COLS], int row, int col){    int i = 0;    int j = 0;    for (i = 0; i < row; i++)    {        for (j = 0; j < col; j++)        {            if (board[i][j] == ' ')                return 0;        }    }    return 1;}char Check_win(char board[ROWS][COLS], int row, int col){    int i = 0;    for (i = 0; i < row; i++)    {        if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][1] != ' '))        {            return board[i][1];        }    }    for (i = 0; i < row; i++)    {        if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]) && (board[1][i] != ' '))        {            return board[1][i];        }    }        if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != ' '))        {            return board[1][1];        }        if ((board[2][0] == board[1][1])                && (board[1][1] == board[0][2]) && (board[1][1] != ' '))        {            return board[1][1];        }        if (Is_Full(board, row, col))           {            return 'q';        }        return ' ';}

说一下我在写这个程序时遇到的一些问题和总结到的经验。
首先再写之前应当构思我该写那些函数他们分别在那个.c文件中,最好拿纸笔记下来,函数名以及他们各自实现什么功能。

并且在写程序时应当从主函数main函数开始写,逐步一点点向外扩展。写函数主要是一个实现模块化的步骤,每个模块单独构思写出来就可以。但我在写程序时需要一些问题,我在写了部分函数之后,如果我想要测试一下他们的功能是否正确实现了呢?
还有一个来自初学者的建议,再写关于逻辑的判断语句时括号真的很重要….希望自己以后不要再犯这么低级的错误啦!

最后附上游戏截图:
这里写图片描述

这里写图片描述