#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;
}
}
帮我看看,它这个代码第一行出问题了