三子棋游戏


#ifndef __GAME_H_//防止文件被多次调用
#define __GAME_H_
#define ROWS  3
#define CLOWS 3//棋盘的纵坐标
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<string.h>
void game();

void init_board(char board[ROWS][CLOWS],int row,int clow);//初始化棋盘

void display(char board[ROWS][CLOWS],int row,int clow);//显示棋盘
void player_move(char board[ROWS][CLOWS],int row,int clow);
void computer_move(char board[ROWS][CLOWS],int row,int clow);
char is_win(char board[ROWS][CLOWS],int row,int clow);

#endif 

void init_board(char board[ROWS][CLOWS],int row,int clow)
{
memset(board,' ',ROWS*CLOWS*sizeof(board[0][0]));
}
void display(char board[ROWS][CLOWS],int row,int clow)
{   
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");
}
}
void player_move(char board[ROWS][CLOWS],int row,int clow)
{
int x=0,y=0;

while(1)
{   
printf("请输入坐标->");
scanf("%d%d",&x,&y);
if((x>0&&x<=row)&&(y>0&&y<=clow))
{
if(board[x-1][y-1]==' ')
{
board[x-1][y-1]='X';
   break;
}
else 
{
printf("此坐标已被占用\n");
}
}
else
printf("输入的坐标有误\n");
}
}
static int is_full(char board[ROWS][CLOWS],int row,int clow)//判断棋盘是否下满
{
int i=0,j=0;
for(i=0;i<row;i++)
{
  for(j=0;j<clow;j++)
{
  if(board[i][j]==' ')
return 0;
}
}
return 1;
}
char is_win(char board[ROWS][CLOWS],int row,int clow)
{
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<clow;i++)
{
if((board[0][i]==board[1][i])&&(board[1][i]==board[2][i])&&board[0][i]!=' ')
      return board[i][0];
}
if((board[0][0]==board[1][1])&&(board[1][1]==board[2][2])&&(board[1][1]!=' '))
{
  return board[0][0];
   }
else if((board[0][2]==board[1][1])&&(board[1][1]==board[2][0])&&(board[1][1]!=' '))
{
 return board[0][2];
    }
   if(is_full(board,ROWS,CLOWS))
 return 'q';
   if(is_full(board,ROWS,CLOWS)==0)
return ' ';
}
void computer_move(char board[ROWS][CLOWS],int row,int clow)
{
 
printf("电脑下\n");
while(1)
{
        int x=rand()%3;
int y=rand()%3;
if(board[x][y]==' ')
{
board[x][y]='$';
break;
}
}
}


void game()
{
     char ret=0;
     char board[ROWS][CLOWS]={0};
init_board(board,ROWS,CLOWS);
display(board,ROWS,CLOWS);
while(1)
{
player_move(board,ROWS,CLOWS);
if((ret=is_win(board,ROWS,CLOWS))!=' ')
 break;
 display(board,ROWS,CLOWS);
 computer_move(board,ROWS,CLOWS);
    if((ret=is_win(board,ROWS,CLOWS))!=' ')
 break;
 display(board,ROWS,CLOWS);


  }
if(ret=='X')
{
 printf("玩家赢!\n");
 display(board,ROWS,CLOWS);
     }
else if(ret=='$')
 {
   printf("电脑赢!\n");
   display(board,ROWS,CLOWS);
      }
else 
 {
 printf("平局!\n");
    display(board,ROWS,CLOWS);//打印棋盘
      }
}

void menu()//菜单
{
printf("*****************************************\n");
printf("*****1.PLAY  0.EXIT**********************\n");
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:
 break;
 default :
 printf("请输入1或0\n");
        }
}
while(input);
}
int main()
{
test();//测试函数
return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值