小游戏--三子棋(任意几子棋)

来源:互联网 发布:淘宝宝贝批量下载 编辑:程序博客网 时间:2024/05/21 17:38

程序思想
1. 多文件实现游戏功能
2. 改变宏定义即可改变棋盘大小以及棋子个数
3. test.c:功能的测试以及函数的调用
4. game.h : 包含头文件的引用,函数的声明
5. game.c : 各函数的功能的实现。
具体实现
1. 棋牌的设置以及棋盘的显示
2. 玩家和电脑各自落子的实现
3. 输赢的判定

代码:

test.c

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<time.h>#include"game.h"void game(){    char board[ROW][COL];    init_board(board, ROW, COL);    //初始化棋盘    display_board(board, ROW, COL);  // 显示棋盘    srand((unsigned int)time(NULL));  //随机落子    play_game(board,ROW,COL);         //游戏的主逻辑}void menu(){    printf("********************\n");    printf("*******1.play*******\n");    printf("*******0.exit*******\n");    printf("********************\n");}int main(){    int input = 0;    menu();    do              {        printf("请选择:>");        scanf("%d", &input);        switch (input)        {        case 1:            game();            break;        case 0:            break;        default:            printf("输入错误,重新输入\n");            break;        }    } while (input);    return 0;}

game.c

#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"#include<stdio.h>//初始化棋盘void  init_board(char board[ROW][COL], int row,int col){    int i = 0;    int j = 0;    for (i = 0; i < row ; i++)    {        for (j = 0; j < col; j++)        {            board[i][j] = ' ';                }    }}//显示棋盘void display_board(char board[ROW][COL], int row, int col){    int i = 0;    int j = 0;    for (i = 0; i < row; i++)    {        for (j = 0; j < col; j++)        {            printf(" %c |", board[i][j]);        }        printf("\n");        for (j = 0; j < col; j++)        {            if (i!=row-1)            printf("___|");        }        printf("\n");    }}//选择第一次谁先落子(先落子优势大)void menu1(){    printf("2.玩家先走    3.电脑先走\n");}//玩家落子void player_move(char board[ROW][COL], int row, int col){    int x = 0;    int y = 0;    while (1)    {        printf("请输入坐标:>");        scanf("%d %d", &x, &y);        if ((x >= 0 && y <= row - 1) && (y >= 0 && y <= col - 1))     //  落子坐标不能超过棋盘        {            if (board[x][y] == ' ')            {                board[x][y] = 'x';                break;            }            else            {                printf("下标有误,请重新输入\n");   //  输入的坐标已经有棋            }        }        else                                       //   输入的坐标超出棋盘范围        {            printf("下标有误,请重新输入\n");        }    }}//电脑落子void computer_move(char board[ROW][COL], int row, int col){    int x = rand() % row;               //电脑是随机取数,故而坐标为 rand()%row;    int y = rand() % col;    while (1)    {        if (board[x][y] == ' ')        {            board[x][y] = '*';            break;        }    }}//判断棋盘是否为满static  int isfull(char board[ROW][COL], 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 win_check(char board[ROW][COL], int row, int col, char c){    int i = 0;    int j = 0;    // 检测行    for (i = 0; i < row; i++)    {        for (j = 0; j < col; j++)        {            if (board[i][j] != c)                break;        }        if (j == col)            return c;    }    // 检测列    for (i = 0; i < col; i++)    {        for (j = 0; j < row; j++)        {            if (board[j][i] != c)                break;        }        if (j == row)            return c;    }    // 检测对角线    for (i = 0; i < row; i++)    {        if (board[i][i] != c)            break;    }    if (i == row)        return c;    // 检测对角线    for (i = 0; i < row; i++)    {        if (board[i][row - i - 1] != c)            break;    }    if (i == row)        return c;    if (isfull(board, ROW, COL))    {        return 'p';    }    return ' ';}void play_game(char board[ROW][COL], int row, int col){    menu1();    int k = 0;    char ret = 0;    printf("请选择玩家先走还是电脑先走:");    scanf("%d", &k);    while (1)    {        if (k == 2) //如果选择2,第一次玩家先走        {            player_move(board, ROW, COL);            if ((ret = win_check(board, ROW, COL, 'x')) != ' ')                break;            display_board(board, ROW, COL);            computer_move(board, ROW, COL);            if ((ret = win_check(board, ROW, COL,'*')) != ' ')                break;            display_board(board, ROW, COL);        }        if (k == 3)     //选择3,第一次电脑先走        {            computer_move(board, ROW, COL);            if ((ret = win_check(board, ROW, COL,'*')) != ' ')                break;            display_board(board, ROW, COL);            player_move(board, ROW, COL);            if ((ret = win_check(board, ROW, COL,'x')) != ' ')                break;            display_board(board, ROW, COL);        }    }    if (ret == 'x')    {        printf("玩家赢\n");    }    else if (ret == '*')    {        printf("电脑赢\n");    }    else if (ret == 'p')    {        printf("平局\n");    }    display_board(board, ROW, COL);}

game.h

#define _CRT_SECURE_NO_WARNINGS 1#ifndef  __GAME_H__#define __GAME_H__#include<stdio.h>#include<stdlib.h>#include<time.h>#define ROW  5#define COL  5void  init_board(char board[ROW][COL],int row,int col);void  display_board(char board[ROW][COL], int row, int col);void  play_game(char board[ROW][COL], int row, int col);void menu1();void  player_move(char board[ROW][COL],int row,int col);void computer_move(char board[ROW][COL], int row, int col);char win_check(char board[ROW][COL], int row, int col);int isfull(char board[ROW][COL], int row, int col);#endif  //_GAME_H__

总结
1. 改变宏定义即改变棋盘大小以及棋子个数

#define ROW  3#define COL  3
  1. 输赢的判断时应考虑几种情况(以三子为例):
    1)横行三子相连为赢
    2)竖列三子相连为赢
    3)对角线三子相连为赢
    4)出现平局
char win_check(char board[ROW][COL], int row, int col, char c){    int i = 0;    int j = 0;    // 检测行    for (i = 0; i < row; i++)    {        for (j = 0; j < col; j++)        {            if (board[i][j] != c)                break;        }        if (j == col)            return c;    }    // 检测列    for (i = 0; i < col; i++)    {        for (j = 0; j < row; j++)        {            if (board[j][i] != c)                break;        }        if (j == row)            return c;    }    // 检测对角线    for (i = 0; i < row; i++)    {        if (board[i][i] != c)            break;    }    if (i == row)        return c;    // 检测对角线    for (i = 0; i < row; i++)    {        if (board[i][row - i - 1] != c)            break;    }    if (i == row)        return c;    if (isfull(board, ROW, COL))    {        return 'p';    }    return ' ';}
原创粉丝点击