五子棋(课程设计)
发布日期:2021-07-01 00:16:06 浏览次数:2 分类:技术文章

本文共 37322 字,大约阅读时间需要 124 分钟。

这个是本人的一个课程设计,五子棋小游戏。

代码:

#include 
#include
#include
#include
#include
#include
#include
#define N 15 /*棋盘大小*/void Log(); /*登录*/void tie(); /*和棋界面*/void pre(); /*未登录提示*/void menu(); /*主菜单,开始游戏,游戏设置,游戏介绍,排行榜,退出游戏*/void pause(); /*菜单*/void Getrun(); /*下棋模块*/void player(); /*玩家状态*/void window(); /*窗口设置*/void regist(); /*注册*/void member(); /*游戏开发人员介绍*/void Set_up(); /*游戏设置*/void welcome(); /*欢迎界面*/int Forbidden(); /*判断禁手*/void forbidden(); /*禁手设置*/void introduce(); /*游戏介绍*/void win(char ab); /*win界面*/void Change(char ab); /*密码修改*/void Log_AB(char ab); /*玩家AB的登录注销界面*/void Log_in(char ab); /*玩家AB登录*/void Log_out(char ab); /*玩家AB注销界面*/void Game_h(char input); /*悔棋函数*/int check(int x, int y); /*判断输赢*/void gotoxy(int x, int y); /*实现光标跳跃*/void print(int Cx, int Cy); /*打造棋盘*/void rank(char user, char r_w); /*排行榜*/void find(int x, int y, int k); /*查找棋子*/int pieces[N][N] = {0}, Cx, Cy;int next[8][2] = { {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}};int flag, count = 0, temp = 0, vis = 0, countpieces = 0, log_a = 0, log_b = 0, forbid = 0;char bz[10] = {"color E0"}; /*默认背景、字体颜色*/char log_AAccount[20] = {0}, log_BAccount[20] = {0};struct Find{ int ans, ans1, ans2;}f[10];struct XY { /*记录每次下棋的位置*/ int x, y;};struct node { /*利用链表把下棋的位置串起来*/ struct XY data; struct node *next, *last;};struct rank { int num, s_num; char account[20], name[50];}ran, ra, rb;struct noda { struct rank data; struct noda *next;};typedef struct noda Node, *LinkLista;LinkLista heada;typedef struct node LNode, *LinkList;LinkList head, prun;int main(){ char ch; rank('a', 'r'); /*将排行读入内存*/ system("title 简易五子棋 ——第一组制作"); /*设置标题*/ system("mode con cols = 62 lines = 41"); /*设置窗口大小*/ system(bz); /*设置颜色*/ welcome(); /*进入欢迎界面*/ while (ch = getch(), ch != '\r'); /*回车继续*/ while (1) { char n; system("CLS"); /*清屏*/ system(bz); /*更新背景字体颜色*/ menu(); /*进入主菜单界面*/ while (n = getch(), !(n >= '0' && n <= '5') && n != 'r' && n != 'l');/*判断是否为有效数字*/ switch(n) { case '0': return 0; /*如果输入为零,退出游戏*/ case '1': Getrun(); break; /*进入下棋界面*/ case '2': Set_up(); break; /*进入设置界面*/ case '3': introduce(); break; case '4': rank('r', 'r'); break; case '5': member(); break; case 'r': regist(); break; case 'l': Log(); break; } } return 0;}void print(int Cx, int Cy) /*打造棋盘*/{ if (Cx == 0) { for (int j = -1; j < N; j++) { if (j == Cy - 1 && Cx == 0) printf("┏"); else if (j == Cy && Cx == 0) printf(" ┓"); else printf(" "); } } printf("\n"); for (int i = 0; i < 2 * N - 1; i++) { if (Cy == 0 && i == Cx - 1) printf("┏"); else if (Cy == 0 && i == Cx + 1) printf("┗"); else printf(" "); for (int j = 0; j < N; j++) { if (i == 0) { if (j == 0) { if (pieces[i / 2][j] == 0) /*如果为0,证明无子*/ printf("┏━"); else if (pieces[i / 2][j] == 1) /*先手棋*/ printf("●━"); else if (pieces[i / 2][j] == 2) /*后手棋*/ printf("○━"); } else if (j == N - 1) { if (pieces[i / 2][j] == 0) printf("┓"); else if (pieces[i / 2][j] == 1) printf("●"); else if (pieces[i / 2][j] == 2) printf("○"); } else { if (pieces[i / 2][j] == 0) printf("┯━"); else if (pieces[i / 2][j] == 1) printf("●━"); else if (pieces[i / 2][j] == 2) printf("○━"); } } else if (i == 2 * N - 2) { if (j == 0) { if (pieces[i / 2][j] == 0) printf("┗━"); else if (pieces[i / 2][j] == 1) printf("●━"); else if (pieces[i / 2][j] == 2) printf("○━"); } else if (j == N - 1) { if (pieces[i / 2][j] == 0) printf("┛"); else if (pieces[i / 2][j] == 1) printf("●"); else if (pieces[i / 2][j] == 2) printf("○"); } else { if (pieces[i / 2][j] == 0) printf("┷━"); else if (pieces[i / 2][j] == 1) printf("●━"); else if (pieces[i / 2][j] == 2) printf("○━"); } } else { if (i % 2 == 1) { if (j == 0 || j == N - 1) { if (j == Cy - 1 && i == Cx - 1) printf("┃┏"); else if (j == Cy && i == Cx - 1) printf("┃┓"); else if (j == Cy - 1 && i == Cx + 1) printf("┃┗"); else if (j == Cy && i == Cx + 1) printf("┃┛"); else printf("┃ "); } else if (j == Cy - 1 && i == Cx - 1) printf( "│┏"); else if (j == Cy && i == Cx - 1) printf("│┓"); else if (j == Cy - 1 && i == Cx + 1) printf("│┗"); else if (j == Cy && i == Cx + 1) printf("│┛"); else printf("│ "); } else { if (j == 0) { if (pieces[i / 2][j] == 0) printf("┠─"); else if (pieces[i / 2][j] == 1) printf("●─"); else if (pieces[i / 2][j] == 2) printf("○─"); } else if (j == N - 1) { if (pieces[i / 2][j] == 0) printf("┨"); else if (pieces[i / 2][j] == 1) printf("●"); else if (pieces[i / 2][j] == 2) printf("○"); } else { if (pieces[i / 2][j] == 0) printf("┼─"); else if (pieces[i / 2][j] == 1) printf("●─"); else if (pieces[i / 2][j] == 2) printf("○─"); } } } } printf("\n"); } if (Cx + 2 == 2 * N) { for (int j = -1; j < N; j++) { if (j == Cy - 1 && Cx + 2 == 2 * N) printf("┗"); else if (j == Cy && Cx + 2 == 2 * N) printf(" ┛"); else printf(" "); } } printf("\n"); if (!vis) player(); /*在棋盘的最下面打印下棋玩家*/}void Getrun(){G: char ch; if (!log_a || !log_b) /*有玩家未登录*/ { pre(); /*进入提示界面*/ while (ch = getch(), ch != 'Y' && ch != 'N' && ch != 'y' && ch != 'n' && ch != '*'); switch(ch) { case 'y': case 'Y': break; /*确定进入*/ case 'n': case 'N': case '*': return ; /*取消进入*/ } } Cy = N / 2, Cx = (2 * N - 1) / 2; /*初始方标位置*/ int winner, input; LinkList p, p1; prun = p1 = head = (LinkList)malloc(sizeof(LNode)); /*申请一个内存空间*/ head -> last = head -> next = NULL; /*使链表的头和尾指向空*/ p1 -> data.x = Cx / 2; p1 -> data.y = Cy; countpieces = 0; /*计算落子数*/ flag = 1, vis = 0; memset(pieces, 0, sizeof(pieces)); /*初始化下棋数组*/ while (countpieces < N * N) {H: system("CLS"); /*清屏*/ print(Cx, Cy); /*打造棋盘*/ if (temp) /*显示提示信息*/ { printf("已有棋子,请重新下棋!"); temp = 0; } while (input = getch(), input != '+' && input != '-' && input != '*' && (flag != 2 || input != 0xE0) && !(flag == 1 && (input == 0x77 || input == 0x73 || input == 0x61 || input == 0x64)) && !(flag == 1 && input == 0x20 || flag == 2 && input == 0x4F)); if (input == '+' || input == '-') /*判断是否为悔棋和复棋*/ { Game_h(input); /*进行悔棋复棋*/ goto H; } else if (input == '*') /*如果为*,打开菜单*/ {P: pause(); /*进入菜单*/ while (ch = getch(), !(ch <= '5' && ch >= '0')); switch(ch) { case '0': return ; /*如果是0则退出程序*/ case '1': break; /*继续游戏*/ case '2': goto G; /*开始新游戏*/ case '3': Set_up(); goto P; /*进入设置界面*/ case '4': introduce(); goto P; /*进入游戏介绍*/ case '5': rank('r', 'r'); goto P; /*查看游戏介绍*/ } } else { if (flag == 2 && input == 0xE0) /*如果按下的是方向键,会填充两次输入,第一次为0xE0表示按下的是控制键*/ { input = getch(); /*获得第二次输入信息*/ switch(input) /*判断方向键方向并移动光标位置*/ { case 0x4B : Cy--; break; case 0x48 : Cx-=2; break; case 0x4D : Cy++; break; case 0x50 : Cx+=2; break; } } else if (flag == 1 && (input == 0x77 || input == 0x73 || input == 0x61 || input == 0x64)) { switch(input) /*判断字母键方向并移动光标位置*/ { case 0x61 : Cy--; break; case 0x77 : Cx-=2; break; case 0x64 : Cy++; break; case 0x73 : Cx+=2; break; } } if(Cy < 0) Cy = N - 1; /*如果光标位置越界则移动到对侧*/ if(Cx < 0) Cx = 2 * N - 2; if(Cy > N - 1) Cy = 0; if(Cx > 2 * N - 1) Cx = 0; } if (flag == 1 && input == 0x20 || flag == 2 && input == 0x4F) { if (pieces[Cx / 2][Cy] == 0) /*判断是否可以落子*/ { /*可以落子*/ p1 = prun; /*更新下棋的顺序*/ pieces[Cx / 2][Cy] = flag; countpieces++; if (flag == 1) /*改变游戏状态*/ flag = 2; else flag = 1; p = (LinkList)malloc(sizeof(LNode)); /*存下每次下棋的位置*/ p -> data.x = Cx / 2; p -> data.y = Cy; p -> last = p1; p -> next = NULL; p1 -> next = p; prun = p1 = p; winner = check(Cx / 2, Cy); /*检查判断输赢和游戏是否继续*/ if (winner != 1 && flag == 2 && forbid && Forbidden()) winner = 2; if (winner || countpieces == N * N) vis = 1; if (winner == 1) /*A赢了*/ { system("CLS"); /*清屏*/ print(Cx, Cy); /*重画棋盘*/ if (log_a && log_b) rank('A', 'w'); win('A'); break; } else if (winner == 2) /*B赢了*/ { system("CLS"); /*清屏*/ print(Cx, Cy); /*重画棋盘*/ if (log_a && log_b) rank('B', 'w'); win('B'); break; } } else /*该位置已有棋子*/ { temp = 1; /*标记一下*/ system("CLS"); /*清屏*/ print(Cx, Cy); /*重画棋盘*/ } } } if (countpieces == N * N) /*和棋*/ tie(); /*打印和棋界面*/ while (ch = getch(), ch != '\r'); /*按回车继续*/}int check(int x, int y) /*判断输赢*/{ int count[8] = {0}; /*count置初值*/ for (int k = 0; k < 8; k++) { int i = x, j = y; i += next[k][0]; j += next[k][1]; while (i >= 0 && i < N && j >= 0 && j < N && count[k] < 5) { if (pieces[i][j] == pieces[x][y]) /*判断是否有落子及是否为同一玩家*/ count[k]++; else break; /*无落子或不是同一玩家,退出循环*/ i += next[k][0]; j += next[k][1]; } } for (int k = 0; k < 4; k++) if (count[k] + count[k + 4] >= 4) /*判断能否组成五子*/ return pieces[x][y]; return 0; /*未形成五子连成一条线的状态,返回0*/}void find(int x, int y, int k) /*查找棋子*/{ int i = x, j = y; i += next[k][0]; /*向规定方向查找*/ j += next[k][1]; while (1) { if (i <= 0 || i >= N - 1 || j <= 0 || j >= N - 1) return ; /*到边界退出*/ if (pieces[i][j] == pieces[x][y]) /*判断是否为同一棋子*/ f[k].ans++; /*棋子个数加一*/ else if (!pieces[i][j]) /*还未下棋*/ { if (!f[k].ans1 && pieces[i + next[k][0]][j + next[k][1]] == pieces[x][y] && pieces[i - next[k][0]][j - next[k][1]] == pieces[x][y]) f[k].ans1++; /*两边不为该棋子,中间空格数加一*/ else { f[k].ans2++; /*两头空格数加一*/ if (pieces[i + next[k][0]][j + next[k][1]] == pieces[x][y]) return ; } } else return ; if (f[k].ans2 >= 2) /*两头空格数大于一退出*/ return ; i += next[k][0]; /*继续走*/ j += next[k][1]; }}int Forbidden() /*判断三三禁手*/{ for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) /*遍历整个棋盘*/ { memset(f, 0, sizeof(f)); if (pieces[i][j] == 1) /*如果为黑棋,进入*/ { for (int k = 0; k < 8; k++) find(i, j, k); /*找出八个方向的棋子数空格数*/ for (int k = 0; k < 4; k++) for (int u = 0; u < 4; u++) if (u != k) /*判断两个列,行,斜行*/ if ((f[k].ans + f[k + 4].ans == 2 && (!(f[k].ans1 + f[k + 4].ans1) && f[k].ans2 + f[k + 4].ans2 >= 3 || (f[k].ans1 + f[k + 4].ans1 == 1 && f[k].ans2 && f[k + 4].ans2))) && (f[u].ans + f[u + 4].ans == 2 && (!(f[u].ans1 + f[u + 4].ans1) && f[u].ans2 + f[u + 4].ans2 >= 3 || f[u].ans1 + f[u + 4].ans1 == 1 && f[u].ans2 && f[u + 4].ans2))) return 1; } } return 0;}void welcome() /*打印欢迎界面*/{ system("CLS"); /*清屏*/ printf("\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * *\n"); printf(" * *五 子 棋* *\n"); printf(" * *\n"); printf(" * *欢迎使用五子棋对战程序* *\n"); printf(" * *祝您玩的愉快* *\n"); printf(" * *\n"); printf(" * ╔════╗ *\n"); printf(" * ║ 确 定 ║ *\n"); printf(" * ╚════╝ *\n"); printf(" * *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n ");}void menu() /*打印主菜单界面*/{ system("CLS"); /*清屏*/ printf("\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * *主 菜 单* r.注册.r l.用户.l * *\n"); printf(" * ****************************************************** *\n"); printf(" * * * *\n"); printf(" * * 1.*开始游戏*.1 * *\n"); printf(" * * * *\n"); printf(" * * 2.*游戏设置*.2 * *\n"); printf(" * * * *\n"); printf(" * * 3.*游戏介绍*.3 * *\n"); printf(" * * * *\n"); printf(" * * 4.*排行榜*.4 * *\n"); printf(" * * * *\n"); printf(" * * 5.*开发成员*.5 * *\n"); printf(" * * * *\n"); printf(" * * 0.*退出游戏*.0 * *\n"); printf(" * * * *\n"); printf(" * ****************************************************** *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n ");}void pre(){ system("CLS"); /*清屏*/ printf("\n"); /*打造选择玩家界面*/ printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * *玩家还未登录确定进入游戏吗?* *\n"); printf(" * *不登录,将不保存玩家本局的任何信息* *\n"); printf(" * **************************************************** *\n"); printf(" * ************ ╔════╗ ╔════╗ ************ *\n"); printf(" * ******** ║Y.确定.Y║ ║N.取消.N║ ******** *\n"); printf(" * ************ ╚════╝ ╚════╝ ************ *\n"); printf(" * **************************************************** *\n"); printf(" * *返回* *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n ");}void Set_up(){ char c;l: system("CLS"); /*清屏*/ printf("\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * *游戏设置* * *\n"); printf(" * ****************************************************** *\n"); printf(" * * * *\n"); printf(" * * 1.*禁手设置*.1 * *\n"); printf(" * * * *\n"); printf(" * * 2.*背景字体设置*.2 * *\n"); printf(" * * * *\n"); printf(" * ****************************************************** *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n "); while (c = getch(), c != '1' && c != '2' && c != '*'); switch(c) { case '*': return ; case '1': forbidden(); break; case '2': window(); break; } goto l;}void forbidden(){ char c; system("CLS"); /*清屏*/ printf("\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); if (forbid) printf(" * *已开启禁手,请选择:* *\n"); else printf(" * *已关闭禁手,请选择:* *\n"); printf(" * **************************************************** *\n"); printf(" * ************ ╔════╗ ╔════╗ ************ *\n"); printf(" * ******** ║N.开启.N║ ║F.关闭.F║ ******** *\n"); printf(" * ************ ╚════╝ ╚════╝ ************ *\n"); printf(" * **************************************************** *\n"); printf(" * *返回* *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n "); while (c = getch(), c != 'N' && c != 'F' && c != 'n' && c != 'f' && c != '*');/*判断是否为以上字符*/ switch(c) { case '*': return ; case 'n': case 'N': forbid = 1; break; case 'f': case 'F': forbid = 0; break; } if (forbid) printf("开启成功!"); else printf("关闭成功!"); while (c = getch(), c != '\r');}void window() /*打印设置界面*/{L: int ans = 0; char b = 0, z = 0, c, ch, b_z[2]; /*初始化数据*/ system(bz); /*更新颜色*/ system("CLS"); /*清屏*/ printf("\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * ****************************************************** *\n"); printf(" * * * *\n"); printf(" * * 0 = 黑色 8 = 灰色 * *\n"); printf(" * * * *\n"); printf(" * * 1 = 蓝色 9 = 淡蓝色 * *\n"); printf(" * * * *\n"); printf(" * * 2 = 绿色 A = 淡绿色 * *\n"); printf(" * * * *\n"); printf(" * * 3 = 湖蓝色 B = 淡浅绿色 * *\n"); printf(" * * * *\n"); printf(" * * 4 = 红色 C = 淡红色 * *\n"); printf(" * * * *\n"); printf(" * * 5 = 紫色 D = 淡紫色 * *\n"); printf(" * * * *\n"); printf(" * * 6 = 黄色 E = 淡黄色 * *\n"); printf(" * * * *\n"); printf(" * * 7 = 白色 F = 亮白色 * *\n"); printf(" * * ╔════╗ * *\n"); printf(" * * ║* 返回 *║ * *\n"); printf(" * * ╚════╝ * *\n"); printf(" * ****************************************************** *\n"); printf(" * * * *\n"); printf(" * * 请输入背景颜色对应的编码: * *\n"); printf(" * * * *\n"); printf(" * * 请输入字体颜色对应的编码: * *\n"); printf(" * * * *\n"); printf(" * ****************************************************** *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); gotoxy(33, 24); /*使光标跳到指定位置*/ while (c = getch()) /*输入操作的字符*/ { if (c == '*') /*返回上次界面*/ return ; if (c == '\r' && ans > 0) /*跳到字体颜色输入*/ break; if (!(c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F')) /*不是上面合法字符*/ { if (c == 8 && ans > 0) /*判断是否为删除键*/ { ans--; /*删除*/ b = 0; printf("\b \b"); /*覆盖*/ } continue; } if (ans < 1) /*最多输入一个*/ { printf("%c", c); /*打印输入字符*/ b = c; ans++; /*个数加一*/ } } ans = 0; /*初始化个数*/ gotoxy(33, 26); /*使光标跳到指定位置*/ while (c = getch()) { if (c == '*') /*返回上次界面*/ return ; if (c == '\r' && ans > 0) /*输入结束*/ break; if (fabs(b - c) == 0 || fabs(b - c) == 32 || !(c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F')) { /*不满足上面字符*/ if (c == 8 && ans > 0) /*判断删除键*/ { ans--; /*删除*/ z = 0; printf("\b \b"); /*覆盖*/ } continue; } if (ans < 1) /*最多输入一个*/ { printf("%c", c); /*打印输入字符*/ z = c; ans++; /*个数加一*/ } } gotoxy(0, 30); /*光标回位*/ sprintf(b_z, "color %c%c", b, z); /*构建颜色字串*/ system(b_z); /*输出输入颜色*/ printf(" ╔═════╗ ╔═════╗ \n"); printf(" ║+确定更改+║ ║-重新设置-║ \n"); printf(" ╚═════╝ ╚═════╝ \n"); printf(" "); while (ch = getch(), ch != '+' && ch != '-' && ch != '*'); if (ch == '*') /*返回界面*/ return ; switch(ch) /*判断是否更改*/ { case '+': strcpy(bz, b_z); break; case '-': system("CLS"); goto L; }}void introduce(){ system("CLS"); FILE *fp; char c; fp = fopen("introduce.txt", "r"); while (~fscanf(fp, "%c", &c)) { printf("%c", c); } fclose(fp); while (c = getch(), c != '\r');}void player() /*打印下棋状态提示*/{ printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * *悔-棋* *复+棋* *\n"); printf(" * **************************************************** *\n"); printf(" * *************** *************** *\n"); if (flag == 1) printf(" * *********** *请玩家A●下棋!* *********** *\n"); else printf(" * *********** *请玩家B○下棋!* *********** *\n"); printf(" * *************** *************** *\n"); printf(" * **************************************************** *\n"); printf(" * *暂停* *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n ");}void win(char ab) /*打印胜利界面*/{ printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * *游戏结束* *\n"); printf(" * **************************************************** *\n"); printf(" * *************** *************** *\n"); if (ab == 'A') printf(" * *********** *恭喜玩家A●赢了!* *********** *\n"); else printf(" * *********** *恭喜玩家B○赢了!* *********** *\n"); printf(" * *************** *************** *\n"); printf(" * **************************************************** *\n"); printf(" * *请按回车返回* *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n ");}void tie() /*打印和棋界面*/{ printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * *游戏结束* *\n"); printf(" * **************************************************** *\n"); printf(" * *************** *************** *\n"); printf(" * *********** *和棋* *********** *\n"); printf(" * *************** *************** *\n"); printf(" * **************************************************** *\n"); printf(" * *请按回车返回* *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n ");}void Game_h(char input) /*悔棋、复棋*/{ if (input == '-' && prun -> last != NULL) { pieces[prun -> data.x][prun -> data.y] = 0; /*使该位置无子*/ flag++; flag = 2 - flag % 2; /*改变下棋状态*/ countpieces--; /*棋子数减一*/ prun = prun -> last; /*回到上次落棋点*/ Cx = prun -> data.x * 2; Cy = prun -> data.y; } else if (input == '+' && prun -> next != NULL) { prun = prun -> next; /*恢复棋盘*/ Cx = prun -> data.x * 2; /*更新方标位置*/ Cy = prun -> data.y; pieces[prun -> data.x][prun -> data.y] = flag; flag++; /*更新下棋状态*/ flag = 2 - flag % 2; countpieces++; /*棋子数加一*/ }}void regist() /*玩家注册界面*/{ FILE *fp1, *fp2; /*定义文件指针*/ fp1 = fopen("Account_number.txt", "a"); /*打开文件*/ int j = 0, k, ans = 0, temp = 0;C: system("CLS"); /*清屏*/ char c, Account[110], password[2][110], ch, name[110][3]; printf("\n"); /*打造窗口*/ printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * ╔══════════╗ *\n"); printf(" * 请输入账号:║ ║ *\n"); printf(" * ╚══════════╝ *\n"); printf(" * ╔══════════╗ *\n"); printf(" * 请输入密码:║ ║ *\n"); printf(" * ╚══════════╝ *\n"); printf(" * ╔══════════╗ *\n"); printf(" * 请确认密码:║ ║ *\n"); printf(" * ╚══════════╝ *\n"); printf(" * ╔══════════╗ *\n"); printf(" * 请输入昵称:║ ║ *\n"); printf(" * ╚══════════╝ *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); switch(temp) /*判断哪种情况*/ { case 0: break; case 1: printf(" 账号不能为空!"); temp = 0; break; case 2: printf(" 密码的长度不能少于6位!"); temp = 0; break; case 3: printf(" 请确定两次输入的密码一致!"); temp = 0; break; case 4: printf(" 该账号已被注册,请重新注册!"); temp = 0; break; } gotoxy(20, 3); /*使光标跳到指定位置*/ j = 0; while (c = getch(), c != '\r') /*输入回车跳出循环*/ { if (c == '*') /*按*返回上次界面*/ return ; if (!(c >= '0' && c <= '9')) /*账号为数字*/ { if (c == 8 && j > 0) /*判断能否删除*/ { j--; if (j > 0) printf("\b\b \b\b"); else printf("\b \b"); } continue; } if (j < 10) /*账号的长度不超过10位*/ { Account[j++] = c; if (j - 1) printf(" "); printf("%c", c); } } Account[j] = '\0'; char account[20]; fp2 = fopen("Account_number.txt", "r"); /*打开文件*/ while (~fscanf(fp2, "%s%*s%*s", account)) /*判断该账号是否已注册*/ { if (!strcmp(Account, account)) { temp = 4; break; } } fclose(fp2); if (temp) /*如果已注册,重新注册*/ goto C; for (int i = 0; i < 2; i++) { j = 0; gotoxy(20, 3 * (i + 2)); while (c = getch(), c != '\r') { if (c == '*') return ; if (c == 8 && j > 0) { printf("\b\b \b\b"); j--; continue; } if (c != 8 && j < 10) { if (!isalpha(c) && !isdigit(c) && c != '.') /*密码为字母、数字、.*/ continue; password[i][j++] = c; printf("●");//·● } } password[i][j] = '\0'; } gotoxy(20, 12); j = k = ans = 0; while (c = getch(), c != '\r') /*输入昵称*/ { if (c == '*') return ; if (c == 8 && j > 0) { if (name[j - 1][0] >= 0) /*如果删除的非汉字,退一格*/ { printf("\b \b"); j--; ans--; continue; } printf("\b\b \b\b"); /*否则退两格*/ j--; ans -= 2; continue; } if (!(c != 8 && ans < 20)) continue; ans++; if (c < 0) /*输入为汉字*/ { if (ans != 20 || k != 0) { name[j][k++] = c; printf("%c", c);//·● if(k >= 2) { name[j][2] = '\0'; j++; k = 0; } } else ans--; continue; } if (c != ' ') /*昵称不包含空格*/ { name[j][0] = c; name[j++][1] = '\0'; printf("%c", c);//·● } } if (!strlen(Account)) /*判断账号是否为空*/ temp = 1; else if (strlen(password[0]) < 6) /*判断密码长度是否小于六位*/ temp = 2; else if (strcmp(password[0], password[1])) /*判断两次输入的密码是否相等*/ temp = 3; else temp = 0; if (temp) /*如果出现以上情况,重新注册*/ goto C; name[j][k] = '\0'; printf("\n\n\n "); gotoxy(0, 15); printf(" 恭喜注册成功!\n "); fprintf(fp1, "%s %s ", Account, password[0]); /*注册成功,把账号密码存下来*/ if (!j) fprintf(fp1, "%s", Account); /*如果昵称为空,默认账号为昵称*/ else for (k = 0; k < j; k++) /*保存昵称*/ fprintf(fp1, "%s", name[k]); fprintf(fp1, "\n"); /*存入换行*/ fclose(fp1); /*关闭文件*/ while (ch = getch(), ch != '\r'); /*回车返回*/}void Log() /*用户界面*/{L: system("CLS"); /*清屏*/ char c; printf("\n"); /*打造选择玩家界面*/ printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * *请选择玩家* *\n"); printf(" * **************************************************** *\n"); printf(" * ************** ╔═══╗ ╔═══╗ ************** *\n"); printf(" * ********** ║玩家:A║ ║玩家:B║ ********** *\n"); printf(" * ************** ╚═══╝ ╚═══╝ ************** *\n"); printf(" * **************************************************** *\n"); printf(" * *返回* *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n "); while (c = getch(), c != 'A' && c != 'B' && c != 'a' && c != 'b' && c != '*');/*输入的是否为这三种字符*/ if (c == '*') /*按下*返回上个界面*/ return ; if (c == 'a') c = 'A'; if (c == 'b') c = 'B'; Log_AB(c); /*进入玩家A界面*/ goto L; /*重新进入此界面*/}void Log_AB(char ab) /*玩家AB界面*/{L: system("CLS"); /*清屏*/ char ch, c; printf("\n"); /*打造选择界面*/ printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); if (ab == 'A') printf(" * *玩家A请选择:* *\n"); else printf(" * *玩家B请选择:* *\n"); printf(" * **************************************************** *\n"); printf(" * ************ ╔════╗╔════╗ ************ *\n"); printf(" * ********* ║I.登录.I║║O.注销.O║ ********* *\n"); printf(" * ************ ╚════╝╚════╝ ************ *\n"); printf(" * ************* ╔══════╗ ************* *\n"); printf(" * ********* ║C.修改密码.C║ ********* *\n"); printf(" * ************* ╚══════╝ ************* *\n"); printf(" * **************************************************** *\n"); printf(" * *返回* *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n "); while (c = getch(), c != 'I' && c != 'O' && c != 'C' && c != 'i' && c != 'o' && c != 'c' && c != '*');/*判断是否为以上字符*/ if (c == '*') return ; /*返回上个界面*/ if (ab == 'A') { if ((c == 'I' || c == 'i') && log_a) /*判断玩家A是否已登录*/ { printf("玩家A已登录,请重新选择!"); while (ch = getch(), ch != '\r'); goto L; /*如果已登录,重新选择*/ } else if ((c == 'O' || c == 'C' || c == 'o' || c == 'c') && !log_a)/*判断玩家A是否已登录*/ { printf("玩家A还未登录,请前往登录!"); while (ch = getch(), ch != '\r'); goto L; /*如果还未登录,重新选择*/ } } else { if ((c == 'I' || c == 'i') && log_b) /*判断玩家B是否已登录*/ { printf("玩家B已登录,请重新选择!"); while (ch = getch(), ch != '\r'); goto L; /*如果已登录,重新选择*/ } else if ((c == 'O' || c == 'C' || c == 'o' || c == 'c') && !log_b)/*判断玩家B是否已登录*/ { printf("玩家B还未登录,请前往登录!"); while (ch = getch(), ch != '\r'); goto L; /*如果还未登录,重新选择*/ } } switch(c) { case 'i': case 'I': Log_in(ab); break; /*进入玩家登录界面*/ case 'o': case 'O': Log_out(ab); break; /*进入玩家注销界面*/ case 'c': case 'C': Change(ab); break; /*进入密码修改界面*/ }}void Log_in(char ab) /*玩家登录界面*/{ FILE *fp1; /*定义文件指针*/ int j, temp = 0;C: system("CLS"); /*清屏*/ char c, Account[110], password[110], ch; printf("\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * ╔══════════╗ *\n"); printf(" * 请输入账号:║ ║ *\n"); printf(" * ╚══════════╝ *\n"); printf(" * ╔══════════╗ *\n"); printf(" * 请输入密码:║ ║ *\n"); printf(" * ╚══════════╝ *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); switch(temp) /*判断哪种情况*/ { case 0: break; case 1: printf(" 账号不能为空!"); temp = 0; break; case 2: printf(" 请确认密码是否正确!"); temp = 0; break; case 3: printf(" 该账号已登录,请重新登录!"); temp = 0; break; case 4: printf(" 该账号未被注册,请前往注册!"); temp = 0; break; } gotoxy(20, 3); j = 0; while (c = getch(), c != '\r') { if (c == '*') return ; if (!(c >= '0' && c <= '9')) /*账号为数字*/ { if (c == 8 && j > 0) /*如果是Backspace键*/ { j--; if (j > 0) printf("\b\b \b\b"); /*清除数字加空格*/ else printf("\b \b"); /*清除数字*/ } continue; } if (j < 10) { Account[j++] = c; if (j - 1) printf(" "); /*输出一个空格*/ printf("%c", c); } } Account[j] = '\0'; gotoxy(20, 6); j = 0; while (c = getch(), c != '\r') { if (c == '*') return ; if (c == 8 && j > 0) { printf("\b\b \b\b"); j--; continue; } if (c != 8 && j < 10) { if (!isalpha(c) && !isdigit(c) && c != '.') continue; password[j++] = c; printf("●");//·● } } password[j] = '\0'; char account[20], pass[20]; fp1 = fopen("Account_number.txt", "r"); while (~fscanf(fp1, "%s%s%*s", account, pass)) { if (!strcmp(Account, account)) /*判断是否注册过*/ { temp = 1; if (!strcmp(password, pass)) /*判断密码是否正确*/ { temp = 2; break; } break; } } fclose(fp1); if (!strlen(Account)) /*判断账号是否为空*/ temp = 1; else if (temp == 1) /*密码错误*/ temp = 2; else if (!strcmp(log_BAccount, Account) && ab == 'A')/*该账号已登录*/ temp = 3; else if (!strcmp(log_AAccount, Account) && ab == 'B') temp = 3; else if (!temp) /*该账号未注册*/ temp = 4; else temp = 0; if (temp) goto C; /*重新登录*/ if (ab == 'A') { log_a = 1; strcpy(log_AAccount, Account); /*保存玩家A的账号*/ } else { log_b = 1; strcpy(log_BAccount, Account); /*保存玩家B的账号*/ } printf("\n\n\n "); /*清除下方显示的提示*/ gotoxy(0, 9); printf(" 恭喜登录成功!\n "); /*登录成功*/ while (ch = getch(), ch != '\r'); /*回车返回*/}void Log_out(char ab) /*玩家注销界面*/{ char ch, c; system("CLS"); /*清屏*/ printf("\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * *请确认注销* *\n"); printf(" * **************************************************** *\n"); printf(" * ************ ╔════╗ ╔════╗ ************ *\n"); printf(" * ********* ║Y.确定.Y║ ║N.取消.N║ ********* *\n"); printf(" * ************ ╚════╝ ╚════╝ ************ *\n"); printf(" * **************************************************** *\n"); printf(" * *返回* *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n "); while (c = getch(), c != 'Y' && c != 'N' && c != 'y' && c != 'n' && c != '*');/*判断是否为有效输入*/ if (c == '*' || c == 'N' || c == 'n') return ; /*返回上次界面*/ if (ab == 'A') { log_a = 0; /*重置玩家信息*/ memset(log_AAccount, 0, sizeof(log_AAccount)); } else { log_b = 0; /*重置玩家信息*/ memset(log_BAccount, 0, sizeof(log_BAccount)); } printf("注销成功!"); while (ch = getch(), ch != '\r'); /*回车返回*/}void Change(char ab) /*修改密码界面*/{ FILE *fp1, *fp2; /*定义文件指针*/ int j = 0, k, ans = 0, temp = 0;C: system("CLS"); /*清屏*/ char c, pass[15], password[2][15], ch, name[15][3], nama[40]; printf("\n"); /*打造窗口*/ printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * ╔══════════╗ *\n"); printf(" * 请输入旧密码:║ ║ *\n"); printf(" * ╚══════════╝ *\n"); printf(" * ╔══════════╗ *\n"); printf(" * 请输入新密码:║ ║ *\n"); printf(" * ╚══════════╝ *\n"); printf(" * ╔══════════╗ *\n"); printf(" * 请确认新密码:║ ║ *\n"); printf(" * ╚══════════╝ *\n"); printf(" * ╔══════════╗ *\n"); printf(" * 请输入新昵称:║ ║ *\n"); printf(" * ╚══════════╝ *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); switch(temp) /*判断哪种情况*/ { case 0: break; case 1: printf(" 密码错误!"); temp = 0; break; case 2: printf(" 密码的长度不能少于6位!"); temp = 0; break; case 3: printf(" 请确定两次输入的新密码一致!"); temp = 0; break; } gotoxy(22, 3); /*使光标跳到指定位置*/ j = 0; while (c = getch(), c != '\r') { if (c == '*') return ; if (c == 8 && j > 0) { printf("\b\b \b\b"); j--; continue; } if (c != 8 && j < 10) { if (!isalpha(c) && !isdigit(c)) /*密码为字母、数字*/ continue; pass[j++] = c; printf("●");//·● } } pass[j] = '\0'; char account[20], passw[20]; /*临时账号,密码*/ fp2 = fopen("Account_number.txt", "r"); /*打开文件*/ while (~fscanf(fp2, "%s%s%*s", account, passw)) { if (ab == 'A' && !strcmp(log_AAccount, account) || ab == 'B' && !strcmp(log_BAccount, account)) { if (strcmp(passw, pass)) /*判断输入的密码是否正确*/ temp = 1; break; } } fclose(fp2); if (temp) /*如果密码错误,重新输入*/ goto C; for (int i = 0; i < 2; i++) { j = 0; gotoxy(22, 3 * (i + 2)); while (c = getch(), c != '\r') { if (c == '*') return ; if (c == 8 && j > 0) { printf("\b\b \b\b"); j--; continue; } if (c != 8 && j < 10) { if (!isalpha(c) && !isdigit(c) && c != '.')/*密码为字母、数字、.*/ continue; password[i][j++] = c; printf("●");//·● } } password[i][j] = '\0'; } gotoxy(22, 12); j = k = ans = 0; while (c = getch(), c != '\r') /*输入新昵称*/ { if (c == '*') return ; if (c == 8 && j > 0) { if (name[j - 1][0] >= 0) /*如果删除的非汉字,退一格*/ { printf("\b \b"); j--; ans--; continue; } printf("\b\b \b\b"); /*否则退两格*/ j--; ans -= 2; continue; } if (!(c != 8 && ans < 20)) continue; ans++; if (c < 0) /*输入为汉字*/ { if (ans != 20 || k != 0) { name[j][k++] = c; printf("%c", c);//·● if(k >= 2) { name[j][2] = '\0'; j++; k = 0; } } else ans--; continue; } if (c != ' ') /*昵称不包含空格*/ { name[j][0] = c; name[j++][1] = '\0'; printf("%c", c);//·● } } if (strlen(password[0]) < 6) /*判断密码长度是否小于六位*/ temp = 2; else if (strcmp(password[0], password[1])) /*判断两次输入的密码是否相等*/ temp = 3; else temp = 0; if (temp) /*如果出现以上情况,重新输入*/ goto C; name[j][k] = '\0'; printf("\n\n\n "); gotoxy(0, 15); printf(" 密码已修改,请重新登录!"); fp1 = fopen("Account_number.txt1", "w"); /*新建临时文件*/ fp2 = fopen("Account_number.txt", "r"); /*打开文件*/ while (~fscanf(fp2, "%s%s%s", account, passw, nama)) { if (ab == 'A' && !strcmp(log_AAccount, account) || ab == 'B' && !strcmp(log_BAccount, account)) { fprintf(fp1, "%s %s ", account, password[0]);/*修改成功,把账号密码存下来*/ if (!j) fprintf(fp1, "%s", account); /*如果昵称为空,默认账号为昵称*/ else for (k = 0; k < j; k++) /*保存昵称*/ fprintf(fp1, "%s", name[k]); } else fprintf(fp1, "%s %s %s", account, passw, nama); fprintf(fp1, "\n"); /*存入换行*/ } fclose(fp1); /*关闭文件*/ fclose(fp2); if (ab == 'A') { log_a = 0; /*重置玩家A信息*/ memset(log_AAccount, 0, sizeof(log_AAccount)); } else { log_b = 0; /*重置玩家B信息*/ memset(log_BAccount, 0, sizeof(log_BAccount)); } remove("Account_number.txt"); /*删除原文件*/ rename("Account_number.txt1","Account_number.txt"); /*将临时文件名改为原文件名*/ while (ch = getch(), ch != '\r'); /*回车返回*/}void pause() /*打印菜单界面*/{ system("CLS"); /*清屏*/ printf("\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * *菜 单* * *\n"); printf(" * ****************************************************** *\n"); printf(" * * * *\n"); printf(" * * 1.*继续游戏*.1 * *\n"); printf(" * * * *\n"); printf(" * * 2.*新游戏*.2 * *\n"); printf(" * * * *\n"); printf(" * * 3.*游戏设置*.3 * *\n"); printf(" * * * *\n"); printf(" * * 4.*游戏介绍*.4 * *\n"); printf(" * * * *\n"); printf(" * * 5.*排行榜*.5 * *\n"); printf(" * * * *\n"); printf(" * * 0.*返回主菜单*.0 * *\n"); printf(" * * * *\n"); printf(" * ****************************************************** *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" ");}void member() /*开发人员介绍界面*/{ FILE *fp; /*定义文件指针*/ char ch, group[5], number[3][15], name[3][15]; fp = fopen("member.txt", "r"); /*打开文件*/ fscanf(fp, "%s", group); for (int i = 0; i < 3; i++) fscanf(fp, "%s%s", number[i], name[i]); system("CLS"); /*清屏*/ printf("\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * * *开 发 人 员 介 绍* * *\n"); printf(" * ****************************************************** *\n"); printf(" * * * *\n"); printf(" * * ╔══╦═══════════════╗ * *\n"); printf(" * * ║ 组 ║ 成 员 ║ * *\n"); printf(" * * ║ ╠═══════╦═══════╣ * *\n"); printf(" * * ║ 号 ║ 学 号 ║ 姓 名 ║ * *\n"); printf(" * * ╠══╬═══════╬═══════╣ * *\n"); printf(" * * ║ 第 ║ %s ║ %s ║ * *\n", number[0], name[0]); printf(" * * ║ ╠═══════╬═══════╣ * *\n"); printf(" * * ║ %s ║ %s ║ %s ║ * *\n", group, number[1], name[1]); printf(" * * ║ ╠═══════╬═══════╣ * *\n"); printf(" * * ║ 组 ║ %s ║ %s ║ * *\n", number[2], name[2]); printf(" * * ╚══╩═══════╩═══════╝ * *\n"); printf(" * * * *\n"); printf(" * ****************************************************** *\n"); printf(" * * *请 按 回 车 返 回* * *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" "); fclose(fp); /*关闭文件*/ while (ch = getch(), ch != '\r'); /*回车返回*/}void rank(char user, char r_w) /*排行榜*/{ char ch; FILE *fp1, *fp2; int t, ans = 0; LinkLista p, pre, rear; if (user == 'a' && r_w == 'r') /*从文件读取信息*/ { fp1 = fopen("rank.txt", "r"); rear = heada = (LinkLista)malloc(sizeof(Node)); heada -> next = NULL; while (~fscanf(fp1, "%s%s%d%d", ran.account, ran.name, &ran.num, &ran.s_num)) { count++; p = (LinkLista)malloc(sizeof(Node)); p -> data = ran; rear -> next = p; rear = p; } rear -> next = NULL; fclose(fp1); return ; } if (user == 'r' && r_w == 'r') /*查看排行榜*/ { t = 1; system("CLS"); printf("\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" * * *排 行 榜* * *\n"); printf(" * ****************************************************** *\n"); printf(" * * * *\n"); printf(" * * ╔══╦═════╦══════════╦══╗ * *\n"); printf(" * * ║名次║ 用 户 ║ 昵 称 ║胜场║ * *\n"); p = heada -> next; while (p && t <= 10) /*输出前十玩家*/ { char name[20], account[20]; strcpy(account, p -> data.account); strcpy(name, p -> data.name); int a, b, c, d; a = (10 - strlen(account)) / 2; /*居中显示*/ b = 10 - strlen(account) - a; c = (20 - strlen(name)) / 2; d = 20 - strlen(name) - c; printf(" * * ╠══╬═════╬══════════╬══╣ * *\n"); printf(" * * ║ %02d ║", t++); while (a--) /*输出前空格*/ printf(" "); printf("%s", account); while (b--) printf(" "); printf("║"); while (c--) printf(" "); printf("%s", name); while (d--) printf(" "); printf("║ %02d ║ * *\n", p -> data.num); p = p -> next; } printf(" * * ╚══╩═════╩══════════╩══╝ * *\n"); printf(" * * * *\n"); printf(" * ****************************************************** *\n"); printf(" * * *请 按 回 车 返 回* * *\n"); printf(" * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n"); printf(" "); while (ch = getch(), ch != '\r'); /*按回车返回*/ return ; } ra.num = 0; rb.num = 0; ra.s_num = 0; rb.s_num = 0; strcpy(ra.account, log_AAccount); strcpy(rb.account, log_BAccount); p = heada -> next; while (p) { if (!strcmp(p -> data.account, ra.account)) { ra = p -> data; p -> data.s_num++; /*从排行榜读取信息*/ } if (!strcmp(p -> data.account, rb.account)) { rb = p -> data; p -> data.s_num++; } p = p -> next; } ra.s_num++; /*总场次加一*/ rb.s_num++; if (user == 'A') /*如果玩家A赢了*/ ra.num++; /*胜场加一*/ else rb.num++; char account[25], name[25]; fp1 = fopen("Account_number.txt", "r"); while (~fscanf(fp1, "%s%*s%s", account, name)) { if (!strcmp(account, ra.account)) /*从账号里读取昵称*/ strcpy(ra.name, name); if (!strcmp(account, rb.account)) strcpy(rb.name, name); } fclose(fp1); pre = heada; while (pre -> next && pre -> next -> data.num >= ra.num)/*链表的插入*/ { if (pre -> next -> data.num == ra.num && ra.num * 1.0 / ra.s_num > pre -> next -> data.num * 1.0 / pre -> next -> data.s_num) break; pre = pre -> next; } p = (LinkLista)malloc(sizeof(Node)); p -> data = ra; p -> next = pre -> next; pre -> next = p; count++; p = heada; while (p -> next) /*链表的替换*/ { if (!strcmp(p -> next -> data.account, ra.account)) ans++; if (ans == 2) { count--; break; } p = p -> next; } if (ans == 2) p -> next = p -> next -> next; ans = 0; pre = heada; while (pre -> next && pre -> next -> data.num >= rb.num)/*同上*/ { if (pre -> next -> data.num == rb.num && rb.num * 1.0 / rb.s_num > pre -> next -> data.num * 1.0 / pre -> next -> data.s_num) break; pre = pre -> next; } p = (LinkLista)malloc(sizeof(Node)); p -> data = rb; p -> next = pre -> next; pre -> next = p; count++; p = heada; while (p -> next) { if (!strcmp(p -> next -> data.account, rb.account)) ans++; if (ans == 2) { count--; break; } p = p -> next; } if (ans == 2) p -> next = p -> next -> next; fp2 = fopen("rank.txt", "w"); /*读入文件*/ p = heada -> next; while (p) { fprintf(fp2, "%s %s %d %d\n", p -> data.account, p -> data.name, p -> data.num, p -> data.s_num); p = p -> next; } fclose(fp2);}void gotoxy(int x, int y) /*将光标移动到坐标为(x,y)的地方*/{ CONSOLE_SCREEN_BUFFER_INFO csbiInfo; HANDLE hConsoleOut; hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo); csbiInfo.dwCursorPosition.X = x; csbiInfo.dwCursorPosition.Y = y; SetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition);}

下面是程序必须的代码,注意要和代码放在同一个目录下,格式有可能不对,放到文件中就行了。

Account_number.txt:(空)
rank.txt:(空)
introduce.txt:

游戏介绍  一.游戏规则  1、五子棋是两个人之间进行的竞技活动,由于对黑方白方规则不同,黑棋必须先行.  2、五子棋专用盘为15×15,五连子的方向为横,竖,斜.  3、禁手是对局中被判为负的行棋手段.白棋无禁手.  4、在棋盘上以对局双方均不可能形成五连为和棋.  5、黑方在落下关键的第五子即形成五连的同时,又形成禁手.此时因黑方已成连五,故禁手失效,黑方胜.  7、所谓黑方形成禁手,是指黑方一子落下同时形成两个或两个以上的活三,冲四及长连禁手.此时,白方应立即向黑方指出禁手,自然而胜.在本游戏中仅可选择三三禁手.  二.游戏操作  1、在本游戏中,首先进入欢迎界面,按"Enter"键可进入游戏.  2、在游戏中,可按相应的编号进入相应的界面或操作,(此界面按回车返回).  3、游戏还设定了账号注册、登录、注销、修改密码等操作,账号长度最多10位,密码长度不少于6位,不多于10位.  4、在本游戏中还设定了排行榜,在游戏中最多列出了前十名的玩家信息.并且只有当黑白玩家都登录账号方可记录玩家此次游戏信息,否则将不记录玩家本次游戏的任何信息.  5、此游戏可设置游戏的背景颜色和字体颜色,默认黄背景,黑字体,玩家可在游戏设置中设置颜色.  6、此游戏设置的有禁手规则,默认的为无禁手,玩家可在游戏设置中开启.  7、黑棋玩家可通过按"w,s,a,d"键进行上下左右操作,按空格键进行下棋.白棋玩家可通过方向键进行操作,按"End"键进行下棋.在这里,实心代表黑棋,圆圈代表白棋.  8、在下棋中,玩家可按"-"进行悔棋,按"+"进行复棋.按"*"键进入菜单.  9、在本游戏中,玩家可通过"*"进行某些界面的返回操作.  10、在游戏中当出现某些提示的时候,可按"Enter"键进行下步操作.  温馨提示:      1.窗口设置:窗口大小:宽:62 高:41  缓冲区:宽:62 高:55.      2.输入昵称最好用电脑自带输入法.

member.txt:

xxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx xxxxxx

转载地址:https://lzyws739307453.blog.csdn.net/article/details/86106460 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:POJ - Knight Moves(BFS)
下一篇:校园导游系统(课程设计)

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年05月01日 15时54分05秒