c语言三子棋

当前版本修改宏常量大小(即n子棋)均可正确运行

 1.主文件

//三子棋

#include"three.h"
void meau()
{
	printf("******************\n");
	printf("*****1.paly*******\n");
	printf("*****0.exit*******\n");
}
void game()
{
	char z ='a';
	char board[HANG][LIE] = {0};//建立棋盘
	reboard(board,HANG,LIE);//初始化棋盘
	print_board(board, HANG, LIE);//打印棋盘
	
	while (1)//下棋
	{
		player(board,HANG,LIE);
		print_board(board, HANG, LIE);
		//判断
		z=ifwin(board,HANG,LIE);
		if (z != 'C')
			break;
		computer(board,HANG,LIE);
		print_board(board, HANG, LIE);
		z = ifwin(board, HANG, LIE);
		if (z != 'C')
			break;
	}
	//结算
	victory(z);
}
int main()
{   
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		meau();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("您已退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (input);


	return 0;
}

2.头文件

#pragma once

#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#define HANG 3
#define LIE 3

//初始化
void reboard(char board[HANG][LIE], int han, int lie);

//打印棋盘
void print_board(char board[HANG][LIE], int han, int lie);

//玩家下棋
void player(char board[HANG][LIE],int han,int lie);

//电脑下棋
void computer(char board[HANG][LIE], int han, int lie);

//判断输赢
char ifwin(char board[HANG][LIE], int han, int lie);
//电脑赢# 玩家赢* 平局 P  继续C 

//victory  电脑赢# 玩家赢* 平局 P
void victory(char z);

3.游戏内容

#define _CRT_SECURE_NO_WARNINGS
//游戏函数

#include"three.h"

void reboard(char board [HANG][LIE], int han, int lie)//初始化棋盘
{
    int x = 0;
    int y = 0;
    for (x = 0; x < han; x++)
    {
        for (y = 0; y < lie; y++)
        {
            board[x][y] = ' ';
        }
    }
}

void print_board(char board[HANG][LIE], int han, int lie)//打印棋盘
{
    int x = 0;
    for (x = 0; x < han; x++)
    {
        int y = 0;
        for (y = 0; y < lie; y++)
        {
            printf(" %c ", board[x][y]);
            if(y<lie-1)
              printf("|");
        }
        printf("\n");
        if (x < han - 1)
        {
            int y = 0;
            for (y = 0; y < lie; y++)
            {
                printf("---");
                if (y < lie - 1)
                    printf("|");
            }
            printf("\n");
        }
    } 
}

void player(char board[HANG][LIE], int han, int lie)//玩家下棋
{
    int x = 0;
    int y = 0; 
    printf("玩家请下棋:");
    while (1)
   {
        scanf("%d %d", &x, &y);
        if (x >= 1 && x <= han && y >= 1 && y <= lie)
        {
            if (board[x - 1][y - 1] == ' ')
            {
                board[x - 1][y - 1] = '*';
                break;
            }
            else
                printf("该位置已被占用,请重新输入\n");
        }
        else
            printf("坐标非法,请重新输入\n");
   }
}

void computer(char board[HANG][LIE], int han, int lie)//电脑下棋
{
    printf("电脑下棋\n");
    int x = 0;
    int y = 0;
    
    while (1)
    {    
        x = rand() % han;
        y = rand() % lie;
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}
 //平局返回1 
int ping(char board[HANG][LIE], int han, int lie)
{
    int x = 0;
    for(x=0;x<han;x++)
    {
       int y=0;
       for (y = 0; y < lie; y++)
       {
           if(board[x][y]==' ')
           return 0; 
       }
     }
    return 1;
}

char ifwin(char board[HANG][LIE], int han, int lie)//判断输赢返回字符
{
    //判断行
    int h = 0; 
    for (h = 0; h < han; h++)
    {
        int sum = 0;
        int n = 0;
        for (n = 0; n < lie - 1; n++)
        {
            if (board[h][n] == board[h][n + 1] && board[h][n] != ' ')
                sum++;
        }
        if (sum==lie-1)
        {
            return board[h][n];
        }
      
     }

    //判断列
    int li = 0;
    for (li = 0; li < lie; li++)
    {
        int n = 0;
        int sum = 0;
        for (n = 0; n < han - 1; n++)
        {
            if (board[n][li] == board[n + 1][li] && board[n][li] != ' ')
                sum++;
        }
        if(sum==han-1)
            return board[n][li];
    }

    //判断对角线
    //↘
    int x = 0; int sum1 = 0;
    for (x = 0; x < han-1; x++)
    { 
        if (board[x][x] == board[x + 1][x + 1] && board[x][x] != ' ')
                sum1++;
    }
      if (sum1==lie-1)
      {
         return board[0][0];
       }

    //↗
      int a = han-1; int b = 0; int sum2 = 0;
      while (b < lie-1 && a >= 0)
      {
          if (board[a][b] == board[a - 1][b + 1] && board[a][b] != ' ')
              sum2++;
          b++;
          a--;
      }
      if(sum2==lie-1)
          return board[a][b];

   
    //平局?
    if (ping(board, HANG, LIE))
    {
        return 'P';
    }

    else return 'C';
}


void victory(char z)//接收字符判断谁赢
{
    if (z == '#')
        printf("电脑赢\n");
    if (z == '*')
        printf("玩家赢\n");
    if (z == 'P')
        printf("平局\n");
}

4.总结

还未实现智能堵棋----在循环内判断是否胜利后加一个堵棋的函数?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值