#define ROUND(x,y) (((x)+(y-1))&~(y-1))申请内存空间时,为了减少内存碎片

本文解析了VC6.0中STRCORE.CPP文件内的ROUND宏,详细阐述了该宏如何实现数据对齐,尤其是在内存分配时的应用。通过具体示例说明了不同数据类型对齐方式的影响。
  

我在vc6.0的STRCORE.CPP中发现了这个宏,经过查资料,找到了它的作用。

这个宏是用来进行数据对齐的,在可变参数里面用得比较多,例如:

ROUND(sizeof(char),   sizeof(int));

展开就是(sizeof(char)+sizeof(int)-1)&~(sizeof(int)-1)

这个宏是以int的长度进行对齐。~(sizeof(int)-1)的作用是根据int的对齐系数来产生末尾0的个数,例如:

sizeof(int)=2   -->   ~(sizeof(int)-1)=0xfffe   由它跟前面表达式相与的结果总是2的倍数
sizeof(int)=4   -->   ~(sizeof(int)-1)=0xfffffffc   由它跟前面表达式相与的结果总是4的倍数
sizeof(int)=8   -->   ~(sizeof(int)-1)=0xfffffffffffffff8   由它跟前面表达式相与的结果总是8的倍数

这样一来,上述宏产生的结果总是按int的长度来对齐。例如,char为1字节,int为4字节时,结果为4。

当申请内存空间时,为了减少内存碎片,常常申请2的n次幂大小的空间,就可以用这种方式来对齐。

当然 ,一般好一点儿的操作系统,都在系统内做了相关处理,没有必要这样做。但做底层代码的话,还是很有用的。

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "game.h" #include "Win_Scores.h" //$*****$ 初始棋盘参数大小 #define INIT_SIZE 8 //$*****$ 初始化棋盘 //$*****$ 结构体指针 //$*****$ 无 void Init_board(struct Game_Date* ps) { int i = 0, j = 0; //提前检测棋盘内存,为后续动态内存申请准备 if (ps->board != NULL) { for (i = 0;i < ps->row;i++) { free(ps->board[i]);//释放一级指针内存 } free(ps->board);//释放二级指针内存(框架) ps->board = NULL;//初始化空 } ps->row = INIT_SIZE + ps->AddBlock;//动态行 ps->col = INIT_SIZE + ps->AddBlock;//动态列 //申请二级指针内存,分配给一级指针 ps->board = (char**)malloc(ps->row * sizeof(char*)); if (ps->board == NULL) { printf("内存分配失败(二级指针)\n"); return; } for (i = 0;i < ps->row;i++) { //申请一级指针内存储存数据 ps->board[i] = (char*)malloc(ps->col * sizeof(char)); if (ps->board[i] == NULL) { // 若某行分配失败,需释放已分配的内存 for (int k = 0; k < i; k++) { free(ps->board[k]); } free(ps->board); ps->board = NULL; printf("内存分配失败(第%d行一级指针)\n", i); return; } } //填充棋盘为空格,初始化 for (i = 0;i < ps->row;i++) { for (j = 0;j < ps->col;j++) { ps->board[i][j] = ' '; } } } //$*****$ 打印棋盘 //$*****$ 结构体指针 //$*****$ 无 void Game_broad(struct Game_Date* ps) { //提示未进行初始化棋盘或结构体变量 if (ps == NULL || ps->board == NULL) { printf("Random_Block: ps or ps->board is NULL\n"); return;//结束不进行下面操作 } int i = 0, j = 0; //有方块的那一行 for (i = 0;i < ps->row;i++){ //打印棋盘有棋子的那一行 int j = 0; for (j = 0;j < ps->col;j++)//确定规格 { printf(" %c ", ps->board[i][j]);//打印方块 if (j < ps->col - 1)//最后一列不要打印 printf("|");//打印竖线 } printf("\n"); //没有方块的那一行,边界打印 if (i < ps->row - 1){ //打印棋盘没有方块的那一行 for (j = 0;j < ps->col;j++)//确定规格 { printf("---");//横边界打印 if (j < ps->col - 1)//最后一列不要打印 printf("|");//竖边界打印 } printf("\n"); } } /*if (ps->WinCount > ps->AddBlock) { ps->AddBlock++; }*/ } //$*****$ 填充并随机化棋盘 //$*****$ 结构体指针 //$*****$ 无 void Random_Block(struct Game_Date* ps) { //提示未进行初始化棋盘或结构体变量 if (ps == NULL || ps->board == NULL) { printf("Random_Block: ps or ps->board is NULL\n"); return;//结束不进行下面操作 } int i = 0, j = 0; char BL[4] = {'#','$','%','*'};//确定方块种类 memcpy(ps->Block, BL, 4);//填充方块数组 for (i = 0;i < ps->row;i++) { for (j = 0;j < ps->col;j++) { //随机方块填充棋盘 ps->board[i][j] = ps->Block[rand() % 4]; } } //检查部分 int maxCheckRound = 9;//3的平方,检查最大次数 int round;//检查次数 //多次循环检查,以防有初始化可消除 for(round = 0;round < maxCheckRound;round++){ int hasDuplicate = 0;//威胁置0 for (i = 0;i < ps->row;i++){ for (j = 0;j < ps->col;j++){ //列威胁检查并限制,以防数组越界 if (j + 1 < ps->col && j + 2 < ps->col){ //列威胁检查三子相连情况 if (ps->board[i][j] == ps->board[i][j + 1] && ps->board[i][j + 1] == ps->board[i][j + 2]){ Check_Block(ps, i, j);//替换方块 hasDuplicate = 1;//有威胁 } } //行威胁检查并限制,以防数组越界 if( i + 1 < ps->row && i + 2 < ps->row){ //行威胁检查三子相连情况 if (ps->board[i][j] == ps->board[i + 1][j] && ps->board[i + 1][j] == ps->board[i + 2][j]){ Check_Block(ps, i, j); hasDuplicate = 1; } } //四子相聚威胁检查并限制,以防数组越界(形成正方形) if (i + 1 < ps->row && j + 1 < ps->col) { ////四子相聚威胁检查 if (ps->board[i][j] == ps->board[i][j + 1] && ps->board[i][j + 1] == ps->board[i + 1][j] && ps->board[i + 1][j] == ps->board[i + 1][j + 1]){ Check_Block(ps, i, j); hasDuplicate = 1; } } } } //如果没有威胁,退出循环 if (!hasDuplicate) break; } } //$*****$ 随机替换可消除方块 //$*****$ 结构体指针,变量行,列 //$*****$ 无 void Check_Block(struct Game_Date* ps,int i,int j) { char newChar; //随机化方块,如果方块不等于原来方块,退出循环 do { newChar = ps->Block[rand() % 4]; } while (newChar == ps->board[i][j]); ps->board[i][j] = newChar;//替换原来方块 } //$*****$ 交换方块 //$*****$ 两个坐标的方块 //$*****$ 无 void Swap_Char(char* a,char* b) { char temp = *a; *a = *b; *b = temp;//指针交换数据,传回原函数 } //$*****$ 玩家操作方块移动 //$*****$ 结构体指针,变量行,列,方向 //$*****$ 无 void Play_Block(struct Game_Date* ps,int x,int y,char Direction) { //预防指针未赋值进行 if (ps == NULL){ printf("游戏数据无效(Invalid game date)\n"); return;//退出函数 } //防止越界 if ((Direction == 'D' && x == ps->row) || (Direction == 'R' && y == ps->col)) { printf("该方向无法移动(超出棋盘)\n"); return; } //U代表上,up,方块向上移动 if (Direction == 'U' && x - 1 > 0){//交换方块 Swap_Char(&ps->board[x - 1][y - 1], &ps->board[x - 2][y - 1]); Check_Break(x - 2, y - 1, ps);//检查是否有能消除方块 Check_Break(x - 1, y - 1, ps);//两个相关的都检查 } //D代表下,down,方块向下移动 else if (Direction == 'D' && x - 1 < ps->row - 1){//交换方块 Swap_Char(&ps->board[x - 1][y - 1], &ps->board[x][y - 1]); Check_Break(x, y - 1, ps);//检查是否有能消除方块 Check_Break(x - 1, y - 1, ps);//两个相关的都检查 } //R代表下,right,方块向右移动 else if (Direction == 'R' && y - 1 < ps->col - 1){ Swap_Char(&ps->board[x - 1][y - 1], &ps->board[x - 1][y]); Check_Break(x - 1, y, ps);//检查是否有能消除方块 Check_Break(x - 1, y - 1, ps);//两个相关的都检查 } //L代表下,left,方块向左移动 else if (Direction == 'L' && y - 1> 0){ Swap_Char(&ps->board[x - 1][y - 1], &ps->board[x - 1][y - 2]); Check_Break(x - 1, y - 2, ps);//检查是否有能消除方块 Check_Break(x - 1, y - 1, ps);//两个相关的都检查 } else{//输入其他字母报错 printf("输入错误(The system prompts an input error)\n"); }//****这边后面可能添加交换未消除恢复逻辑****// } //$*****$ 检查能消除的方块 //$*****$ 结构体指针,变量行,列,方向 //$*****$ 无 void Check_Break(int x,int y, struct Game_Date* ps) { //提示未进行初始化棋盘或结构体变量 if (ps == NULL || ps->board == NULL) { printf("Random_Block: ps or ps->board is NULL\n"); return;//结束不进行下面操作 } int i = 0, j = 0; char** line = NULL;//准备申请动态内存 line = (char**)malloc(2 * sizeof(char*));//申请框架内存 if (line == NULL) { printf("line 二级指针内存分配失败!\n"); return; } for (i = 0;i < 2;i++){//申请内部储存的数组内存 line[i] = (char*)malloc(ps->col * sizeof(char)); if (line[i] == NULL) { for (int k = 0; k < i; k++) free(line[k]); free(line); line = NULL; printf("line 第%d行一级指针内存分配失败!\n", i); return; } } for (i = 0;i < ps->row;i++){//储存行,后面进行判断 if (ps->board[i] == NULL) { printf("棋盘第%d行内存未初始化!\n", i); for (int k = 0; k < 2; k++) free(line[k]); free(line); line = NULL; return; } if (ps->board[i][y] == ps->board[x][y]) line[0][i] = ps->board[x][y];//如果是相同字母,不变 else line[0][i] = '0';//如果不是,存字母0 } if (ps->board[x] == NULL) { printf("棋盘第%d行内存未初始化!\n", x); for (int k = 0; k < 2; k++) free(line[k]); free(line); line = NULL; return; } for (j = 0;j < ps->col;j++) {//储存列,后面进行判断 if (ps->board[x][j] == ps->board[x][y]) line[1][j] = ps->board[x][y];//如果是相同字母,不变 else line[1][j] = '0';//如果不是,存字母0 } for (j = 0;j < ps->col;j++) { //列判断进行 if (j + 4 < ps->col && line[0][j] != '0') {//五连判断且不能是字母0 if (line[0][j] == line[0][j + 1] && line[0][j + 1] == line[0][j + 2] && line[0][j + 2] == line[0][j + 3] && line[0][j + 3] == line[0][j + 4]) { ps->board[j][y] = ps->board[j + 1][y] = ps->board[j + 2][y] = ps->board[j + 3][y] = ps->board[j + 4][y] = -1;//如果五连,五连的方块置-1 Break_Block(j, y, 1, ps);//消除判断进行 Grade(3, ps); } } //列判断进行 if (j + 3 < ps->col && line[0][j] != '0') {//四连判断且不能是字母0 if (line[0][j] == line[0][j + 1] && line[0][j + 1] == line[0][j + 2] && line[0][j + 2] == line[0][j + 3]) { ps->board[j][y] = ps->board[j + 1][y] = ps->board[j + 2][y] = ps->board[j + 3][y] = -1;//如果四连,四连的方块置-1 Break_Block(j, y, 1, ps);//消除判断进行 Grade(2, ps); } } //列判断进行 if (j + 1 < ps->col && line[0][j] != '0') {//正方形判断且不能是字母0 if (line[0][j] == line[0][j + 1] && line[0][j + 1] == ps->board[j][y + 1] && ps->board[j][y + 1] == ps->board[j + 1][y + 1] && y + 1 < ps->col) { ps->board[j][y] = ps->board[j + 1][y] = ps->board[j][y + 1] = ps->board[j + 1][y + 1] = -1;//如果正方形,正方形的方块置-1 Break_Block(j, y, 1, ps);//消除判断进行 Grade(2, ps); } //列判断进行 if (line[0][j] == line[0][j + 1] && line[0][j + 1] == ps->board[j][y - 1] && ps->board[j][y - 1] == ps->board[j + 1][y - 1] && y - 1 >= 0) { ps->board[j][y] = ps->board[j + 1][y] = ps->board[j][y - 1] = ps->board[j + 1][y - 1] = -1;//如果正方形,正方形的方块置-1 Break_Block(j, y, 1, ps);//消除判断进行 Grade(2, ps); } } //列判断进行 if (j + 2 < ps->col && line[0][j] != '0') {//三连判断且不能是字母0 if (line[0][j] == line[0][j + 1] && line[0][j + 1] == line[0][j + 2]) { ps->board[j][y] = ps->board[j + 1][y] = ps->board[j + 2][y] = -1;//如果三连,三连的方块置-1 Break_Block(j, y, 1, ps);//消除判断进行 Grade(1, ps); } } //行判断进行 if (j + 4 < ps->col && line[1][j] != '0') {//五连判断且不能是字母0 if (line[1][j] == line[1][j + 1] && line[1][j + 1] == line[1][j + 2] && line[1][j + 2] == line[1][j + 3] && line[1][j + 3] == line[1][j + 4]) { ps->board[x][j] = ps->board[x][j + 1] = ps->board[x][j + 2] = ps->board[x][j + 3] = ps->board[x][j + 4] = -1;//如果五连,五连的方块置-1 Break_Block(x, j, 2, ps);//消除判断进行 Grade(3, ps); } } //行判断进行 if (j + 3 < ps->col && line[1][j] != '0') {//四连判断且不能是字母0 if (line[1][j] == line[1][j + 1] && line[1][j + 1] == line[1][j + 2] && line[1][j + 2] == line[1][j + 3]) { ps->board[x][j] = ps->board[x][j + 1] = ps->board[x][j + 2] = ps->board[x][j + 3] = -1;//如果四连,四连的方块置-1 Break_Block(x, j, 2, ps);//消除判断进行 Grade(2, ps); } } //行判断进行 if (j + 1 < ps->col && line[1][j] != '0') {//正方形判断且不能是字母0 if (line[1][j] == line[1][j + 1] && line[1][j + 1] == ps->board[x + 1][j] && ps->board[x + 1][j] == ps->board[x + 1][j + 1] && x + 1 < ps->row) { ps->board[x][j] = ps->board[x][j + 1] = ps->board[x + 1][j] = ps->board[x + 1][j + 1] = -1;//如果正方形,正方形的方块置-1 Break_Block(x, j, 2, ps);//消除判断进行 Grade(2, ps); } //行判断进行 if (line[1][j] == line[1][j + 1] && line[1][j + 1] == ps->board[x - 1][j] && ps->board[x - 1][j] == ps->board[x - 1][j + 1] && x - 1 >= 0) { ps->board[x][j] = ps->board[x][j + 1] = ps->board[x - 1][j] = ps->board[x - 1][j + 1] = -1;//如果正方形,正方形的方块置-1 Break_Block(x, j, 2, ps);//消除判断进行 Grade(2, ps); } } //行判断进行 if (j + 2 < ps->col && line[1][j] != '0') {//三连判断且不能是字母0 if (line[1][j] == line[1][j + 1] && line[1][j + 1] == line[1][j + 2]) { ps->board[x][j] = ps->board[x][j + 1] = ps->board[x][j + 2] = -1;//如果三连,三连的方块置-1 Break_Block(x, j, 2, ps);//消除判断进行 Grade(1, ps); } } } if (line != NULL) {//如果指针内存有使用 for (i = 0;i < 2;i++){ free(line[i]);//释放指针内部内存 } free(line);//释放指针内存(框架) line = NULL;//初始化空 } } //$*****$ 将能消除的方块置空 //$*****$ 结构体指针,变量行,列,种类 //$*****$ 无 void Break_Block(int x,int y,int kind ,struct Game_Date* ps) { //提示未进行初始化棋盘或结构体变量 if (ps == NULL || ps->board == NULL) { printf("Random_Block: ps or ps->board is NULL\n"); return;//结束不进行下面操作 } int i = 0, j = 0;//普通模式kind = 0,x, y无用,用row/col填充 //开始循环检查 for (i = 0;i < ps->row;i++){ if (kind == 1){//直接利用原函数循环进行 if (ps->board[i][y] == -1)//kind不为0,用x/y缩小检查范围 ps->board[i][y] = ' ';//置空 } if (kind == 0){//普通模式 for (j = 0;j < ps->col;j++){//接着上一个循环放循环,每一个精准检查 if (ps->board[i][j] == -1)//普通一个一个检查 ps->board[i][j] = ' ';//置空 } } if (kind == 2){//模式2 for (j = 0;j < ps->col;j++) {//行判断 if (ps->board[x][j] == -1)//kind不为0,用x/y缩小检查范围 ps->board[x][j] = ' ';//置空 } break;//提前退出,加快运行 } } } //$*****$ 检查空格,并进行下移 //$*****$ 结构体指针 //$*****$ 无 void Down_Check(struct Game_Date* ps) { //预防指针未赋值进行 if (ps == NULL) { printf("游戏数据无效(Invalid game date)\n"); return;//退出函数 } //行循环检查 for (int j = 0;j < ps->col;j++) {//列循环检查 for (int i = ps->row - 2;i >= 0;i--) { //检查如果是空格,进行交换 if (ps->board[i + 1][j] == ' ') Down_Block(i, j, ps); } } } //$*****$ 列方块交换下移 //$*****$ 结构体指针,变量行,列 //$*****$ 无 void Down_Block(int x, int y, struct Game_Date* ps) { //通过输入的坐标进行某一列的交换 for (int i = x;i >= 1;i--) { //从检测到的空格开始 char pictur = ps->board[i][y]; ps->board[i][y] = ps->board[i - 1][y]; ps->board[i - 1][y] = pictur; } } //$*****$ 全棋盘检查并置-1 //$*****$ 结构体指针 //$*****$ 无 void Check_Board(struct Game_Date* ps) { //预防指针未赋值进行 if (ps == NULL) { printf("游戏数据无效(Invalid game date)\n"); return;//退出函数 } for (int i = 0;i < ps->row;i++) { for (int j = 0;j < ps->col;j++) { //列判断进行 if (i + 4 < ps->row && ps->board[i][j] != ' ') {//五连判断且不能是字母' ' if (ps->board[i][j] == ps->board[i + 1][j] && ps->board[i + 1][j] == ps->board[i + 2][j] && ps->board[i + 2][j] == ps->board[i + 3][j] && ps->board[i + 3][j] == ps->board[i + 4][j]) { ps->board[i][j] = ps->board[i + 1][j] = ps->board[i + 2][j] = ps->board[i + 3][j] = ps->board[i + 4][j] = -1;//如果五连,五连的方块置-1 Grade(3, ps); } } //行判断进行 if (j + 4 < ps->col && ps->board[i][j] != ' ') {//五连判断且不能是字母' ' if (ps->board[i][j] == ps->board[i][j + 1] && ps->board[i][j + 1] == ps->board[i][j + 2] && ps->board[i][j + 2] == ps->board[i][j + 3] && ps->board[i][j + 3] == ps->board[i][j + 4]) { ps->board[i][j] = ps->board[i][j + 1] = ps->board[i][j + 2] = ps->board[i][j + 3] = ps->board[i][j + 4] = -1;//如果五连,五连的方块置-1 Grade(3, ps); } } //列判断进行 if (i + 3 < ps->row && ps->board[i][j] != ' ') {//四连判断且不能是字母' ' if (ps->board[i][j] == ps->board[i + 1][j] && ps->board[i + 1][j] == ps->board[i + 2][j] && ps->board[i + 2][j] == ps->board[i + 3][j]) { ps->board[i][j] = ps->board[i + 1][j] = ps->board[i + 2][j] = ps->board[i + 3][j] = -1;//如果四连,四连的方块置-1 Grade(2, ps); } } //行判断进行 if (j + 3 < ps->col && ps->board[i][j] != ' ') {//四连判断且不能是字母' ' if (ps->board[i][j] == ps->board[i][j + 1] && ps->board[i][j + 1] == ps->board[i][j + 2] && ps->board[i][j + 2] == ps->board[i][j + 3]) { ps->board[i][j] = ps->board[i][j + 1] = ps->board[i][j + 2] = ps->board[i][j + 3] = -1;//如果四连,四连的方块置-1 Grade(2, ps); } } //列判断进行 if (i + 1 < ps->row && j + 1 < ps->col && j - 1 >= 0 && ps->board[i][j] != ' ') {//正方形判断且不能是字母' ' if (ps->board[i][j] == ps->board[i + 1][j] && ps->board[i + 1][j] == ps->board[i][j + 1] && ps->board[i][j + 1] == ps->board[i + 1][j + 1]) { ps->board[i][j] = ps->board[i + 1][j] = ps->board[i][j + 1] = ps->board[i + 1][j + 1] = -1;//如果正方形,正方形的方块置-1 Grade(2, ps); } //列判断进行 if (ps->board[i][j] == ps->board[i + 1][j] && ps->board[i + 1][j] == ps->board[i][j - 1] && ps->board[i][j - 1] == ps->board[i + 1][j - 1]) { ps->board[i][j] = ps->board[i + 1][j] = ps->board[i][j - 1] = ps->board[i + 1][j - 1] = -1;//如果正方形,正方形的方块置-1 Grade(2, ps); } } //行判断进行 if (j + 1 < ps->col && i + 1 < ps->row && i - 1 >= 0 && ps->board[i][j] != ' ') {//正方形判断且不能是字母' ' if (ps->board[i][j] == ps->board[i][j + 1] && ps->board[i][j + 1] == ps->board[i + 1][j] && ps->board[i + 1][j] == ps->board[i + 1][j + 1]) { ps->board[i][j] = ps->board[i][j + 1] = ps->board[i + 1][j] = ps->board[i + 1][j + 1] = -1;//如果正方形,正方形的方块置-1 Grade(2, ps); } //行判断进行 if (ps->board[i][j] == ps->board[i][j + 1] && ps->board[i][j + 1] == ps->board[i - 1][j] && ps->board[i - 1][j] == ps->board[i - 1][j + 1]) { ps->board[i][j] = ps->board[i][j + 1] = ps->board[i - 1][j] = ps->board[i - 1][j + 1] = -1;//如果正方形,正方形的方块置-1 Grade(2, ps); } } //列判断进行 if (i + 2 < ps->row && ps->board[i][j] != ' ') {//三连判断且不能是字母' ' if (ps->board[i][j] == ps->board[i + 1][j] && ps->board[i + 1][j] == ps->board[i + 2][j]) { ps->board[i][j] = ps->board[i + 1][j] = ps->board[i + 2][j] = -1;//如果三连,三连的方块置-1 Grade(1, ps); } } //行判断进行 if (j + 2 < ps->col && ps->board[i][j] != ' ') {//三连判断且不能是字母' ' if (ps->board[i][j] == ps->board[i][j + 1] && ps->board[i][j + 1] == ps->board[i][j + 2]) { ps->board[i][j] = ps->board[i][j + 1] = ps->board[i][j + 2] = -1;//如果三连,三连的方块置-1 Grade(1, ps); } } } } Break_Block(ps->row, ps->col, 0, ps);//方块置空 } //$*****$ 填充空棋盘 //$*****$ 结构体指针 //$*****$ 无 void Full_Block(struct Game_Date* ps) { //提示未进行初始化棋盘或结构体变量 if (ps == NULL || ps->board == NULL) { printf("Random_Block: ps or ps->board is NULL\n"); return;//结束不进行下面操作 } int i = 0, j = 0; //循环检查空格,填充新方块 for (i = 0;i < ps->row;i++) { for (j = 0;j < ps->col;j++) { if(ps->board[i][j] == ' ')//随机填充 ps->board[i][j] = ps->Block[rand() % 4]; } } int num = rand(); int winnum = 0; if (ps->WinCount > 6)//大于第六局,概率减10 winnum = 10; if (ps->WinCount > 9)//大于第九局,概率减25 winnum = 25; if (ps->WinCount > 12)//大于第十二局,概率减40 winnum = 40; if (ps->WinCount == 15)//第十五局,概率减55 winnum = 55; for (i = 0;i < ps->row;i++) { for (j = 0;j < ps->col;j++) { char imange = ps->board[i][j]; //列判断进行 if (i + 4 < ps->row) {//五连判断 if (ps->board[i][j] == ps->board[i + 1][j] && ps->board[i + 1][j] == ps->board[i + 2][j] && ps->board[i + 2][j] == ps->board[i + 3][j] && ps->board[i + 3][j] == ps->board[i + 4][j]) { if (num % 100 < 60 - winnum)//五连概率最大60%,最低5% ps->board[i][j] = imange; else{ if(ps->board[i][j] == imange)//如果不是新方块继续循环 ps->board[i][j] = ps->Block[rand() % 4]; } continue;//跳出本次循环 } } //行判断进行 if (j + 4 < ps->col) {//五连判断 if (ps->board[i][j] == ps->board[i][j + 1] && ps->board[i][j + 1] == ps->board[i][j + 2] && ps->board[i][j + 2] == ps->board[i][j + 3] && ps->board[i][j + 3] == ps->board[i][j + 4]) { if (num % 100 < 60 - winnum)//五连概率最大60%,最低5% ps->board[i][j] = imange; else { if (ps->board[i][j] == imange)//如果不是新方块继续循环 ps->board[i][j] = ps->Block[rand() % 4]; } continue;//跳出本次循环 } } //列判断进行 if (i + 3 < ps->row) {//四连判断 if (ps->board[i][j] == ps->board[i + 1][j] && ps->board[i + 1][j] == ps->board[i + 2][j] && ps->board[i + 2][j] == ps->board[i + 3][j]) { if (num % 100 < 65 - winnum)//四连概率最大65%,最低10% ps->board[i][j] = imange; else { if (ps->board[i][j] == imange)//如果不是新方块继续循环 ps->board[i][j] = ps->Block[rand() % 4]; } continue;//跳出本次循环 } } //行判断进行 if (j + 3 < ps->col) {//四连判断 if (ps->board[i][j] == ps->board[i][j + 1] && ps->board[i][j + 1] == ps->board[i][j + 2] && ps->board[i][j + 2] == ps->board[i][j + 3]) { if (num % 100 < 65 - winnum)//四连概率最大65%,最低10% ps->board[i][j] = imange; else { if (ps->board[i][j] == imange)//如果不是新方块继续循环 ps->board[i][j] = ps->Block[rand() % 4]; } continue;//跳出本次循环 } } //列判断进行 if (i + 1 < ps->row && j + 1 < ps->col && j - 1 >= 0) {//正方形判断 if (ps->board[i][j] == ps->board[i + 1][j] && ps->board[i + 1][j] == ps->board[i][j + 1] && ps->board[i][j + 1] == ps->board[i + 1][j + 1]) { if (num % 100 < 65 - winnum)//正方形概率最大65%,最低10% ps->board[i][j] = imange; else { if (ps->board[i][j] == imange)//如果不是新方块继续循环 ps->board[i][j] = ps->Block[rand() % 4]; } continue;//跳出本次循环 } //列判断进行 if (ps->board[i][j] == ps->board[i + 1][j] && ps->board[i + 1][j] == ps->board[i][j - 1] && ps->board[i][j - 1] == ps->board[i + 1][j - 1]) { if (num % 100 < 65 - winnum)//正方形概率最大65%,最低10% ps->board[i][j] = imange; else { if (ps->board[i][j] == imange)//如果不是新方块继续循环 ps->board[i][j] = ps->Block[rand() % 4]; } continue;//跳出本次循环 } } //行判断进行 if (j + 1 < ps->col && i + 1 < ps->row && i - 1 >= 0) {//正方形判断 if (ps->board[i][j] == ps->board[i][j + 1] && ps->board[i][j + 1] == ps->board[i + 1][j] && ps->board[i + 1][j] == ps->board[i + 1][j + 1]) { if (num % 100 < 65 - winnum)//正方形概率最大65%,最低10% ps->board[i][j] = imange; else { if (ps->board[i][j] == imange)//如果不是新方块继续循环 ps->board[i][j] = ps->Block[rand() % 4]; } continue;//跳出本次循环 } //行判断进行 if (ps->board[i][j] == ps->board[i][j + 1] && ps->board[i][j + 1] == ps->board[i - 1][j] && ps->board[i - 1][j] == ps->board[i - 1][j + 1]) { if (num % 100 < 65 - winnum)//正方形概率最大65%,最低10% ps->board[i][j] = imange; else { if (ps->board[i][j] == imange)//如果不是新方块继续循环 ps->board[i][j] = ps->Block[rand() % 4]; } continue;//跳出本次循环 } } //列判断进行 if (i + 2 < ps->row) {//三连判断 if (ps->board[i][j] == ps->board[i + 1][j] && ps->board[i + 1][j] == ps->board[i + 2][j]) { if (num % 100 < 70 - winnum)//三连概率最大70%,最低15% ps->board[i][j] = imange; else { if (ps->board[i][j] == imange)//如果不是新方块继续循环 ps->board[i][j] = ps->Block[rand() % 4]; } continue;//跳出本次循环 } } //行判断进行 if (j + 2 < ps->col) {//三连判断 if (ps->board[i][j] == ps->board[i][j + 1] && ps->board[i][j + 1] == ps->board[i][j + 2]) { if (num % 100 < 70 - winnum)//三连概率最大70%,最低15% ps->board[i][j] = imange; else { if (ps->board[i][j] == imange)//如果不是新方块继续循环 ps->board[i][j] = ps->Block[rand() % 4]; } } } } } } #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> #include "game.h" #include "Win_Scores.h" int main() { struct Game_Date game; game.board = NULL; game.AddBlock = 0; game.WinCount = 1; game.grade = 0; Scores(&game); srand((unsigned int)time(NULL)); Init_board(&game); Random_Block(&game); printf("目标分数:%d\n", game.score); printf("当前分数:%d\n", game.grade); Game_broad(&game); int x = 0, y = 0; char Direction = NULL; int step = 0; for (step = 1;step <= STEP;step++) { printf("请输入方块坐标和其移动方向:\n"); (void)scanf("%d,%d,%c", &x, &y, &Direction); Play_Block(&game, x, y, Direction); printf("目标分数:%d\n", game.score); printf("当前分数:%d\n", game.grade); printf("当前步数:%d\n", step); Game_broad(&game); printf(" \n"); Down_Check(&game); printf("目标分数:%d\n", game.score); printf("当前分数:%d\n", game.grade); printf("当前步数:%d\n", step); Game_broad(&game); printf(" \n"); int cck = 1; while (cck) { printf(" \n"); Check_Board(&game); printf("目标分数:%d\n", game.score); printf("当前分数:%d\n", game.grade); printf("当前步数:%d\n", step); Game_broad(&game); printf(" \n"); Down_Check(&game); printf("目标分数:%d\n", game.score); printf("当前分数:%d\n", game.grade); printf("当前步数:%d\n", step); Game_broad(&game); printf(" \n"); cck = Continuous(&game); Full_Block(&game); printf("目标分数:%d\n", game.score); printf("当前分数:%d\n", game.grade); printf("当前步数:%d\n", step); Game_broad(&game); //WinScore(step,&game); } } return 0; } #pragma once #ifndef GAME_H #define GAME_H //$*****$ 常用的变量 struct Game_Date { int row;//变量行 int col;//变量列 char** board;//动态棋盘 char Block[4];//随机方块 int WinCount;//赢的盘数 int AddBlock;//棋盘增加量 int score; int grade; char CheckBoard; }; //$*****$ 初始化棋盘 //$*****$ 结构体指针 //$*****$ 无 void Init_board(struct Game_Date* ps); //$*****$ 打印棋盘 //$*****$ 结构体指针 //$*****$ 无 void Game_broad(struct Game_Date* ps); //$*****$ 填充并随机化棋盘 //$*****$ 结构体指针 //$*****$ 无 void Random_Block(struct Game_Date* ps); //$*****$ 随机替换可消除方块 //$*****$ 结构体指针,变量行,列 //$*****$ 无 void Check_Block(struct Game_Date* ps, int i, int j); //$*****$ 交换方块 //$*****$ 两个坐标的方块 //$*****$ 无 void Swap_Char(char* a, char* b); //$*****$ 玩家操作方块移动 //$*****$ 结构体指针,变量行,列,方向 //$*****$ 无 void Play_Block(struct Game_Date* ps, int x, int y, char Direction); //$*****$ 检查能消除的方块 //$*****$ 结构体指针,变量行,列,方向 //$*****$ 无 void Check_Break(int x, int y, struct Game_Date* ps); //$*****$ 将能消除的方块置空 //$*****$ 结构体指针,变量行,列,种类 //$*****$ 无 void Break_Block(int x, int y, int kind, struct Game_Date* ps); //$*****$ 检查空格,并进行下移 //$*****$ 结构体指针 //$*****$ 无 void Down_Check(struct Game_Date* ps); //$*****$ 列方块交换下移 //$*****$ 结构体指针,变量行,列 //$*****$ 无 void Down_Block(int x, int y, struct Game_Date* ps); //$*****$ 全棋盘检查并置-1 //$*****$ 结构体指针 //$*****$ 无 void Check_Board(struct Game_Date* ps); //$*****$ 填充空棋盘 //$*****$ 结构体指针 //$*****$ 无 void Full_Block(struct Game_Date* ps); #endif // !GAME_H #pragma once #ifndef WIN_SCORES_H #define WIN_SCORES_H #define STEP 30 //$*****$ 检查是否还有空格 //$*****$ 结构体指针,判断变量 //$*****$ 判断变量 int Continuous(struct Game_Date* ps); //$*****$ 每一局的分数 //$*****$ 结构体指针 //$*****$ 无 void Scores(struct Game_Date* ps); //$*****$ 检查积累的分数 //$*****$ 结构体指针,判断变量 //$*****$ 无 void Grade(int line, struct Game_Date* ps); //$*****$ 判断挑战成功 //$*****$ 结构体指针 //$*****$ 无 void WinScore(int step, struct Game_Date* ps); #endif // !WIN_SCORES_H #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include "game.h" #include "Win_Scores.h" //$*****$ 检查是否还有空格 //$*****$ 结构体指针,判断变量 //$*****$ 判断变量 int Continuous(struct Game_Date* ps) { int i, j; for (i = 0;i < ps->row;i++){ for (j = 0;j < ps->col;j++){ if (ps->board[i][j] == ' ') { return 1; } } } return 0; } //$*****$ 每一局的分数 //$*****$ 结构体指针 //$*****$ 无 void Scores(struct Game_Date* ps) { if (ps->WinCount <= 6) ps->score = 800 + (120 * (ps->WinCount - 1)); if (ps->WinCount <= 12 && ps->WinCount > 6) ps->score = 1600 + (200 * (ps->WinCount - 7)); if (ps->WinCount <= 15 && ps->WinCount > 12) ps->score = 3200 + (600 * (ps->WinCount - 13)); } //$*****$ 检查积累的分数 //$*****$ 结构体指针,判断变量 //$*****$ 无 void Grade(int line, struct Game_Date* ps) { switch(line) { case 1: ps->grade += 10; break; case 2: ps->grade += 20; break; case 3: ps->grade += 50; } } //$*****$ 判断挑战成功 //$*****$ 结构体指针 //$*****$ 无 void WinScore(int step,struct Game_Date* ps) { if (step == 30 && ps->grade < ps->score) { printf("挑战失败。"); ps->CheckBoard = 1; } if (step <= 30 && ps->grade > ps->score) { printf("挑战成功。"); ps->CheckBoard = 2; } } 帮我看看,它这个代码第一行出问题了
09-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值