C语言:利用简单的数组知识完成的小游戏

一、井字棋

//三子棋游戏:TIC-TAC-TOE 
//2022-02-25 朱文杰 
//#include<game.h>
#include<stdio.h>
#include<time.h> //time  获取时间戳 头文件 
#include<stdlib.h> //srand rand 函数头文件 
#define ROW 3 //行 
#define COL 3 //列 

void Menu();//菜单函数申明 
void OpenShow();//游戏开始函数申明 
void OverShow();//游戏结束函数申明 
void Game_Proc();//游戏处理函数申明 
void Game();	//游戏函数申明 
void Board_init(char Board[ROW][COL],int row,int col);//棋盘数据初始化函数申明 
void Board_Display(char Board[ROW][COL],int row,int col);//棋盘打印函数申明 
void Player_Turn(char Board[ROW][COL],int row,int col);//玩家操作函数申明
void Computer_Turn(char Board[ROW][COL],int row,int col);//电脑操作函数申明
char IsWin(char Board[ROW][COL],int row,int col);//胜负判断函数申明:返回4个值:游戏状态 玩家赢o 电脑赢x 平局p  继续c
int IsFull(char Board[ROW][COL],int row,int col);//判断棋盘满没满 
int Scores = 0;//积分累计 

int main()
{
	Game_Proc();//游戏处理函数 
}

void Game()	//游戏函数
{
		char Board[ROW][COL]={0};//定义棋盘数组 
		char ret = 0;//接受胜负判断返回值 
		Board_init(Board,ROW,COL);//棋盘初始化 
										       		
		Board_Display(Board,ROW,COL); //打印棋盘	
		while(1)	//下棋循环 
		{
			//玩家下棋
					Player_Turn(Board,ROW,COL);	//玩家回合:将子落到数组中去	 
					Board_Display(Board,ROW,COL); //打印棋盘
			//判断胜负
			 ret = IsWin(Board,ROW,COL);
			 if(ret!='c')
			 {
			 	break;
			 } 
			//电脑下棋	
					Computer_Turn(Board,ROW,COL);
					Board_Display(Board,ROW,COL); //打印棋盘
			//判断胜负
			ret = IsWin(Board,ROW,COL);
			 if(ret!='c')
			 {
			 	break;
			 } 		
		}
	if(ret == 'o')
	{
		printf("恭喜玩家取得胜利!\0v0/ \n");
		printf("您获得了666积分\n");
		Scores +=666; 
	}
	else if(ret =='x')
	{
		printf("惜败!壮士,请重头来过!T_T\n"); 
		printf("您减少了250积分\n");
		Scores -=250; 
	}
	else
	{
		printf("您与呆头电脑博弈的难解难分!\n"); 
		Scores -=10;
		printf("您减少了10积分\n");
	}	
}

//判断棋盘满没满函数 
//功能:判断棋盘满没满 0有空格 1 满了 
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][1] != ' ') 
		{
			return Board[i][0];
		}
	} 
	//列相同
	for(i = 0;i < col;i++)
	{
		if(Board[0][i]==Board[1][i] && Board[1][i]==Board[2][i] && Board[1][i] != ' ')
		{
			return Board[0][i];
		} 	
	} 
	//斜角 
		if(Board[0][0]==Board[1][1] && Board[1][1]==Board[2][2] && Board[1][1] != ' ')
		{
			return Board[0][0];
		}
		if(Board[0][2]==Board[1][1] && Board[1][1]==Board[2][0] && Board[1][1] != ' ')
		{
			return Board[0][0];
		}
	//平局:无空格,没人赢
	if(1==IsFull(Board,ROW,COL))
	{
		return 'p';
	}
	return 'c';//继续游戏	
}
//电脑自动落子函数
// 功能:利用时间戳产生随机坐标落子 
void Computer_Turn(char Board[ROW][COL],int row,int col)
{
	int x = 0;
	int y = 0;
	printf("电脑落子:>\n");
	while(1)
	{
			x = rand()%row;
			y = rand()%col;
			if(Board[x][y] == ' ')//如果是空格子,就填一个x 如果不是就重新改生成坐标落子 
			{
				Board[x][y] = 'x';
				break; 
			} 	
			
	}
	 
} 
//玩家操作函数
//功能;玩家操作落子 
void Player_Turn(char Board[ROW][COL],int row,int col)	
{
	int x = 0;
	int y = 0;
	
	printf("请输入棋盘中你落子的坐标:\n"); 
	
	while(1)
	{
			scanf("%d %d",&x,&y);
		
			if(x>0&&x<=3&&y>0&&y<=3)//判断落子坐标是否已经下过 
			{
				if(Board[x-1][y-1] == ' ')//如果合法 
				{
					Board[x-1][y-1]='o';break; //输入完就退出循环 
				} 
				else 
				{
					printf("坐标非法:当前坐标已落子或超出棋盘范围\n例如1 1:表示第1行第1列请重新输入:\n");	
				}	
			}

			else 
			{
				printf("坐标非法:当前坐标已落子或超出棋盘范围\n例如1 1:表示第1行第1列请重新输入:\n");	
			}
		
	}
}
//棋盘初始化函数
//功能: 将3*3个落子位置填空格 
void Board_init(char Board[ROW][COL],int row,int col)	//棋盘初始化函数,让每行每列填数据的地方为空格 
{
	int i = 0;
	int j = 0;
	for(i = 0;i<row;i++)	//row行 
	{
		for(j = 0;j<col;j++)	//col列 
		{
			Board[i][j] = ' '; //把每行每列棋子输入的地方 都输入空格 
		}
	}
} 
//棋盘打印函数 
//功能:实时打印棋盘 
void Board_Display(char Board[ROW][COL],int row,int col)
{
	int i = 0;
	int j = 0;
	for(i = 0;i<row;i++)//row行 
	{
		for(j = 0;j < col;j++)//col列 : 
		{
			//打印一行的数据:数据|数据|数据 
			
			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 Game_Proc()
{
	int input = 0;
	srand((unsigned int)time(NULL));	//生产随机数种子 
	do
	{
		Menu();
		printf("请做出您的选择:>\n");
		scanf("%d",&input);
		switch(input)
		{
			case 1: OpenShow();Game();
			
				break;
				
			case 0: OverShow();
				break;
			default: printf("选择错误,请重新选择^-^\n");
			break;
			
		}
		
	}while(input);	//1执行下去,0 不执行退出 
	
} 

//界********************************************面显示函数********************************************// 
void Menu()//菜单函数
{
	printf("***********************************\n");
	printf("*****                         *****\n");
	printf("*****    Welcome to  Here     *****\n");
	printf("*****         三子棋          *****\n");
	printf("*****      TIC-TAC-TOE        *****\n");
	printf("*****     输入1:开始游戏     *****\n");
	printf("*****     输入0:退出游戏     *****\n");
	printf("*****   当前您的积分为:%-5d  *****\n",Scores);
	printf("*****             by Remained *****\n");
	printf("***********************************\n");
	
}
void OverShow()//游戏结束函数
{
	printf("***********************************\n");
	printf("*****         游戏退出        *****\n");
	printf("*****       ^_^ Bye-Bye!     *****\n");
	printf("***********************************\n");	
}
void OpenShow()//游戏开始函数
{
	printf("***********************************\n");
	printf("*****         游戏开始        *****\n");
	printf("*****       !^0^!  !^0^!      *****\n");
	printf("***********************************\n\n\n");	
}



	
								          		

二、扫雷.简易版

//扫雷游戏:Mine Sweeper/ Win Mine 
//思路:布置雷->排查雷->提示/炸死 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9 	//行 
#define COL 9 	//列 
//棋盘扩大一圈 
#define ROWS 11 //行plus 
#define COLS 11 //列plus 

#define Number_Mine 5//10个雷 

int Scores= 0;//积分累计 
//界面显示函数声明 
void Menu();//菜单显示声明 
void OverShow();//游戏结束界面函数声明 
void OpenShow();//游戏开始界面函数声明 
//游戏函数声明
void Game_Proc();//游戏处理函数申明 
void Game();	//游戏函数申明 
//数组
void InitBoard(char Board[ROWS][COLS],int rows,int cols,char set);			//数组数据初始化函数申明 
void DisplayBoard(char Board[ROWS][COLS],int row,int col);					//实时打印棋盘函数申明 
void SetMine(char Mine[ROWS][COLS],int row,int col) ;			 			//布置雷函数申明 
void FindMine(char Mine[ROWS][COLS],char Show[ROWS][COLS],int row,int col); //扫雷函数申明 
int GetMineNum(char Mine[ROWS][COLS],int x,int y);							//获取周边雷个数 
int main()
{
	printf("            游戏须知^-^\n>>首行首列表示x,y轴标度\n>>输入坐标后,显示的数字表示以自己为中心周边8个位置雷的个数\n"); 
	printf("避开所有地雷即可取得游戏胜利!\n祝您游戏愉快!\n"); 
	Game_Proc();
} 
void Game()	//游戏函数申明 
{
	//1.布置好雷的信息
	char Mine[ROWS][COLS]={0}; 
	//2。排查出雷的信息 
	char Show[ROWS][COLS]={0};
	//初始化数组
	InitBoard(Mine,ROWS,COLS,'0'); 
	InitBoard(Show,ROWS,COLS,'*'); 	
	//打印雷区

	DisplayBoard(Show,ROW,COL); 	
	SetMine(Mine,ROW,COL);//布置雷 
//	DisplayBoard(Mine,ROW,COL);//显示雷 
//扫雷
	FindMine(Mine,Show,ROW,COL); 	//因为仅对中级的9行9列数组进行扫雷 
}
//游戏处理函数
//功能:整个游戏过程 
void Game_Proc()
{
	int input = 0;
	srand((unsigned int)time(NULL));
		do
	{
		Menu();
		printf("请做出您的选择:>\n");
		scanf("%d",&input);
		switch(input)
		{
			case 1: OpenShow();Game();
			
				break;
				
			case 0: OverShow();
				break;
			default: printf("选择错误,请重新选择^-^\n");
			break;
			
		}
		
	}while(input);	//1执行下去,0 不执行退出 
	
} 
int GetMineNum(char Mine[ROWS][COLS],int x,int y)//计算周边雷的个数: 算法:'1'-'0'=1  
{
	
	return (Mine[x-1][y-1]+Mine[x][y-1]+Mine[x+1][y-1]+Mine[x-1][y]+
		Mine[x+1][y]+Mine[x-1][y+1]+Mine[x][y+1]+Mine[x+1][y+1]-8*'0');
	
}
void FindMine(char Mine[ROWS][COLS],char Show[ROWS][COLS],int row,int col)
{
	int x = 0;
	int y = 0;
	int Win = 0;
	printf("请输入排查雷的坐标:>\n");
	while(Win<row*col-Number_Mine)
	{
			scanf("%d %d",&x,&y);//1-9 1-9
			if(x>=1&&x<=row&&y>=1&&y<=col)//坐标合法 
			{
				if(Mine[x][y]=='1')//碰到雷了	
				{
					DisplayBoard(Mine,ROW,COL); //打印下现在的情况 
					printf("很遗憾,你炸了!TmT\n"); 
					break; 
				} 
				else//不是雷 ,计算xy坐标周围几个雷 
				{
					int count = GetMineNum(Mine,x,y);
					Show[x][y]=count+'0';
					DisplayBoard(Show,row,col);
					Win++;
				} 
			}
			else
			{
				printf("坐标位置非法,请重新输入坐标\n例如:第一行第一列:1 1\n"); 
			} 	
	} 
	if(Win==row*col-Number_Mine)
	{
		Scores +=520;
		printf("恭喜你!排雷成功!!获得520积分!\n");
	}
	
	 
}
void SetMine(char Board[ROWS][COLS],int row,int col)
{
	int count =0;
	count = Number_Mine;//10个雷 
		while(count)
	{
		int x = rand()%row+1;//1-9
		int y = rand()%col+1;//1-9 
		if(Board[x][y] == '0')
		{
			Board[x][y]='1';
			count --; 
		}
	}
	
} 
void InitBoard(char Board[ROWS][COLS],int rows,int cols,char set)
{
	int i = 0;
	int j = 0;
	for(i=0;i<rows;i++)
	{
		for(j=0;j<cols;j++)
		{
			Board[i][j]=set;
		}
	}
}

//棋盘打印函数 
//功能:实时打印棋盘
void DisplayBoard(char Board[ROWS][COLS],int row,int col)
{
	int i = 0;
	int j = 0;
	for(i=0;i<=col;i++) //打印行号 
	{
		printf("%d ",i);
	}
		printf("\n"); 
	 for(i=1;i<=row;i++)
	 {
	 	printf("%d ",i);//打印列号 
	 	for(j=1;j<=col;j++)
	 	{
		 	printf("%c ",Board[i][j]);
		 }
		 printf("\n");
	 }
}









void Menu()//菜单函数
{
	printf("***********************************\n");
	printf("*****                         *****\n");
	printf("*****    Welcome to  Here     *****\n");
	printf("*****        扫雷游戏         *****\n");
	printf("*****       Mine  Sweeper     *****\n");
	printf("*****     输入1:开始游戏     *****\n");
	printf("*****     输入0:退出游戏     *****\n");
	printf("*****   当前您的积分为:%-5d  *****\n",Scores);
	printf("*****             by Remained *****\n");
	printf("***********************************\n");
}
void OverShow()//游戏结束函数
{
	printf("***********************************\n");
	printf("*****         游戏退出        *****\n");
	printf("*****       ^_^ Bye-Bye!     *****\n");
	printf("***********************************\n");	
}
void OpenShow()//游戏开始函数
{
	printf("***********************************\n");
	printf("*****         游戏开始        *****\n");
	printf("*****     本关埋了5个地雷     *****\n");
	printf("*****       !^0^!  !^0^!      *****\n");
	printf("***********************************\n\n\n");	
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Remaimed

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值