C语言二维数组----写井字棋

目录

1.内容展示

 2.思考

3.代码实现


1.内容展示

 2.思考

由图可知我们需要构建多个函数分别表示主菜单,棋盘,玩家输入,电脑输入(随机输入)

1.主菜单的编写

void menu()
{
  printf("\n\t*******MADE-HZKK********\n");
  printf("\t*Welcome to N-word game*\n");
  printf("\t***----- 1.Paly -----***\n");
  printf("\t***----- 0.Exit -----***\n");
  printf("\t************************\n\n");
}

2棋盘的编写

  在这里我们通过一个3*3的二维数组,将内容全部初始化位空格。

void intboard(char board[ROW][COL],int row,int col)  
{
 int i,j;
 for(i=0;i<row;i++)
 for(j=0;j<col;j++)
 board[i][j]=' '; 
}

3棋盘的打印

通过观察下方棋盘我们看见除了空格还有'|'和'-',把棋盘拆分来看一共有五行,

第一行是'   ',' | ','   ',' | ','   ';

第二行是     ---|---|---       ;

第三行是'   ',' | ','   ',' | ','   ';

第四行是     ---|---|---       ;

第五行是'   ',' | ','   ',' | ','   ';

 下面是代码实现

void print_board(char board[ROW][COL],int row,int col)  
{
 int i,j;
 for(i=0;i<row;i++)
 {
  printf("\t");
  for(j=0;j<col;j++)
  {
   printf(" %c ",board[i][j]);
   if(j<col-1)printf("|");
  }printf("\n");
  printf("\t");
  if(i<row-1)
  for(j=0;j<col;j++)
  {
    printf("---");
    if(j<col-1)printf("|");    
  }printf("\n");
 }
}

4.玩家输入坐标

首先要判断坐标是否出界,若不出界则要判断是否被占用,否则重新输入直到成功

void player(char board[ROW][COL],int row,int col)  
{
	int x,y,t=1;
	while(t)
	{
		scanf("%d,%d",&x,&y);	
		if(x>0&&x<=row&&y>=0&&y<=col)  
		{
			if(board[x-1][y-1]==' ')board[x-1][y-1]='*',t=0;  
			else printf("Occupied!\nReebter-->");
		}
		else printf("Out-Of-Range!\nReenter-->");
	}
}

5.电脑输入坐标

电脑需要随机生成坐标,这里需要调用<stdlib.h>和<time.h>,并且在主函数中输入srand((unsigned int)time(NULL));注意电脑生成的坐标也要判断是否以被占用

void computer(char board[ROW][COL],int row,int col)
{
	int x,y,t=1;
	while(t)
	{
		x=rand()%row,y=rand()%col;	
		if(x>0&&x<=row&&y>=0&&y<=col)
		if(board[x][y]==' ')board[x][y]='#',t=0;
	}
	printf("Computer-->%d,%d\n",x+1,y+1);
}

6判断游戏是否继续

由于游戏的随机,所以无论是玩家还是电脑,每走一步,我们都需要判断游戏是否继续,游戏一共有四种状态,第一是玩家胜利,第二是电脑胜利,第三是平局,第四是继续游戏。在这里我用' * '表示玩家的棋子,用' # '表示电脑的棋子,所以我们可以定义一个char型的函数用return的字符表示游戏状态,' * ' # ' Q ' C '分别表示玩家胜利,电脑胜利,平局,继续游戏。

井字棋的胜利条件是行或列或对角线相同,于是我们可以通过for循环判断。

char judge(char board[ROW][COL],int row,int col)   
{
	int i,j,t;
	for(i=0;i<row;i++)  
	{
		t=0;
		for(j=0;j<col-1;j++)
		if(board[i][j]==board[i][j+1]&&board[i][j]!=' ')t++;
		if(t==col-1) return board[i][j];   
	}
	for(i=0;i<col;i++)  
	{
		t=0;
		for(j=0;j<row-1;j++)
		if(board[j][i]==board[j+1][i]&&board[j][i]!=' ')t++;
		if(t==row-1)return board[j][i];
	}t=0;
	for(i=0,j=0;i<row-1&&j<col-1;i++,j++)  
	{
		if(board[i][j]==board[i+1][j+1]&&board[i][j]!=' ')t+=1;
		if(t==col-1)return board[i][j];
	}t=0;
	for(i=0,j=col-1;i<col-1&&j>0;i++,j--)  
	{
		if(board[i][j]==board[i+1][j-1]&&board[i][j]!=' ')t+=1;
		if(t==col-1)return board[i][j];
	}
	for(i=0;i<row;i++)
	for(j=0;j<col;j++)                
	if(board[i][j]==' ')return 'C';  
	return 'Q';
}

3.代码实现

我们通过项目来实现,分别是game1.h(头文件)、game.cpp(编写函数)、test.cpp(主函数)。

                                                            game1.h

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void menu();
char board[ROW][ROW];
void intboard(char board[ROW][ROW],int row,int col); 
void print_board(char board[ROW][ROW],int row,int col);
void player(char board[ROW][COL],int row,int col);
void computer(char board[ROW][COL],int row,int col);
char judge(char board[ROW][COL],int row,int col);

                                                           game.cpp

#include "game1.h"
void menu()
{
  printf("\n\t*******MADE-HZKK********\n");
  printf("\t*Welcome to N-word game*\n");
  printf("\t***----- 1.Paly -----***\n");
  printf("\t***----- 0.Exit -----***\n");
  printf("\t************************\n\n");
}
void intboard(char board[ROW][COL],int row,int col)  //初始化棋盘
{
 int i,j;
 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,j;
 for(i=0;i<row;i++)
 {
  printf("\t");
  for(j=0;j<col;j++)
  {
   printf(" %c ",board[i][j]);
   if(j<col-1)printf("|");
  }printf("\n");
  printf("\t");
  if(i<row-1)
  for(j=0;j<col;j++)
  {
    printf("---");
    if(j<col-1)printf("|");    
  }printf("\n");
 }
}
void player(char board[ROW][COL],int row,int col)  //玩家输入坐标(x,y)
{
	int x,y,t=1;
	while(t)
	{
		scanf("%d,%d",&x,&y);	
		if(x>0&&x<=row&&y>=0&&y<=col)  //判断是否出界
		{
			if(board[x-1][y-1]==' ')board[x-1][y-1]='*',t=0;  //判断是否被占用
			else printf("Occupied!\nReebter-->");
		}
		else printf("Out-Of-Range!\nReenter-->");
	}
}
void computer(char board[ROW][COL],int row,int col)
{
	int x,y,t=1;
	while(t)
	{
		x=rand()%row,y=rand()%col;	//随机生成坐标
		if(x>0&&x<=row&&y>=0&&y<=col)
		if(board[x][y]==' ')board[x][y]='#',t=0;
	}
	printf("Computer-->%d,%d\n",x+1,y+1);
}
char judge(char board[ROW][COL],int row,int col)   //判定游戏是否继续
{
	int i,j,t;
	for(i=0;i<row;i++)  //判断每行是否相同
	{
		t=0;
		for(j=0;j<col-1;j++)
		if(board[i][j]==board[i][j+1]&&board[i][j]!=' ')t++;
		if(t==col-1) return board[i][j];   //返回此处棋子如果是‘*’玩家胜利,如果是‘#’电脑胜利
	}
	for(i=0;i<col;i++)  //判断每列是否相同
	{
		t=0;
		for(j=0;j<row-1;j++)
		if(board[j][i]==board[j+1][i]&&board[j][i]!=' ')t++;
		if(t==row-1)return board[j][i];
	}t=0;
	for(i=0,j=0;i<row-1&&j<col-1;i++,j++)  //判断对角线是否相同
	{
		if(board[i][j]==board[i+1][j+1]&&board[i][j]!=' ')t+=1;
		if(t==col-1)return board[i][j];
	}t=0;
	for(i=0,j=col-1;i<col-1&&j>0;i++,j--)  //判断对角线是否相同
	{
		if(board[i][j]==board[i+1][j-1]&&board[i][j]!=' ')t+=1;
		if(t==col-1)return board[i][j];
	}
	for(i=0;i<row;i++)
	for(j=0;j<col;j++)                //如果前面判断都不成立,执行这个判断判断游戏是否继续
	if(board[i][j]==' ')return 'C';  //遍历,有空就返回‘C’游戏继续;否则返回‘Q'结束游戏
	return 'Q';
}

                                                              test.cpp

#include "game1.h"

int main()
{
 int input;char flag='C';
 srand((unsigned int)time(NULL));
 do
 {
  menu();
  printf("Please Chooes:");
  scanf("%d",&input);
  switch(input)
  {
   case 1:printf("Game Start\n");
    intboard(board,ROW,COL) ;
    print_board(board,ROW,COL);
    while(1)
    {
    	printf("You Input-->");
    	player(board,ROW,COL);
    	flag=judge(board,ROW,COL);
    	if(flag!='C')break;
    	print_board(board,ROW,COL);
    	computer(board,ROW,COL);
    	flag=judge(board,ROW,COL);
    	if(flag!='C')break;
    	print_board(board,ROW,COL);
    	
	}
	print_board(board,ROW,COL);
	if(flag=='*')printf("\t\tYou Win!\n");
	else if(flag=='#')printf("\t\tYou Lose!\nLet HZKK hug you\n");
	else if(flag=='Q')printf("\tDraw!This is the most difficult thing to achieve!\n");
   break;
   case 0:printf("\t\tGood-Bye\n");break;
   default:break;
 }  
 }while(input);
 return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值