三子棋(c语言) 棋盘大小可随意

来源:互联网 发布:php开发实例大全 编辑:程序博客网 时间:2024/06/10 11:06
game.h#ifndef __GAME_H__#define __GAME_H__#include <string.h>#include <stdlib.h>#include <time.h>#include <stdio.h>#define ROW 6#define COL 6void InitBoard(char board[ROW][COL], int row, int col);void DisplayBoard(char board[ROW][COL], int row, int col);void PlayerMove(char board[ROW][COL], int row, int col);void Computermove(char board[ROW][COL], int row, int col);char IsWin(char board[ROW][COL], int row, int col);#endif //__GAME_H__game.c#define _CRT_SECURE_NO_WARNINGS#include "game.h"void InitBoard(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 DisplayBoard (char board[ROW][COL], 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<(row-1))          {                 printf("---|---|---\n");          }    }*/    int i = 0;    for(i=0;i<row;i++)    {        int j = 0;        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 PlayerMove(char board[ROW][COL], int row, int col)   //玩家走的函数{    int x = 0;    int y = 0;    while(1)    {        printf("玩家走,请输入横纵坐标》\n");        scanf("%d%d",&x,&y);        if((x>=0 && x<=row) && (y>=0 && y<=col))        {            if(board[x-1][y-1] == ' ')            {                board[x-1][y-1]='x';                break;            }            else            {                printf("此处已走过,请重新走\n");            }        }        else        {            printf("输入有误,请重新输入\n");        }    }}void Computermove(char board[ROW][COL], int row, int col)   //电脑走的函数{    while (1)    {        int x = rand()%3;        int y = rand()%3;        if(board[x][y] == ' ')        {            board[x][y]='0';            break;        }    }}static int  is_full(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 IsWin (char board[ROW][COL], 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];    //  }    //}    //for(i=0;i<col;i++)   //纵向三子赢了    //{    //  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[1][1];    //}    //if(board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')    //{    //  return board[1][1];    //}    //玩家赢   电脑赢    int i = 0;    int j = 0;    for(i=0;i<row;i++)  //横向三子赢了    {        for(j=0;j<col;j++)        {            if( (board[i][j] == board[i][j+1] &&                 board[i][j+1] == board[i][j+2] && board[i][i] != ' ')||                (board[i][j] ==board[i][j-1] &&                 board[i][j-1] == board[i][j+1] && board[i][i] != ' ')||                (board[i][j] == board[i][j-1] &&                 board[i][j-1] == board[i][j-2] && board[i][i] != ' ') )            {                return board[i][j];            }            if( (board[i][j] == board[i+1][j] &&                 board[i+1][j] == board[i+2][j] && board[i][j] != ' ')||                (board[i][j] == board[i+1][j] &&                 board[i+1][j] == board[i-1][j] && board[i][j] != ' ')||                (board[i][j] == board[i-1][j] &&                 board[i-1][j] == board[i-2][j] && board[i][j] != ' '))            {                return board[i][j];            }    //斜向三子赢了            if((board[i][j] == board[i-1][j+1] &&                 board[i-1][j+1] == board[i+1][j-1] && board[i][j] != ' ')||                (board[i][j] == board[i-1][j+1] &&                 board[i-1][j+1] == board[i+1][j-1] && board[i][j] != ' ')||                (board[i][j] == board[i+1][j-1] &&                 board[i+1][j-1] == board[i+2][j-2] && board[i][j] != ' ') )            {                return board[i][j];            }            if( (board[i][j] == board[i+1][j+1] &&                 board[i+1][j+1] == board[i+2][j+2] && board[i][j] != ' ')||                (board[i][j] == board[i-1][j-1] &&                 board[i-1][j-1] == board[i+1][j+1] && board[i][j] != ' ')||                (board[i][j] == board[i-1][j-1] &&                 board[i-1][j-1] == board[i-2][j-2] && board[i][j] != ' '))            {                return board[i][j];            }        }    }    if(is_full(board,row,col))    {        return 'Q';            //平局    }    return ' ';  //继续游戏}test.c#define _CRT_SECURE_NO_WARNINGS#include "game.h"void menu()  //打印菜单 {    printf("*****************************\n");    printf("***  欢迎进入三子棋界面  ****\n");    printf("*****************************\n");    printf("****  1 play     0 exit  ****\n");    printf("*****************************\n");}void game(){    char win = 0;    int c;    char board[ROW][COL]={0};    InitBoard(board,ROW,COL);    DisplayBoard(board,ROW,COL);    printf("1 玩家先走   2 电脑先走   0 退出游戏\n");    scanf("%d",&c);    switch (c)    {    case 1:        printf("玩家先走:\n");        PlayerMove(board,ROW,COL);        DisplayBoard(board,ROW,COL);        win = IsWin(board,ROW,COL);        if(win != ' ')        {            break;        }    case 2:        printf("电脑先走:\n");        Computermove(board,ROW,COL);        DisplayBoard(board,ROW,COL);        win = IsWin(board,ROW,COL);        if(win != ' ')        {            break;        }    }    while (1)    {        printf("玩家走》\n");        PlayerMove(board,ROW,COL);        DisplayBoard(board,ROW,COL);        win = IsWin(board,ROW,COL);        if(win != ' ')        {            break;        }        printf("电脑走》\n");        Computermove(board,ROW,COL);        DisplayBoard(board,ROW,COL);        win = IsWin(board,ROW,COL);        if(win != ' ')        {            break;        }     }         if(win == 'x')        {            printf("玩家赢了\n");        }        else if(win == '0')        {            printf("电脑赢了\n");        }        else         {            printf("平局\n");        }}void test(){    int input = 0;    srand((unsigned int)time(NULL));    do{        menu();        printf("请选择:");        scanf("%d",&input);        switch(input)        {        case 1:            game();            break;        case 0:            printf("退出游戏\n");            break;        default:            printf("您的输入有误,请重新输入!\n");        }    }    while(input);}int main(){    test();    system("pause");    return 0;}