C语言 五子棋游戏(多用户登录人机对局)

目录

一:初始化用户数据

二:主要功能函数的封装

三:源码分享

main.c  [程序主入口]

CTools.h  [工具类 头文件]

CTools.c  [工具类 源文件]

game.h  [五子棋游戏实现 头文件]

game.c  [五子棋游戏实现 源文件]

四:效果展示 


一:初始化用户数据

多个用户名 密码如下:

char usernames[3][10]={"admin","lily","han"};//二维数组存储多个一维数组
char pwds[3][10]={"123456","abcdef","ABCDEF"};//二维数组存储多个一维数组

二:主要功能函数的封装

paintWindow:窗口界面的封装

glb_string:字符串输入控制的封装

void login:登陆验证功能实现界面绘制

三:源码分享

main.c  [程序主入口]

#include<stdio.h>
#include<conio.h>//getch
#include<string.h>//strcmp
#include<stdlib.h>//system("cls");
#include"CTools.h"
#include"game.h"

void login();

int main() 
{	
	login();
    return 0;
}

void login()     //登录验证功能界面
{
    char ch=0;//字符串
	int i=0;//计数
	char name[9]={0};//用户名字符数组  一维数组 部分初始化
	char pwd[9]={0};//密码字符数组 一维数组 部分初始化
	char usernames[3][10]={"admin","lily","han"};//二维数组存储多个一维数组
	char pwds[3][10]={"123456","abcdef","ABCDEF"};//二维数组存储多个一维数组

	//绘制一个窗口
	paintWindow(3,3,20,20);
	
	//绘制标题 标签
	// 光标定位在用户名输入的位置

	gotoxy(6+10,7);
	printf("登录界面");
	gotoxy(6+5,12);
	printf("账号:");
	gotoxy(6+5,16);
	printf("密码:");
	
	gotoxy(18,12);
	//用户名输入+存储
	//没有回显 getch()头文件 0-9大小写字母
	//结束标志\r
	while(1)
	{
		ch=getch();
		if(ch=='\r'&&i==0)  //任何内容都没输
		{	
			continue;
		}
		if(ch=='\r'&&i>0||i==8)  //长度最多八位
		{
			break;
		}
		if(ch>='0'&&ch<='9' || ch>='a'&&ch<='z'|| ch>='A'&&ch<='Z')
		{
			putch(ch);//用户名 明文
			name[i]=ch;//一维数组存储字符
			++i;//存储
		}	
	}

	//光标定位在密码输入的位置
	gotoxy(18,16);
	i=0;//同一个计数器 重置
	
	//密码输入和存储
	while(1)
	{
		ch=getch();
		if(ch=='\r'&&i==0)  //任何内容都没输
		{	
			continue;
		}
		if(ch=='\r'&&i>0||i==8)  //长度最多八位
		{
			break;
		}
		if(ch>='0'&&ch<='9' || ch>='a'&&ch<='z'|| ch>='A'&&ch<='Z')
		{
			putch('*');//密码密文
			pwd[i]=ch;//一维数组存储字符
			++i;//存储
		}
	}

	gotoxy(10,18); 
    for(i=0;i<3;i++)
	{
		//下一次回车 登录验证 admin 123456
		if(strcmp(name,usernames[i])==0&&strcmp(pwd,pwds[i])==0)//用户名 密码是否匹配
		{
			printf("登录成功");
			system("cls");//清屏函数
			playgame();//调用五子棋游戏函数
			break;
		}	
	}
	if(i==3)
	{
		printf("登录失败");
	}

	gotoxy(0,27);	
}

CTools.h  [工具类 头文件]

#ifndef CTOOLS_H
#define CTOOLS_H

void paintWindow(int startX,int startY,int width,int height);//打印窗口

void gotoxy(int x,int y);//形参  光标定位

/*
函数功能:字符串输入控制
函数参数:
int maxLen 允许输入最大长度
int inputType 允许输入的字符类型  0:数字 1:字母 2:字母+数字
int ips 数据显示格式  0:密文  1:明文
char str[] 存储输入字符
函数返回值:无
数组作为函数参数的三种写法:char str[]  char str[20]  char*str
*/
void glb_string(int maxLen,int inputType,int ips,char str[]); 

#endif

CTools.c  [工具类 源文件]

#include "CTools.h"
#include <windows.h>//gotoxy
#include<stdio.h>
#include<conio.h>

void gotoxy(int x,int y)//形参
{
	HANDLE hOut;
	COORD pos= {x,y};
	// 光标的起始位(第1列,第3行) 0是第1列 2是第3行
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
	//printf("定位光标位置搜索(%d,%d)\n",pos.X,pos.Y);
}

void paintWindow(int startX,int startY,int width,int height)  
{
	int i=0;
	//打印顶部   
	//光标定位 找规律 ┗  ┛ ┏ ┓ ┃ ━

	//顶部 y不变 x 在变 (x-x+w)
	gotoxy(startX,startY);
	printf("┏");
	for(i=0;i<width-2;i++)  //控制循环次数width-2次
	{	
		printf("━ ");
	}
	printf("┓");

	//左边 x不变 y在变 (y到y+height)
	for(i=1;i<=height-1;i++)
	{
		gotoxy(startX,startY+i);
		printf("┃");
	}
	
	//右边 x不变 =startx+width-1  y在变 y到y+height
	for(i=1;i<=height-1;i++)
	{
		gotoxy(startX+width*2-3,startY+i);
		printf("┃");
	}

	//底部 x在变化    y不变 (x到x+width) ━ 
	gotoxy(startX,startY+height-1);
	printf("┗");
	for(i=0;i<width-2;i++)
	{
		printf("━ ");	
	}
	printf("┛");

	gotoxy(startX,startX+height);	
}

void glb_string(int maxLen,int inputType,int ips,char str[])
{
//  一直输入
	   //获取用户输入的一个字符
	   //判断\r 有输入 结束循环break;
	   //判断输入类型   switch + 长度
	         //0 数字
	            //明文
	            //密文 存储
		     //1 字母
	            //明文
	            //密文  存储
			 //2 数字+字母
	            //明文
	            //密文  存储
	   char ch=0;
	   int i=0;
	   while(1)
	   {
		   ch=getch();
		   if(ch=='\r'&&i>0)
		   {
			   break; 
		   }
		   switch(inputType)
		   {
		   case 0:
			   if(ch>='0'&&ch<='9'&&i<maxLen)
			   {
				   if(ips==0)
				   {
					   putch('*');
				   }
				   else{
					   putch(ch);
				   }
				   str[i++]=ch;
			   }
			   break;
		   case 1:
			   if(i<maxLen&&(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
			   {
				   if(ips==0)
				   {
					   putch('*'); 
				   }
				   else{
					   putch(ch);
				   }
				   str[i++]=ch;
			   }
			   break;
           case 2:
               if(i<maxLen&&(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))
			   {
                   if(ips==0)
				   {
                       putch('*');
				   }
                   else{
                       putch(ch);
				   }
                   str[i++]=ch;
			   }
               break;
           default:
               break;
		   }
	   }	   
}

game.h  [五子棋游戏实现 头文件]

#ifndef GAME_H
#define GAME_H

void paintGameUI();
void playgame();

#endif

game.c  [五子棋游戏实现 源文件]

#include "CTools.h"
#include "game.h"  //引用自己编写的头文件
#include <stdio.h>

#define ROW 14
#define COL 14
    
void paintGameUI()  //打印游戏棋盘
{
	int i=0;
	int j=0;
	printf("┌ ");	 //顶部
	for(i=0;i<COL;i++)
	{
        printf("┬ ");
	}
	printf("┐\n");
	//中间
	for(j=0;j<ROW;j++)
	{
		printf("├ ");
		for(i=0;i<COL;i++)
		{
			printf("┼ ");
		}
		printf("┤\n");
	}
	//底部
	printf("└ ");
	for(i=0;i<COL;i++)
	{
        printf("┴ ");
	}
	printf("┘\n");
}

void playgame()
{
	int arr[ROW][COL]={0}; // 初始化 0-没有棋子 1用户下棋黑 2电脑下棋白
	int x,y;      //用户输入的行 列
	int row,col;  //落子的位置
	int i,j; //  规则   判断输赢 遍历二维数组
	paintGameUI();
	while(1)//确保多次
	{
		while(1)    //      保证用户能够有效落子一次
		{
			gotoxy(0,16);
			printf("                        ");  //覆盖掉用户之前所输
			gotoxy(0,16);
			
			printf("请输入下棋的位置,例如:(2 3):");
			scanf("%d %d",&x,&y);
			row = x-1;  //行 距离顶部的长度
			col =y-1;  //列 距离左边的长度
			if(arr[row][col]==0)   //下棋位置是否是棋子
			{   
				gotoxy(col*2,row);
				printf("●");//下棋
				//修改二维数组的值
				arr[row][col]=1;
				for(i=0;i<ROW;i++)    //赢的情况
				{
					for(j=0;j<COL;j++)
					{
						//横着五个都是1  
						if( arr[i][j]==arr[i][j+1]&&arr[i][j]==arr[i][j+2]&& 
							arr[i][j]==arr[i][j+3]&&arr[i][j]==arr[i][j+4]&&j+4<=COL&&arr [i][j]==1)
						{
							gotoxy(0,18);
							printf("用户赢了\n");
							return  ;   
							
						}//竖着五个都是1
						else if(arr[i][j]==arr[i+1][j]&&arr[i][j]==arr[i+2][j]&& 
							arr[i][j]==arr[i+3][j]&&arr[i][j]==arr[i+4][j]&&i+4<=ROW&&arr [i][j]==1)
						{
							gotoxy(0,18);
							printf("用户赢了\n");
							return ;   
						}	
					}
				}
				break;    //轮到对方下棋	
			}
			else if(arr[row][col]==1||arr[row][col]==2)  //用户下棋1 电脑下棋2
			{
				gotoxy(0,17);
				printf("请重新输入坐标");
			}		
		}
		while(1) //    确保电脑有效落子一次
		{
			//电脑下棋
			row= rand()%14+0;  //0-13   电脑随机落子
			col= rand()%14+0;
			
			if(arr[row][col]==0)   //下棋位置是否是棋子 空 电脑可以下棋
			{   
				gotoxy(col*2,row);
				printf("○");//下棋
				//修改二维数组的值
				arr[row][col]=2;
				for(i=0;i<ROW;i++)     //电脑赢 最好用算法
				{
					for(j=0;j<COL;j++)
					{
						//横着五个都是1  
						if( arr[i][j]==arr[i][j+1]&&arr[i][j]==arr[i][j+2]&& 
							arr[i][j]==arr[i][j+3]&&arr[i][j]==arr[i][j+4]&&j+4<=COL&&arr [i][j]==2)
						{
							gotoxy(0,18);
							printf("电脑赢了\n");
							return  ;	
						}//竖着五个都是1
						else if(arr[i][j]==arr[i+1][j]&&arr[i][j]==arr[i+2][j]&& 
							arr[i][j]==arr[i+3][j]&&arr[i][j]==arr[i+4][j]&&i+4<=ROW&&arr [i][j]==2)
						{
							gotoxy(0,18);
							printf("电脑赢了\n");
							return ;
						}
					}
				}
				break;
			}
		}
	}
}

四:效果展示 

输入账号密码,匹配用户数据则登录成功 

进入人机对局 

 

人机对局,作出胜负判断 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

chenruhan_QAQ_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值