c语言实现简易三子棋游戏

//sanziqi.h

#define _CRT_SECURE_NO_WARNINGS 1  
#ifndef  __SANZIQI_H__
#define  __SANZIQI_H__
#define ROW 3
#define COL 3
//初始化  
void InitBorad(char arr[ROW][COL], int row, int col);
//显示棋盘  
void Display(char arr[ROW][COL], int row, int col);
//电脑走  
void Computer(char arr[ROW][COL], int row, int col);
//人走  
void Player(char arr[ROW][COL], int row, int col);
//判断是否还有空格  
int Check_full(char arr[ROW][COL], int row, int col);
//判断输赢  
char Is_Win(char arr[ROW][COL], int row, int col);
#endif

//sanziqi.c

#define _CRT_SECURE_NO_WARNINGS 1  
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "sanziqi.h"
//初始化  
void InitBorad(char arr[ROW][COL], int row, int col)
{
   int i;
   int j;
   for (i = 0; i < row; i++)
   for (j = 0; j < col; j++)
	   arr[i][j] = ' ';
	}
//显示棋盘  
void Display(char arr[ROW][COL], int row, int col)
{
	int i;
	int j;
	printf("----------\n");
	for (i = 0; i < row; i++)
	{
		printf("|");
	    for (j = 0; j < col; j++)
		{
			printf("%2c|", arr[i][j]);
		}
		printf("\n----------\n");
	}
}
//电脑走  
void Computer(char arr[ROW][COL], int row, int col)
{
	srand((unsigned int)time(NULL)); 
	while (1)
	{
		int x = rand() % 3; //产生一个小于3的随机数  
		int y = rand() % 3;
		if (arr[x][y] == ' ') //判断此时棋盘坐标是否被占
		{
			arr[x][y] = 'X';
			break;
		}
	}
}
//人走  
void Player(char arr[ROW][COL], int row, int col)
{
    int x;
    int y;
	while (1)
	{
		printf("请输入坐标:");
	    scanf("%d%d", &x, &y);
	    x--;
		y--;
		if ((0 <= x && x <= row - 1) && (0 <= y && y <= col - 1)) //输入的坐标要在棋盘范围内  
		{
			if (arr[x][y] == ' ')
			{
				arr[x][y] = 'O';
			    break;
			}
			else
			{
				printf("坐标被占,请重新输入!\n");
				           
			}
		}
		else
		{
			printf("超出棋盘范围,请重新输入!\n");
		}
	}
}
//判断是否有空格  
int Check_full(char arr[ROW][COL], int row, int col)
{
	int i;
	int j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] == ' ') //判断数组中有没有空格,如果空格,证明数组没满  
				return 0;
		}
	}
	return 1;
}
//判断输赢  
char Is_Win(char arr[ROW][COL], int row, int col)
{
	int i;
	if (Check_full(arr, ROW, COL) == 1) //棋盘满了没有空格,平局  
		return 'Q';
   for (i = 0; i < row; i++)//某一行连3  
   {
	   if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2])
		   return arr[i][1];
   }
   for (i = 0; i < col; i++) //某一列连3  
   {
	   if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i])
		   return arr[1][i];
   }
   if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2])//对角线连3
	   return arr[1][1];
   if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0]) //对角线连3 
	   return arr[1][1];
   return ' '; //如果没有判断出谁赢并且棋盘还没满,则继续进行游戏  
}
//main.c
#define _CRT_SECURE_NO_WARNINGS 1  
#include <stdio.h>
#include<Windows.h>
#include "sanziqi.h"

void menu()
{
 printf("**************************************\n");
 printf("*************** 1.play ***************\n");
 printf("*************** 0.exit ***************\n");
 printf("**************************************\n");
}
void game()
{
	char arr[ROW][COL];
	InitBorad(arr, ROW, COL);//初始化棋盘  
	Display(arr, ROW, COL);  
	do{
		Computer(arr, ROW, COL); //电脑先走  
		Display(arr, ROW, COL); //打印棋盘  
		if (Is_Win(arr, ROW, COL) != ' ') //如果棋盘不为空的话,判断出谁赢或平局,跳出循环  
		{
			break;
		}
		Player(arr, ROW, COL); //玩家走  
		Display(arr, ROW, COL); //打印棋盘  
		if (Is_Win(arr, ROW, COL) != ' ') //如果棋盘不为空的话,判断出谁赢或平局,跳出循环  
		{
			break;
		}
	 } while (Is_Win(arr, ROW, COL) == ' '); //棋盘没有满,同时也没有判断出输赢的话,继续执行循环,否则跳出循环  
	if (Is_Win(arr, ROW, COL) == 'O')
		printf("你赢了\n");
	else if (Is_Win(arr, ROW, COL) == 'X')
		printf("电脑赢\n");
	else if (Is_Win(arr, ROW, COL) == 'Q')
		printf("平局\n");
}
int main()
{
	int choose = 0;
    do{
		menu();
		printf("请选择>");
		scanf("%d", &choose);
		switch (choose)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,重新输入!\n");
		}
		
	} while (choose);
	system("pause");
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值