一步一步教你用c做三子棋小游戏

如何去做一个三子棋:

                            1.先创建一个头文件(game.h),可以使你在源文件里

                            不用很繁琐的去写库函或者是函数的声明,你的定义等等。

                            我的头文件如下:

#ifndef _GAME_H_        //防止头文件被重复被引用,用ifndef/define/endif结构产生预处理块
#define _GAME_H_
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#include<memory.h>
#define ROW 3         //定义行,列
#define COL 3


 void init_board(char board[ROW][COL],int row,int col);                //函数声明
 void print_board(char board[ROW][COL],int row,int col);
 void computer_move(char board[ROW][COL],int row,int col);
 void player_move(char board[ROW][COL],int row,int col);
 char is_win(char board[ROW][COL],int row,int col);
#endif     //结束标志

                             2.  先写一个测试文件(test.c),实现界面的创建,重复玩游戏,函数的调用。

                         如下:

#include "game.h"       //引用头文件
void game()
{   
	char ret={0};        //定义一个判断函数输赢的函数返回值,'Y'记录你赢了,'N'记录你输了,'P'平局,'G'继续
      char board[ROW][COL] = {0};   //创建数组
	init_board(board,ROW,COL);    //数组初始化
	print_board(board,ROW,COL);   //打印数组
do                                      //用循环实现玩家电脑多次移动
	{
		player_move( board, ROW, COL);
		print_board(board,ROW,COL);
	   ret= is_win( board, ROW, COL);       //判断输赢
	   if(ret=='Y')
	   {
		   printf("恭喜,你赢了。\n");
		   break;
	   }
	    if(ret=='N')
	   {
		   printf("很遗憾,你输了\n");
		   break;
	   }
		if(ret=='P')
		{
			 printf("你和电脑居然平局了!!!\n");
			 break;
		}
		computer_move(board,ROW,COL);
		print_board(board,ROW,COL);
		ret= is_win( board, ROW, COL);
		  if(ret=='Y')
	   {
		   printf("恭喜,你赢了。\n");
		   break;
	   }
		   if(ret=='N')
	   {
		   printf("很遗憾,你输了\n");
		   break;
	   }

    }
	while(ret=='G');
  
}
void menu()
{
	printf("_____________________\n");
	printf("|*******************|\n");
	printf("|******1.play*******|\n");
	printf("|******0.exit*******|\n");
	printf("|*******************|\n");
	printf("---------------------\n");
}
int main()
{

	int input = 0;
	srand( (unsigned ) time(NULL));   //产生随机数
	do                                //用循环实现玩多次游戏
	{
		menu();
	    printf("请选择:");
		scanf("%d",&input);
         switch(input)
		   {
		   case 1:
			   game();
			  break;
		   case 0:
			   printf("退出游戏");
			    
			   break;
		   default:
			   printf("输入错误,请重新选择:\n");
				   break;
		   }
	}
		   while(input);
	
      return 0;
	
}


                           3.写一个游戏实现文件(game.c)

                           里面包含玩家移动,电脑移动,判断输赢程序,数组打印。

                           game.c

#include "game.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 print_board(char board[ROW][COL],int row,int col)   //打印数组,就是展示你的游戏界面
{
	int i = 0;
	int j = 0;
	printf("____________\n");
	for(i=0; i<row; i++)
	{     
		for(j=0; j<col; j++)
		{
			printf("| %c ",board[i][j]);
				
		}
		printf("|\n");
		printf("|___|___|___|");
		printf("\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 && x<=row) && (y>0 && y<=col) && (board[x-1][y-1]==' '))  //不能超出范围
	{
		board[x-1][y-1]='*';
		break;
	}
	else
		printf("输入位置错误\n");
	}
}

void computer_move(char board[ROW][COL],int row,int col)
{
	int ret1 = 0;
	int ret2 = 0;
	
	while(1)
	{
		ret1 = rand()%3;      //产生两个随机数,做下标
	        ret2 = rand()%3;
		if( board[ret1][ret2]==' ')     //位置合适,给它赋值,否则让它重新随机(这里我们还可以再加判断语句,让电脑走灵活一点)
		{
			board[ret1][ret2] = '0';
			break;
		}

	}

}
int is_full_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++)
			{
				if(board[i][j]==' ')
					return 0;	

			}
		   }
         return 1;     
}
  char is_win(char board[ROW][COL],int row,int col)  //判断输赢
  {
	  int i = 0;
	  int j = 0;
	  for(i=0; i<row; i++)
	  {
	    if((board[i][0]==board[i][1]) && (board[i][1]== board[i][2] ))
	   {
		  if(board[i][0]=='*')
			  {
				  return 'Y';
			  }
			  if(board[i][0]=='0')
			  {
				  return 'N';
			  }
	   }
	  }
	  for(j=0; j<col; j++)
	  {
	   if((board[0][j]==board[1][j]) && (board[1][j]== board[2][j] ))
	   {
		  if(board[0][j]=='*')
			  {
				  return 'Y';
			  }
			  if(board[0][j]=='0')
			  {
				  return 'N';
			  }
	   }
	  }
		  if((board[0][0]==board[1][1]) &&  (board[1][1]==board[2][2])) 
			  
		  {
			  if(board[0][0]=='*')
			  {
				  return 'Y';
			  }
			  if(board[0][0]=='0')
			  {
				  return 'N';
			  }
		  }
			  if((board[2][0]==board[1][1]) &&  (board[1][1]==board[0][2])) 
		   {
			  if(board[2][0]=='*')
			  {
				  return 'Y';
			  }
			  if(board[2][0]=='0')
			  {
				  return 'N';
		       }
			  }
		 

		  if(is_full_board(board,ROW,COL)==1) //调用函数判断是否满了
		  {
			  return 'P';
		  }
		  else
			  return 'G';
		 
  }

              到此就结束了,让我们看下运行结果






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值