数组应用-三子棋

大家小时候都玩过三子棋,我们那边叫做一条龙,但是如何用C语言实现呢?


代码的思维逻辑如下:

1:打印个开始菜单供用户选择

2:如果选择玩,首先打印棋盘(用二维数组保存棋盘上的9个格子),

3:用户和电脑分别下棋,每下一次,判断一次是胜负还是平局

4:上一步结束之后,用户如果还想继续玩可以继续,否则可以退出游戏。

具体实现请看下面代码,欢迎交流学习!

game.h

#ifndef __GAME__H
#define __GAME__H
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROWS 3
#define COLS 3
void game();
void display(char a[ROWS][COLS],int ROW,int COL);
void player(char a[ROWS][COLS],int ROW,int COL);
void computer(char a[ROWS][COLS],int ROW,int COL);
char judge(char a[ROWS][COLS],int ROW,int COL);
int is_full(char a[ROWS][COLS],int ROW,int COL);
#endif


game.c

#include"game.h"
void display(char a[ROWS][COLS],int ROW,int COL)
{
	int i,j;
	for(i=0;i<ROWS;i++)
	{
		for(j=0;j<COLS;j++)
		{
			if(j==COLS-1)
				printf(" %c ",a[i][j]);
			else
			    printf(" %c |",a[i][j]);
		}
	printf("\n");
	if(i==ROWS-1)
	  printf("\n");
	else
	  printf("-----------\n");

	}

}
//注意判断电脑和玩家下棋是此位置是否为空,为空可以下
void player(char a[ROWS][COLS],int ROW,int COL)
{
	int x,y;
	printf("请输入坐标>");
	while(1)
	{
		scanf("%d %d",&x,&y);
		if(a[x-1][y-1]==' ')
		{
			a[x-1][y-1] = 'X';
			break;

		}
		 
		else
		{
			printf("出错,请重新输入!\n");
		}

	}

}
//任何数字%3就是0~2
void computer(char a[ROWS][COLS],int ROW,int COL)
{
	while(1)
	{  
		int x = rand()%3;  
		int y = rand()%3;
		if(a[x][y]==' ')    
		{  
			a[x][y] ='0';  
			break;  
		}  
	}  

}
char judge(char a[ROWS][COLS],int ROW,int COL)
{
	int i = 0;
	for(i=0;i<ROW;i++)
	{
		if((a[i][0]==a[i][1])&&(a[i][1]==a[i][2])&&(a[i][0]!=' '))
			return a[i][0];

	}

	for(i=0;i<COL;i++)
	{
		if((a[0][i]==a[1][i])&&(a[1][i]==a[2][i])&&(a[0][i]!=' '))
			return a[0][i];

	}
	
	if((a[0][0]==a[1][1])&&(a[1][1]==a[2][2])&&(a[0][0]!=' '))
		return a[0][0];
	if((a[0][2]==a[1][1])&&(a[1][1]==a[2][0])&&(a[0][2]!=' '))
		return a[0][2];
	if(is_full(a,ROW,COL) == 1)  
        return 'q';  
	
	return ' ';
}
int is_full(char a[ROWS][COLS],int ROW,int COL)  
{  
    int x = 0;  
    int y = 0;  
    for(x=0;x<ROW;x++)  
    {  
        for(y=0;y<COL;y++)  
        {  
              if(a[x][y]==' ')  
                  return 0;  
        }  
    }  
    return 1;  
}  
void game()
{
	char a[ROWS][COLS];
	char ret = ' ';
	srand((unsigned int) time(NULL)); 
	memset(a ,' ',ROWS*COLS*sizeof(char));

	display(a,ROWS,COLS);
	do
	{
		player(a,ROWS,COLS);
		display(a,ROWS,COLS);
		ret = judge(a,ROWS,COLS);
		if(ret!=' ')
		{
			break;
		}
		computer(a,ROWS,COLS);
		display(a,ROWS,COLS);
		ret = judge(a,ROWS,COLS);
	}while(ret==' ');
	if(ret=='X')
	{
		printf("玩家赢\n");
	}
	if(ret=='0')
	{
		printf("电脑赢\n");
	}
	if(ret=='q')
	{
		printf("平局!\n");
	}
}




test.c
#include"game.h"
int main()		
{

	int input = 0;
	do
	{
		printf("**************************\n");
		printf("***** 1:Start 0:exit *****\n");
		printf("**************************\n");
		printf("请选择>");
		scanf("%d",&input);
		switch(input)
		{
		    case 1:game();break;
			case 0:printf("欢迎再来!\n")break;
			default:printf("输入错误请重新输入\n");break;
		}
    }while(input);

	return 0;
}


测试如下:

文件分类



开始画面


当玩家赢画面:


电脑赢:


平局:




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值