三子棋

来源:互联网 发布:mac如何编辑pdf 编辑:程序博客网 时间:2024/09/21 06:19

用C语言实现三子棋
今天,我用c实现了简单三子棋,下面来详细记录一下我是如何构建的,因为时间仓促和能力有限,有错误和不足之处诚恳地希望大家指正。
首先我的逻辑是,先打印一个菜单,玩家选择来进入游戏或退出,当选择进入游戏时,程序进入一个封装好的函数“game()”当玩完时再跳出来,game函数要求能实现的功能分为如下几点:
1、初始化棋盘,并打印(这是考验美学功底的,但很不幸我功力不足)。
2、当玩家输入坐标是在棋盘上显示出来相应的棋子(将玩家输入的坐标对应的‘ ’转为‘P’注意检查看在下之前该元素是否已被赋值)
3、电脑可以自己下(利用rand函数得到随机值,注意也要检查是否已经被下过了)。
4、检查并判断输赢。(对横/竖/斜进行遍历判断)
以下是代码:
game.h

    # ifndef __GAME_H_# define __GAME_H_#include<stdio.h>#include<stdlib.h>#include<string.h># define ROWS 3//此处为宏定义,方便改。# define COLS 3void init_board(char board[ROWS][COLS], int raw, int col);void display_board(char board[ROWS][COLS], int raw, int col);void player_mov(char board[ROWS][COLS], int raw, int col);void computer_mov(char board[ROWS][COLS], int raw, int col);char check_win(char board[ROWS][COLS], int raw, int col);# endif

game.c

# include"game.h"void init_board(char board[ROWS][COLS],int row,int col)//初始化棋盘{    memset(board, ' ', row*col*sizeof(board[0][0]));}void display_board(char board[ROWS][COLS], int row, int col)//打印棋盘{    int i = 0;    for (i = 0; i < row; i++)    {        printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);        if (i < 2)            printf("---|---|---\n");    }}void player_mov(char board[ROWS][COLS], int row, int col)//玩家走。{    int a=0, b=0;    while (1)    {        printf("请输入坐标:\n");        scanf_s("%d %d", &a, &b);        if ((a >= 0) && (a <=row ) && (b >= 0) && (b <= col))        {            if (board[a - 1][b - 1] == ' ')            {                board[a - 1][b - 1] = 'P';                break;            }            else            {                printf("输入错误,请重试:\n");            }        }        else        {            printf("输入错误,请重试:\n");        }    }}void computer_mov(char board[ROWS][COLS], int row, int col)//电脑走{    printf("电脑走:\n");    while (1)    {        int x = rand() % ROWS;        int y = rand() % COLS;        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][0] != ' '))            return board[i][0];        if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]) && (board[0][i] != ' '))            return board[0][i];        if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[0][0] != ' '))            return board[0][0];        if (is_full(board, row, col))        {            return 'p';        }    }    return ' ';}

test.c

# include"game.h"void menu(){    printf("************************\n");    printf("**** 0.play **1.exit****\n");    printf("************************\n");}void game(){    char board[ROWS][COLS] = { 0 };    init_board(board, ROWS, COLS);    display_board(board, ROWS, ROWS, COLS);    int ret = 0;    while (1)    {        player_mov(board, ROWS, COLS);        display_board(board, ROWS, COLS);        ret=check_win(board, ROWS, COLS);         if (ret != ' ')        {            break;        }        computer_mov(board, ROWS, COLS);        display_board(board,  ROWS, COLS);        ret = check_win(board, ROWS, COLS);        if (ret != ' ')        {            break;        }    }    if (ret == 'C')    {        printf("电脑赢\n");    }    else if (ret == 'P')    {        printf("玩家赢\n");    }    else    {        printf("平局\n");    }}enum position{    play,    EXIT};int main(){    int input = 0;    do {        menu();        printf("请选择>>\n");        scanf_s("%d", &input);        switch (input)        {        case play:            game();            break;        case EXIT:            break;        default:        {                   printf("错误指令,请重新选择:\n");                   break;        }        }    } while (input);    return 0;}

0 0
原创粉丝点击