一:多个用户名 密码如下
char usernames[3][10]={"admin","lily","han"};//二维数组存储多个一维数组
char pwds[3][10]={"123456","abcdef","ABCDEF"};//二维数组存储多个一维数组
二:封装
paintWindow窗口界面的封装
glb_string字符串输入控制 的封装
void login登陆验证功能实现界面绘制 函数独立
三:具体的头文件以及源文件
1.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);
}
2.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
3.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;
}
}
}
4.game.h
#ifndef GAME_H
#define GAME_H
void paintGameUI();
void playgame();
#endif
5.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;
}
}
}
}
结果: