区块链技术博客
www.b2bchain.cn

在树莓派上用C语言实现2048游戏(非原创)

这篇文章主要介绍了在树莓派上用C语言实现2048游戏(非原创)的讲解,通过具体代码实例进行16310 讲解,并且分析了在树莓派上用C语言实现2048游戏(非原创)的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=16310

本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:

在树莓派上用C语言实现2048游戏(转)

最近发现了一个比较有意思的小程序,在Linux环境下用C语言实现2048游戏,于是将程序在自己的树莓派上测试了一下,过程中也学到了许多C语言的知识,现将过程整理出来,方便初学者学习。

文章目录

  • 在树莓派上用C语言实现2048游戏(转)
    • (一)实验环境
    • (二)实验前的准备
    • (三)设计思路
    • (四)代码部分
    • (五)编译与运行

(一)实验环境

·硬件与系统:树莓派4B(raspbian系统)
·C语言开发环境:Geany(树莓派4自带的)

(二)实验前的准备

在树莓派安装一个文本界面的屏幕绘图库ncurses,打开终端输入:

sudo apt-get install libncurses5-dev 

完成对程序必要的库的安装

(三)设计思路

要实现 2048 游戏目前有两个关键点:
·在满足条件情况下消除方块
·允许在游戏主界面(16 宫格)中任意一格输出数据
其中第二点借助 ncurses 库可以较容易实现,但是第一点要稍微麻烦些。

第一点的实现思路是,我们创建一个与游戏地图相同维数的数组矩阵,通过数组矩阵来维护 2048 游戏中每个格子的数据与状态,从而玩家的移动操作都可以映射为对数组矩阵的操作。

对于几个重要的函数,这里做一个简单的介绍:

init()函数
init 函数首先初始化屏幕,并且随机生成两个数字 x, y 用于指定方格的位置坐标,并给数组 a[][] 中相应位存入数字 2 ,然后再调用 draw 函数绘制对应的字符界面。

这部分用于初始化游戏界面,使得刚进入游戏的时候界面如下:
在树莓派上用C语言实现2048游戏(非原创)
draw()函数
用于绘制方格的函数。
draw_one()函数
绘制单个数字的函数。
play()函数
通过 W, S, A, D 和方向键来分别控制上、下、左、右方向的移动,按 Q 键可以退出界面。
cnt_one()函数
用于生成新数字的位置。
game_over()函数
游戏结束子函数。

(四)代码部分

#include <stdio.h> #include <stdlib.h> #include <curses.h> #include <unistd.h> #include <signal.h> #include <time.h>  int a[4][4] = { 0 }; int empty; int old_y, old_x;  void draw(); void play(); void init(); void draw_one(int y, int x); void cnt_value(int* new_y, int* new_x); int game_over(); int cnt_one(int y, int x);  int main() { 	init(); 	play(); 	endwin();  	return 0; }  void init() { 	int x, y;  	initscr(); 	cbreak(); 	noecho(); 	curs_set(0);  	empty = 15; 	srand(time(0)); 	x = rand() % 4; 	y = rand() % 4; 	a[y][x] = 2; 	draw(); }  void draw() { 	int n, m, x, y; 	char c[4] = { '0', '0', '0', '0' }; 	clear();  	for (n = 0; n < 9; n += 2) 	{ 		for (m = 0; m < 21; m++) 		{ 			move(n, m); 			addch('-'); 			refresh(); 		} 	} 	for (m = 0; m < 22; m += 5) 	{ 		for (n = 1; n < 8; n++) 		{ 			move(n, m); 			addch('|'); 			refresh(); 		} 	} 	for (y = 0; y < 4; y++) 	{ 		for (x = 0; x < 4; x++) 		{ 			draw_one(y, x); 		} 	} }  void draw_one(int y, int x) { 	int i, m, k, j; 	char c[5] = { 0x00 }; 	i = a[y][x]; 	m = 0; 	while (i > 0) 	{ 		j = i % 10; 		c[m++] = j + '0'; 		i = i / 10; 	} 	m = 0; 	k = (x + 1) * 5 - 1; 	while (c[m] != 0x00) 	{ 		move(2 * y + 1, k); 		addch(c[m++]); 		k--; 	} }  void play() { 	int x, y, i, new_x, new_y, temp; 	int old_empty, move; 	char ch;  	while (1) 	{ 		move = 0; 		old_empty = empty; 		ch = getch(); 		switch (ch) { 		case 97: 		case 104: 		case 68: 			for (y = 0; y < 4; y++) 				for (x = 0; x < 4; ) 				{ 					if (a[y][x] == 0) 					{ 						x++; 						continue; 					} 					else 					{ 						for (i = x + 1; i < 4; i++) 						{ 							if (a[y][i] == 0) 							{ 								continue; 							} 							else 							{ 								if (a[y][x] == a[y][i]) 								{ 									a[y][x] += a[y][i]; 									a[y][i] = 0; 									empty++; 									break; 								} 								else 								{ 									break; 								} 							} 						} 						x = i; 					} 				} 			for (y = 0; y < 4; y++) 				for (x = 0; x < 4; x++) 				{ 					if (a[y][x] == 0) 					{ 						continue; 					} 					else 					{ 						for (i = x; (i > 0) && (a[y][i - 1] == 0); i--) 						{ 							a[y][i - 1] = a[y][i]; 							a[y][i] = 0; 							move = 1; 						} 					} 				} 			break; 		case 100: 		case 108: 		case 67: 			for (y = 0; y < 4; y++) 				for (x = 3; x >= 0; ) 				{ 					if (a[y][x] == 0) 					{ 						x--; 						continue; 					} 					else 					{ 						for (i = x - 1; i >= 0; i--) 						{ 							if (a[y][i] == 0) 							{ 								continue; 							} 							else if (a[y][x] == a[y][i]) 							{ 								a[y][x] += a[y][i]; 								a[y][i] = 0; 								empty++; 								break; 							} 							else 							{ 								break; 							} 						} 						x = i; 					} 				} 			for (y = 0; y < 4; y++) 				for (x = 3; x >= 0; x--) 				{ 					if (a[y][x] == 0) 					{ 						continue; 					} 					else 					{ 						for (i = x; (i < 3) && (a[y][i + 1] == 0); i++) 						{ 							a[y][i + 1] = a[y][i]; 							a[y][i] = 0; 							move = 1; 						} 					} 				} 			break; 		case 119: 		case 107: 		case 65: 			for (x = 0; x < 4; x++) 				for (y = 0; y < 4; ) 				{ 					if (a[y][x] == 0) 					{ 						y++; 						continue; 					} 					else 					{ 						for (i = y + 1; i < 4; i++) 						{ 							if (a[i][x] == 0) 							{ 								continue; 							} 							else if (a[y][x] == a[i][x]) 							{ 								a[y][x] += a[i][x]; 								a[i][x] = 0; 								empty++; 								break; 							} 							else 							{ 								break; 							} 						} 						y = i; 					} 				} 			for (x = 0; x < 4; x++) 				for (y = 0; y < 4; y++) 				{ 					if (a[y][x] == 0) 					{ 						continue; 					} 					else 					{ 						for (i = y; (i > 0) && (a[i - 1][x] == 0); i--) 						{ 							a[i - 1][x] = a[i][x]; 							a[i][x] = 0; 							move = 1; 						} 					} 				} 			break; 		case 115: 		case 106: 		case 66: 			for (x = 0; x < 4; x++) 				for (y = 3; y >= 0; ) 				{ 					if (a[y][x] == 0) 					{ 						y--; 						continue; 					} 					else 					{ 						for (i = y - 1; i >= 0; i--) 						{ 							if (a[i][x] == 0) 							{ 								continue; 							} 							else if (a[y][x] == a[i][x]) 							{ 								a[y][x] += a[i][x]; 								a[i][x] = 0; 								empty++; 								break; 							} 							else 							{ 								break; 							} 						} 						y = i; 					} 				} 			for (x = 0; x < 4; x++) 				for (y = 3; y >= 0; y--) 				{ 					if (a[y][x] == 0) 					{ 						continue; 					} 					else 					{ 						for (i = y; (i < 3) && (a[i + 1][x] == 0); i++) 						{ 							a[i + 1][x] = a[i][x]; 							a[i][x] = 0; 							move = 1; 						} 					} 				} 			break; 		case 'Q': 		case 'q': 			game_over(); 			break; 		default: 			continue; 			break; 		} 		if (empty <= 0) 			game_over(); 		if ((empty != old_empty) || (move == 1)) 		{ 			do { 				new_x = rand() % 4; 				new_y = rand() % 4; 			} while (a[new_y][new_x] != 0);  			cnt_value(&new_y, &new_x);  			do { 				temp = rand() % 4; 			} while (temp == 0 || temp == 2); 			a[new_y][new_x] = temp + 1; 			empty--; 		} 		draw(); 	} }  int cnt_one(int y, int x) { 	int value = 1;  	if (y - 1 > 0) 		a[y - 1][x] ? 0 : value++; 	if (y + 1 < 4) 		a[y + 1][x] ? 0 : value++; 	if (x - 1 >= 0) 		a[y][x - 1] ? 0 : value++; 	if (x + 1 < 4) 		a[y][x + 1] ? 0 : value++; 	if (y - 1 >= 0 && x - 1 >= 0) 		a[y - 1][x - 1] ? 0 : value++; 	if (y - 1 >= 0 && x + 1 < 4) 		a[y - 1][x + 1] ? 0 : value++; 	if (y + 1 < 4 && x - 1 >= 0) 		a[y + 1][x - 1] ? 0 : value++; 	if (y + 1 < 4 && x + 1 < 4) 		a[y + 1][x + 1] ? 0 : value++;  	return value; }  void cnt_value(int* new_y, int* new_x) { 	int max_x, max_y, x, y, value; 	int max = 0;  	max = cnt_one(*new_y, *new_x); 	for (y = 0; y < 4; y++) 		for (x = 0; x < 4; x++) 		{ 			if (!a[y][x]) 			{ 				value = cnt_one(y, x); 				if (value > max && old_y != y && old_x != x) 				{ 					*new_y = y; 					*new_x = x; 					old_x = x; 					old_y = y; 					break; 				} 			} 		} }  int game_over() { 	sleep(1); 	endwin(); 	exit(0); } 

(五)编译与运行

将代码保存为C语言文件2048.c,在终端进入对应文件夹,输入编译指令:

gcc 2048.c -o 2048 -lcurses 

注意编译时不要忘记输入-lcurses选项,完成对curses库的链接。
之后运行程序:

./2048 

游戏效果如下:
在树莓派上用C语言实现2048游戏(非原创)

做个记录,慢慢学习。最后放一下原项目出处:
https://www.lanqiao.cn/courses/155

本文转自互联网,侵权联系删除在树莓派上用C语言实现2048游戏(非原创)

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 在树莓派上用C语言实现2048游戏(非原创)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们