C语言消消乐游戏代码

C和C++游戏趣味编程》一书各个章节的案例代码,每章案例逐步利用学到的语法知识。本章我们将编写十字消除游戏,用户点击空白方块,沿其上下左右方向寻找第一个彩色方块,如果有两个或两个以上颜色一致,就将其消除。在进度条时间结束前消除足够的方块,可以进入下一关,效果如图所示。首先实现随机颜色方块的表示与绘制,鼠标点击与十字消除算法;然后绘制了提示框,绘制倒计时进度条;接着进行了得分计算、胜负判断、多关卡功能的开发;学习了地址与指针的概念,并利用地址传递使得程序更加模块化;
摘要由CSDN通过智能技术生成

C和C++游戏趣味编程》一书各个章节的案例代码,每章案例逐步利用学到的语法知识。

本章我们将编写十字消除游戏,用户点击空白方块,沿其上下左右方向寻找第一个彩色方块,如果有两个或两个以上颜色一致,就将其消除。在进度条时间结束前消除足够的方块,可以进入下一关,效果如图所示。

首先实现随机颜色方块的表示与绘制,鼠标点击与十字消除算法;然后绘制了提示框,绘制倒计时进度条;接着进行了得分计算、胜负判断、多关卡功能的开发;学习了地址与指针的概念,并利用地址传递使得程序更加模块化;最后学习了指针和数组的知识,应用动态数组实现了游戏尺寸的动态大小调整。

 源码:

#include <graphics.h>  
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

# define BlockSize 40 // 小方块的长宽大小
# define ColorTypeNum 9 // 除了空白方块外,其他方块的颜色的个数

struct Block // 小方块结构体
{
	int x,y; // x y坐标
	int colorId; // 对应颜色的下标
	int i,j;  // 小方块在二维数组中的i j下标
};

// 全局变量
int RowNum; // 游戏画面一共RowNum行小方块
int ColNum; // 游戏画面一共ColNum列小方块
Block **blocks = NULL; // 动态二维数组指针,存储所有方块数据
COLORREF  colors[ColorTypeNum+1]; // 颜色数组,小方块可能的几种颜色
int score; // 得分数,也就是消去的方块的个数
float maxTime; // 这一关游戏的总时长
float totalTime; // 减去扣分项后的游戏总时长
float remainTime; // 剩余时间
clock_t start, finish; // 用于计时的变量
int level = 1; // 当前关卡序号
int noZeroBlockNum; // 非空白区域的砖块的个数

void drawBlockHint(int i,int j,COLORREF color,int isfill) // 绘制出一个提示线框出来
{
	setlinecolor(color);
	setfillcolor(color);
	if (isfill==1) // 鼠标点击中的方块,画填充方块提示
		fillrectangle(blocks[i][j].x,blocks[i][j].y,blocks[i][j].x+BlockSize,blocks[i][j].y+BlockSize);
	if (isfill==0) // 上下左右四个方向找到的4个方块,画线框提示
		rectangle(blocks[i][j].x,blocks[i][j].y,blocks[i][j].x+BlockSize,blocks[i][j].y+BlockSize);
}


void writeRecordFile(int recordScore)  //保存最高分数据文件
{ 
	FILE *fp;
	fp = fopen(".\\gameRecord.dat","w");
	fprintf(fp,"%d",recordScore);
	fclose(fp);
}

int readRecordFile()  //读取最高分数据文件
{ 
	int recordScore;
	FILE *fp;
	fp = fopen(".\\gameRecord.dat","r");

	// 
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
非常感谢您的提问,以下是C语言开心消消乐代码: #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 6 #define COL 6 void init_board(int board[][COL]); void print_board(int board[][COL]); void swap(int *a, int *b); void shuffle(int board[][COL]); int eliminate(int board[][COL]); void drop(int board[][COL]); int main() { int board[ROW][COL]; int score = 0; srand((unsigned)time(NULL)); // 初始化随机数种子 init_board(board); // 初始化游戏面板 shuffle(board); // 打乱游戏面板 print_board(board); // 输出游戏面板 while (eliminate(board)) // 消除相同的方块 { score += 10; // 每消除一个方块得10分 drop(board); // 方块掉落 shuffle(board); // 打乱游戏面板 print_board(board); // 输出游戏面板 } printf("Game over! Your score is %d.\n", score); return 0; } void init_board(int board[][COL]) { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { board[i][j] = rand() % 5 + 1; // 随机生成1~5的数字 } } } void print_board(int board[][COL]) { int i, j; printf(" "); for (i = 0; i < COL; i++) { printf("%d ", i); } printf("\n"); for (i = 0; i < ROW; i++) { printf("%d ", i); for (j = 0; j < COL; j++) { printf("%d ", board[i][j]); } printf("\n"); } } void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } void shuffle(int board[][COL]) { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { int x = rand() % ROW; int y = rand() % COL; swap(&board[i][j], &board[x][y]); // 随机交换两个方块 } } } int eliminate(int board[][COL]) { int i, j; int flag = 0; // 标记是否有方块被消除 for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (board[i][j] == 0) // 如果该方块已经被消除了,跳过 { continue; } int k; int count = 1; // 计算相同数字的个数 // 横向扫描 for (k = j + 1; k < COL && board[i][k] == board[i][j]; k++) { count++; } if (count >= 3) // 如果相同数字的个数大于等于3,消除这些方块 { flag = 1; for (k = j; k < j + count; k++) { board[i][k] = 0; } } count = 1; // 纵向扫描 for (k = i + 1; k < ROW && board[k][j] == board[i][j]; k++) { count++; } if (count >= 3) // 如果相同数字的个数大于等于3,消除这些方块 { flag = 1; for (k = i; k < i + count; k++) { board[k][j] = 0; } } } } return flag; } void drop(int board[][COL]) { int i, j; for (j = 0; j < COL; j++) { int count = 0; // 计算该列需要掉落的方块个数 for (i = ROW - 1; i >= 0; i--) { if (board[i][j] == 0) // 如果该方块已经被消除了,计数器加1 { count++; } else if (count > 0) // 如果该方块没有被消除,但是上面有被消除的方块,将该方块掉落 { board[i + count][j] = board[i][j]; board[i][j] = 0; } } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值