三子棋的C语言实现

来源:互联网 发布:阿里云 域名解析到网址 编辑:程序博客网 时间:2024/05/01 04:08

昨天和大家分享了扫雷的C语言实现,今天和大家分享一下三子棋的C语言实现。

在某些程度上,这两个程序的实现是非常相似的。在写代码前,需要梳理整个框架,从测试函数开始,一层一层找进去,一个一个函数的考虑。

头文件如下:#ifndef __GAME_H__#define __GAME_H__#define ROWS 3#define COLS 3enum op{    EXIT,    PLAY};void init_board(char board[ROWS][COLS]);  //初始化棋盘void print_board(char board[ROWS][COLS]);  //打印出棋盘void player_move(char board[ROWS][COLS]);  //玩家走void computer_move(char board[ROWS][COLS]);   //电脑走int check_full(char board[ROWS][COLS]);  //判断棋盘是否已满char check_win(char board[ROWS][COLS]);   //判断输赢#endif
主要函数实现如下:#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"#include<stdio.h>#include<stdlib.h>void init_board(char board[ROWS][COLS])  //初始化棋盘{    int i = 0;    int j = 0;    for (i = 0; i < ROWS; i++)    {        for (j = 0; j < COLS; j++)        {            board[i][j] = ' ';        }    }}void print_board(char board[ROWS][COLS])  //打印出棋盘{    int i = 0;    int j = 0;    for (i = 0; i < ROWS; i++)    {        printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);        if(i!=2)            printf("---|---|---\n");    }}int check_full(char board[ROWS][COLS])   //判断棋盘是否已满{    int i = 0;    int j = 0;    for (i = 0; i < ROWS; i++)    {        for (j = 0; j < COLS; j++)        {            if (board[i][j] == ' ')                return ' ';        }    }    return 'q';}void player_move(char board[ROWS][COLS])  //玩家走{    int x = 0;    int y = 0;    while(1)    {        printf("玩家下->:");        scanf("%d%d", &x, &y);        if (board[x][y] == ' ')        {            board[x][y] = 'X';            break;        }    }}void computer_move(char board[ROWS][COLS])   //电脑走{    int x = 0;    int y = 0;    int ret=check_full(board);    printf("电脑下->:\n");    if(ret == ' ')    {        while (1)        {            x = rand() % 3;            y = rand() % 3;            if (board[x][y] == ' ')            {                board[x][y] = '0';                break;            }        }    }}char check_win(char board[ROWS][COLS])    //判断输赢{    int i = 0;    char ret = 0;    for (i = 0; i < ROWS; i++)    {        if ((board[0][i] == board[1][i]) &&                   (board[0][i] == board[2][i]) &&            ((ret=board[0][i] )!= " "))            return ret;    }    for (i = 0; i < ROWS; i++)    {        if ((board[i][0] == board[i][1]) &&                  (board[i][0] == board[i][2]) &&            ((ret=board[i][0]) != " "))            return ret;    }    for (i = 0; i < ROWS; i++)    {        if ((board[0][0] == board[1][1]) &&            (board[0][0] == board[2][2]) &&            ((ret=board[0][0])!= " "))            return ret;    }    for (i = 0; i < ROWS; i++)    {        if ((board[0][2] == board[1][1]) &&            (board[0][2] == board[2][0]) &&            ((ret=board[0][2])!= " "))            return ret;    }    return ' ';}
测试函数部分:#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"#include<stdio.h>#include<stdlib.h>#include<time.h>void menu(){    printf("***********************\n");    printf("******* 1.play  *******\n");    printf("******* 0.exit  *******\n");    printf("***********************\n");}void play_game(){    char board[ROWS][COLS];    int ret = 0;    srand((unsigned)time(NULL));    init_board(board);      print_board(board);     do    {        player_move(board);        print_board(board);        if((check_win(board)) != ' ')        {            ret = check_win(board);            break;        }        if (check_full(board) == 'q')        {            ret = check_full(board);            break;        }        computer_move(board);        print_board(board);        if((check_win(board)) != ' ')        {            ret = check_win(board);            break;        }    }while(check_full(board)!= 'q');    if (ret == 'X')        printf("玩家赢!\n");    if (ret == '0')        printf("电脑赢!\n");    if (ret == 'q')        printf("平局!\n");}void test(){    int input = 0;    do    {        menu();        scanf("%d", &input);        switch (input)        {        case PLAY:            play_game();            break;        case EXIT:            break;        }    }while(input);  }int main(){    test();    system("pause");}

平局

玩家赢

电脑赢

在这里,分享一下我写这个代码走得几个误区:
1.在最开始编译没错的情况下,程序一会正确一会错误。一般来说出现这种错误真的很蛋疼啊!因为你不确定它什么时候会再次出错!于是我就开始调试,连续两次都是判断输赢(check_win)这个函数出问题的时候,我又重新梳理了一下关于这部分的逻辑,然后发现我把等于写成了赋值,导致我整个程序一会正常一会不正常。

2.玩游戏(play_game)的这个逻辑一定要理清楚,需要重复来玩,肯定有while语句,条件应该是棋盘不为满。在while里面,先是玩家走->打印棋盘->判输赢->判满->电脑走->打印棋盘。记得一定是先判输赢在判满!当棋盘满了后,如果没有判断出输赢,那么就是平局。如果你先判满,紧接着判输赢的话,逻辑上没问题,但是代码部分可能不太好实现。

总结:
1.对语句熟练掌握,包括if、while、for等的使用。
2.学会封装函数,将一个功能封装成一个函数,主函数简单明了,各部分功能纯净。
3.调试,每部分写好后一定要进行调试,保证逻辑的严谨性。

0 0
原创粉丝点击