三子棋小游戏

三子棋小游戏  之前没怎么写过功能复杂一点的程序,在程序的结构,函数的声明引用方面遇到了一些问题。还是得多练。

game.h文件

#ifndef __GAME_H__
#define __GAME_H__

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

#define ROWS 3
#define COLS 3

void init_board(char board[ROWS][COLS], int row, int col);
void display_board(char board[ROWS][COLS], int row, int col);
void player_move(char board[ROWS][COLS], int row, int col); 
void computer_move(char board[ROWS][COLS], int row, int col); 
char check_win(char board[ROWS][COLS], int row, int col); 

#endif //__GAME_H__

game.c文件

#define _CRT_SECURE_NO_DEPRECATE 1
#include"game.h"
void init_board(char board[ROWS][COLS],int row,int col)//初始化棋谱空间
{
   memset(board,' ',col*row*sizeof(char));
}
void display_board (char board[ROWS][COLS],int row,int col)//打印棋谱
{
	int i;
	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][COLS], int row, int col)//玩家输入
{
	    int x,y;
		while(1)
              {
    	printf("请输入坐标");
        scanf("%d%d",&x,&y);
	    if(x>=1&&x<=row&&y>=1&&y<=col)
	    {
	         x--;
		     y--;
		 if(board[x][y]==' ')
			{
				board[x][y]='x';
                break;		 
		    }
		 else
			{
				printf("该位置已占用请重新输入");
		       
		     }
	}
	else
	{
	    printf("不在棋盘范围内 请重新输入");  
	}
   }
}
void computer_move (char board[ROWS][COLS], int row, int col)//电脑输入
{
	
	while(1)
	{
		int x=rand()%3;
	    int y=rand()%3;
	  if(board[x][y]==' ')
	  {
	  board[x][y]='0';
	  break;
	  }
	 }
}
int check_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])     //不能使用三连等a==b==c!=d
	     &&(board[i][1]==board[i][2])      
		 &&(board[i][1]!=' '))    
	     return board[i][1];    
	}     
	for(i=0; i<col; i++)  
	{       
		if((board[0][i]==board[1][i]) 
         &&(board[1][i]==board[2][i])   
		 &&(board[1][i]!=' '))         
		 return board[1][i];   
	} 
 
    if((board[0][0]==board[1][1]) 
		&&(board[1][1]==board[2][2])     
		&&(board[1][1]!=' '))      
		return board[1][1]; 
 
    if((board[0][2]==board[1][1])   
		&&(board[1][1]==board[2][0]) 
		&&(board[1][1]!=' '))     
		return board[1][1]; 
 
    if(check_full(board, row, col))   
	{       
		return 'D';            //draw
	}   
	return ' ';
} 
主函数文件test.c

#define _CRT_SECURE_NO_DEPRECATE 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"game.h"


int menu()
{
	printf("*******************************\n");
	printf("*******1 PIAY  0 EXIT *********\n");
	printf("*******************************\n");
	printf("          请选择               \n");
	return 0;
}
				
void game()
{
	   char board[ROWS][COLS]; 
	   char ret = 0; 
	   init_board(board, ROWS, COLS); 
	   display_board(board, ROWS, COLS);
	   srand((unsigned int)time(NULL)); 
	   while(1)
	   {
	                 player_move(board, ROWS, COLS); 
					 if((ret = check_win(board, ROWS, COLS)) != ' ')  
						 break;      
					 display_board(board, ROWS, COLS);       
					 computer_move(board, ROWS, COLS);        
					 if((ret = check_win(board, ROWS, COLS)) != ' ')       
						 break;  
					 display_board(board, ROWS, COLS);
	   }
					   if(ret == 'x')                        //根据返回值判断输出输赢
					  {         printf("恭喜玩家赢\n");  
					   display_board(board, ROWS, COLS);
					   }  
					   else if(ret == '0')  
					   {     
						   printf("电脑赢\n");
						   display_board(board, ROWS, COLS);
					   }    
					   else if(ret == 'D')   
					   {        
						   printf("平局\n");   
					       display_board(board, ROWS, COLS);
					   }   
					  
		
	
}

int main()
{
  int c;
  do{	
     menu();
	 scanf("%d",&c);
	 switch(c){
	 case 1:game()                              ;break;
	 case 0:printf("退出游戏\n")                ;break;
	 default:printf("选择有误,请重新输入\n")   ;break;
	          }
     }while(c!=0);
  
  system("pause");
  return 0;
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值