三子棋

本文介绍了一个简单的井字游戏(Tic-Tac-Toe)的C语言实现,包括游戏板初始化、显示、玩家与电脑走棋等功能。通过随机选择和用户输入来决定棋子的位置,并检查是否有赢家或平局。

头文件game.h:

#include <stdio.h>

#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3

 void InitBoard(char board[ROW][COL],int row ,int col);
 void DisplayBoard(char board[ROW][COL],int row ,int col);
 void ComputerMove(char board[ROW][COL],int row ,int col);
 void PlayerMove(char board[ROW][COL],int row ,int col);
 char IsWin(char board[ROW][COL],int row ,int col);

game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include "game.h"
#include <stdlib.h>
#include <time.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++)
   {
     int j = 0;
	 for(j=0; j<col; j++)
	 {
		 printf(" %c ",board[i][j]);
			 if(j<col-1)
			 
				 printf("|");
       
	 }
	 printf("\n");
	 if(i<row-1)
	 {
     for(j=0; j<col; j++)
	 { 
	    printf("---");
		if(j<col-1)
			printf("|");

	 }
	 printf("\n");
	 }

   }
   



}
void ComputerMove(char board[ROW][COL],int row ,int col)
{ 
    int x = 0;
	int y = 0;
	printf("电脑走;>\n");
	x = rand()%row;
	y = rand()%col;
  while(1)
  {  
  
    if(board[x][y] == ' ')
	{  
	  board[x][y] = '0';
	  break;
	
	}
    
  
  }
    
}

 void PlayerMove(char board[ROW][COL],int row ,int col)
 { 
      int x = 0;
	  int y = 0;
	  printf("玩家走:>\n");

	 while(1)
	 {
	 
	 printf("请输入坐标:(1-3)>");
	 scanf("%d%d", &x,&y);
	 if(x>=1 && x<=3 && y>=1 && y<=3)
	 {  
	     if(board[x-1][y-1] == ' ')
		 {  
			 board[x-1][y-1] = 'X';
		      break;
		     
		 }
	 
		 else
		 {
		 
		   printf("该坐标已被占用\n");
		  
		 }

	 
	 }

	 else 
	 {
		 printf("坐标非法\n");

	 }
	 
	 }
 }
static  int IsFull(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][1];
	   }
	  
	  }  
	  for (i=0; i<col; i++)
	  { 
	   if(board[0][i]==board[1][i] && board[i][1]==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[2][0]==board[1][1] && board[1][1]==board[0][2] && board[1][1]!=' ')
	 {
		 return board[1][1];
	 }
    if(IsFull(board, row, col))
	{ 
	 return 'P';
	}
	return ' ';
  }

 test.c文件

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include "game.h"
#include <stdlib.h>
#include <time.h>
void menu()
{


	printf("***********************\n");
	printf("****1.play ******\n");
	printf("****0.exit ******\n");
	printf("***********************\n");

 }

 void game ()
 {   
	 char ret = 0;
	 char board[ROW][COL] = {0};
	 InitBoard(board, ROW, COL);
	 DisplayBoard(board, ROW, COL);
     while(1)
	 {
		 ComputerMove(board,ROW, COL);
          DisplayBoard(board, ROW, COL); 
		  ret =IsWin(board, ROW, COL);
		 if(ret !=' ')
		 {
              break;   		 
		 }
         PlayerMove(board, ROW, COL);
         DisplayBoard(board, ROW, COL); 
		 ret =IsWin(board, ROW, COL);
		 if(ret !=' ')
		 {
              break;   		 
		 }
		

    }	
	 if(ret == 'P')
	 {
	  printf("平局\n");
	 }
	 else if(ret == 'X')
	 {
       printf("玩家赢\n");	 
	 }
	 else if(ret == '0')
	 {
       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");
				break;

		  }
	  }
	   while(input);


 }


int main ()
{ 
test();
return 0;
}

运行几步之后就出现这个问题,还没有找到问题所在


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值