C语言_三子棋小游戏

三子棋(c语言版)

游戏是在3*3的棋盘上输入坐标,其主要功能有:

(1),玩家走
(2),电脑走
(3),打印棋盘
(4),判断输赢
(5),判断是不是平局
头文件一个,game.h
源文件有2个,分别是test.c 和 game.c
代码如下:

game.h(头文件)

//三子棋游戏
# ifndef __GAME_H__
#define __GAME_H__

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

# define H 3
# define L 3

void display_board (char arr[H][L], int h, int l);//打印棋盘

void player_move(char arr[H][L], int h, int l);//玩家走

void computer_move(char arr[H][L], int h, int l);//电脑走

char is_win (char arr[H][L], int h, int l);//判断输赢

#endif

test.c(主要是测试游戏功能)

#include <stdio.h>
#include "game.h"

void menu ()
{
    printf ("*********************************\n");
    printf ("******      五子棋游戏    *******\n");
    printf ("********   1、开始游戏   ********\n");
    printf ("********   0、结束游戏   ********\n");              
    printf ("*********************************\n");
}
void empty (char arr[H][L], int h, int l)
{
    int i = 0, j = 0;
    for (i=0; i<H; i++)
    {
        for (j=0; j<L; j++)
        {
            arr[i][j] = ' ';
        }
    }
}

void game ()
{

    int i = 0, j = 0;
    char ret = '0';
    char arr[H][L] = {'0'};

    empty (arr, H, L);
    display_board(arr, H, L);

    while (1)
    {
        player_move(arr,H,L);//玩家走
        display_board(arr, H, L);//打印棋盘
        ret = is_win(arr, H, L);//判断输赢

        if (ret == 'X')
        {
            printf ("玩家赢\n");
            break;
        }
        else if (ret == 'P')
        {
            printf ("平局\n");
            empty (arr, H, L);
            break;
        }

        computer_move(arr, H, L);//电脑走
        display_board(arr, H, L);//打印棋盘
        ret = is_win(arr, H, L);//判断输赢
        if (ret == '0')
        {
            printf("电脑赢\n");
            //empty (arr, H, L);
            break;
        }
        else if (ret == 'P')
        {
            printf ("平局\n");
            empty (arr, H, L);
            break;
        }
    }

}
int main() 
{
    int input = 0;
    srand ((unsigned) time (NULL));
    do
    {
        menu ();

        printf ("请选择1(play)/0(exit):\n");
        scanf ("%d",&input);

        switch (input)
        {
        case 0:printf ("结束游戏\n");
            break;
        case 1:
            game ();
            break;
        default :printf ("输入错误\n");
            break;
        }
    }   while(input);

    system ("pause");
    return 0;
}

game.c(游戏的主要代码)

#include "game.h"

//打印棋盘
void display_board (char arr[H][L],int h,int l)
{
    int i, j;
    for (i=0; i<h; ++i)
    {
        for (j=0; j<l; ++j)
        {
            printf (" %c ",arr[i][j]);
            if (j<(l-1))
            {
                printf ("|");
            }
        }
        printf ("\n");
        if (i < (h-1))
        {
            for (j=0; j<h; ++j)
            {
                printf ("--- ");
            }
            printf ("\n");
        }
    }
}
    //玩家走
void player_move(char arr[H][L], int h, int l)
{
    int a = 0, b = 0;
    printf ("请输入你要走的坐标:\n");
    while (1)
    {
        scanf ("%d%d",&a,&b);
        if ((a>0&&a<=h) && (b>0&&b<= l))//判断坐标合法性
        {
            if(arr[a-1][b-1] == ' ')//判断该坐标有没有被占用
            {
                arr[a-1][b-1] = 'X';
                break;
            }
            else
            {
                printf ("该坐标已经被占用,请重新输入:\n");
            }
        }
        else 
        {
            printf ("非法坐标,请重新输入:\n");
        }
    }
}
    // 电脑走
void computer_move(char arr[H][L], int h, int l)
{
    while (1)
    {
        int i = (rand ()) % 3;
        int j = (rand ()) % 3;

        if(arr[i][j] == ' ')//判断该坐标有没有被占用
        {
            arr[i][j] = '0';
            printf ("电脑走的坐标:%d %d\n",i+1,j+1);
            break;
        }
    }
}

char is_win(char arr[H][L], int h, int l)
{
    int i = 0, j = 0, count1, count2, count3, count4 ;
    //横
    for (i=0;i<h;++i)
    {
        count1 = 0;
        for (j=0; j<l-1; ++j)
        {   
            if (arr[i][j] == arr[i][j+1])
            {
                count1 ++;
                if (count1 == l-1)
                {
                    return arr[i][j];
                }
            }
        }
    }

    //竖

    for (i=0;i<l;++i)
    {
        count2 = 0;
        for (j=0; j<h-1; ++j)
        {   
            if (arr[j][i] == arr[j+1][i])
            {
                count2 ++;
                if (count2 == h-1)
                {
                    return arr[j][i];
                }
            }
        }
    }

    //斜
       //正对角线
    count3=0;
    for (i=0; i<l-1;++i)
    {
        if (arr[i][i] == arr[i+1][i+1])
            count3 ++;
        if (count3 == l-1)
            return arr[i][i];
    }
       // 反对角线
    i = l-1;
    j = 0;
    count4 = 0;
    while (i>=0)
    {
        if (arr[i][j] == arr[i-1][j+1])
        {
            count4 ++;
        }
        if (count4 == l-1)
        {
            return arr[i][j];
        }
        i--;
        j++;
    } 

    //判断棋盘是否填满
    for (i=0; i<h; ++i)
    {
        for (j=0; j<l; ++j)
        {
            if (arr[i][j] == ' ')
                return '1';
        }
    }
    return 'P';
}

猜你喜欢

转载自blog.csdn.net/a__b__c__/article/details/79834802