首先先解决getch在linux下无法正常使用的问题,需要自己写个函数
//分配内存的大小
#define SIZE 10
//定义按键们的宏
#define ESC "\033"
#define UP "\033[A"
#define DOWN "\033[B"
#define LEFT "\033[D"
#define RIGHT "\033[C"
for ( ; ; )
{
fgets(get, SIZE, stdin);
get[strlen(get) - 1] = '\0';
if (!strcmp(get, ESC)){
printf("This is \"ESC\" button!\n");
}
if (!strcmp(get, UP)){
printf("This is \"UP\" button!\n");
}
if (!strcmp(get, DOWN)){
printf("This is \"DOWN\" button!\n");
}
if (!strcmp(get, LEFT)){
printf("This is \"LEFT\" button!\n");
}
if (!strcmp(get, RIGHT)){
printf("This is \"RIGHT\" button!\n");
}
}
然后开始创建2048这个游戏的底子,我这里是直接定义了一个全局的二维数组,顺便初始化了
最下面放了个传参的源码
int shuzu[4][4];
二一步写一个判断游戏是否结束的函数,即当4*4方格内没有空格时(我这里是用0代替的即没有0时,有需要可以自行更改)游戏结束
int chachong()
{
int i,j;
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
if(shuzu[i][j] == 0){
return 1;
}
}
}
return 0;
}
在主函数里对应if (chachong()) { printf("Game over!\n"); break; }
三一步写随机位置生成2或4
void rad()
{
if(!chachong()) return;
int flag;
flag = 0;
int i,j;
i = rand() % 4;
j = rand() % 4;
while(!(shuzu[i][j] == 0)){
i = rand() % 4;
j = rand() % 4;
flag = 1;
}
int a;
a = rand() % 2;
if(a == 0){
a = 2;
}
else{
a = 4;
}
shuzu[i][j] = a;
}
然后左右上下的移动,也是这个小游戏最核心的的地方,这里只拿左移做例子,剩下的明白了原理都可以推出来
void left_go()
{
int j,i,k;//i为行,j,k均为列
for(i = 0; i < 4; i++){
for(j = 0; j < 3; j++){//左移依次判断左三列,每一个数均向右找相同数字
for(k = j+1; k < 4; k++){//从当前列往右找一列
if(shuzu[i][j] == 0){//当前数值为空时
if(shuzu[i][k] != 0){//右一列不为空
shuzu[i][j] = shuzu[i][k];//将右侧的数移动过来
shuzu[i][k] = 0;//右侧清空
}
}
else if (shuzu[i][j] != 0 && shuzu[i][k] != 0 && shuzu[i][j] != shuzu[i][k]) {
//如果当前位置不为空且右侧不为空,两数不同则直接跳转至下一行
break;
}
else if(flag[i][j] == 0 && shuzu[i][j] == shuzu[i][k]){
/*falg数组作用为判断本次移动中当前判断位置是否移动过,以避免
【2】【2】【2】【2】直接变成
【8】【 】【 】【 】的情况
*/
flag[i][j] = 1;//标记此位置已经移动过
shuzu[i][j] *= 2;
shuzu[i][k] = 0;//移动过来的位置清0
continue;
}
}
}
}
}
源代码,定义全局变量的
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//分配内存的大小
#define SIZE 10
//定义按键们的宏
#define ESC "\033"
#define UP "\033[A"
#define DOWN "\033[B"
#define LEFT "\033[D"
#define RIGHT "\033[C"
int shuzu[4][4];
int flag[4][4];
int chachong()
{
int i,j;
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
if(shuzu[i][j] == 0){
return 1;
}
}
}
return 0;
}
void rad()
{
if(!chachong()) return;
int flag;
flag = 0;
int i,j;
i = rand() % 4;
j = rand() % 4;
while(!(shuzu[i][j] == 0)){
i = rand() % 4;
j = rand() % 4;
flag = 1;
}
int a;
a = rand() % 2;
if(a == 0){
a = 2;
}
else{
a = 4;
}
shuzu[i][j] = a;
}
void right_go()
{
int j,i,k;
for(i = 0; i < 4; i++){
for(j = 3; j > 0; j--){
for(k = j-1; k >= 0; k--){
if(shuzu[i][j] == 0){
if(shuzu[i][k] != 0){
shuzu[i][j] = shuzu[i][k];
shuzu[i][k] = 0;
}
}
else if (shuzu[i][j] != 0 && shuzu[i][k] != 0 && shuzu[i][j] != shuzu[i][k]) {
break;
}
else if(flag[i][j] == 0 && shuzu[i][j] == shuzu[i][k]){
flag[i][j] = 1;
shuzu[i][j] *= 2;
shuzu[i][k] = 0;
continue;
}
}
}
}
}
void left_go()
{
int j,i,k;
for(i = 0; i < 4; i++){
for(j = 0; j < 3; j++){
for(k = j+1; k < 4; k++){
if(shuzu[i][j] == 0){
if(shuzu[i][k] != 0){
shuzu[i][j] = shuzu[i][k];
shuzu[i][k] = 0;
}
}
else if (shuzu[i][j] != 0 && shuzu[i][k] != 0 && shuzu[i][j] != shuzu[i][k]) {
break;
}
else if(flag[i][j] == 0 && shuzu[i][j] == shuzu[i][k]){
flag[i][j] = 1;
shuzu[i][j] *= 2;
shuzu[i][k] = 0;
continue;
}
}
}
}
}
void down_go()
{
int j,i,k;
for(j = 0; j < 4; j++){
for(i = 3; i>0; i--){
for(k = i-1; k >= 0; k--){
if(shuzu[i][j] == 0 && shuzu[k][j] != 0){
shuzu[i][j] = shuzu[k][j];
shuzu[k][j] = 0;
}
else if (shuzu[i][j] != 0 && shuzu[k][j] != 0 && shuzu[i][j] != shuzu[k][j]) {
break;
}
else if(flag[i][j] == 0 && shuzu[i][j] == shuzu[k][j]){
flag[i][j] = 1;
shuzu[i][j] *=2;
shuzu[k][j] = 0;
continue;
}
}
}
}
}
void up_go()
{
int j,i,k;
for(j = 0; j < 4; j++){
for(i = 0; i < 3; i++){
for(k = i+1; k < 4; k++){
if(shuzu[i][j] == 0 && shuzu[k][j] != 0){
shuzu[i][j] = shuzu[k][j];
shuzu[k][j] = 0;
}
else if (shuzu[i][j] != 0 && shuzu[k][j] != 0 && shuzu[i][j] != shuzu[k][j]) {
break;
}
else if(flag[i][j] == 0 && shuzu[i][j] == shuzu[k][j]){
flag[i][j] = 1;
shuzu[i][j] *=2;
shuzu[k][j] = 0;
continue;
}
}
}
}
}
int main()
{
char *get = (char*)malloc(SIZE);
int i,j;
i = rand() % 4;
j = rand() % 4;
int a;
a = rand() % 2;
if(a == 0){
a = 2;
}
else{
a = 4;
}
shuzu[i][j] = a;
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
printf("[%d]",shuzu[i][j]);
}
printf("\n");
}
for ( ; ; )
{
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
flag[i][j] = 0;
}
}
fgets(get, SIZE, stdin);
get[strlen(get) - 1] = '\0';
if (!strcmp(get, ESC)){
printf("This is \"ESC\" button!\n");
break;
}
if (!strcmp(get, UP)){
printf("This is \"UP\" button!\n");
up_go();
}
if (!strcmp(get, DOWN)){
printf("This is \"DOWN\" button!\n");
down_go();
}
if (!strcmp(get, LEFT)){
printf("This is \"LEFT\" button!\n");
left_go();
}
if (!strcmp(get, RIGHT)){
printf("This is \"RIGHT\" button!\n");
right_go();
}
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
printf("[%5d]",shuzu[i][j]);
}
printf("\n");
}
if (!chachong()) {
printf("Game over!\n");
break;
}
rad();
printf("************\n");
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
printf("[%5d]",shuzu[i][j]);
}
printf("\n");
}
}
return 0;
}
源代码,传参的
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//分配内存的大小
#define SIZE 10
//定义按键们的宏
#define ESC "\033"
#define UP "\033[A"
#define DOWN "\033[B"
#define LEFT "\033[D"
#define RIGHT "\033[C"
int chachong(int(*shuzu)[4])
{
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (*(shuzu[i] + j) == 0) {
return 1;
}
}
}
return 0;
}
void rad(int(*shuzu)[4])
{
int flag;
flag = 0;
int i, j;
i = rand() % 4;
j = rand() % 4;
while (!(*(shuzu[i] + j) == 0)) {
i = rand() % 4;
j = rand() % 4;
flag = 1;
}
int a;
a = rand() % 2;
if (a == 0) {
a = 2;
}
else {
a = 4;
}
*(shuzu[i] + j) = a;
}
void right_go(int(*shuzu)[4], int(*flag)[4])
{
int j, i, k;
for (i = 0; i < 4; i++) {
for (j = 3; j > 0; j--) {
for (k = j - 1; k >= 0; k--) {
if (*(shuzu[i] + j) == 0) {
if (*(shuzu[i] + k) != 0) {
*(shuzu[i] + j) = *(shuzu[i] + k);
*(shuzu[i] + k) = 0;
}
}
else if (*(shuzu[i] + j) != 0 && *(shuzu[i] + k) != 0 && *(shuzu[i] + j) != *(shuzu[i] + k)) {
break;
}
else if (*(flag[i] + j) == 0 && *(shuzu[i] + j) == *(shuzu[i] + k)) {
*(flag[i] + j) = 1;
*(shuzu[i] + j) *= 2;
*(shuzu[i] + k) = 0;
continue;
}
}
}
}
}
void left_go(int(*shuzu)[4], int(*flag)[4])
{
int j, i, k;
for (i = 0; i < 4; i++) {
for (j = 0; j < 3; j++) {
for (k = j + 1; k < 4; k++) {
if (*(shuzu[i] + j) == 0) {
if (*(shuzu[i] + k) != 0) {
*(shuzu[i] + j) = *(shuzu[i] + k);
*(shuzu[i] + k) = 0;
}
}
else if (*(shuzu[i] + j) != 0 && *(shuzu[i] + k) != 0 && *(shuzu[i] + j) != *(shuzu[i] + k)) {
break;
}
else if (*(flag[i] + j) == 0 && *(shuzu[i] + j) == *(shuzu[i] + k)) {
*(flag[i] + j) = 1;
*(shuzu[i] + j) *= 2;
*(shuzu[i] + k) = 0;
continue;
}
}
}
}
}
void down_go(int(*shuzu)[4], int(*flag)[4])
{
int j, i, k;
for (j = 0; j < 4; j++) {
for (i = 3; i > 0; i--) {
for (k = i - 1; k >= 0; k--) {
if (*(shuzu[i] + j) == 0 && *(shuzu[k] + j) != 0) {
*(shuzu[i] + j) = *(shuzu[k] + j);
*(shuzu[k] + j) = 0;
}
else if (*(shuzu[i] + j) != 0 && *(shuzu[k] + j) != 0 && *(shuzu[i] + j) != *(shuzu[k] + j)) {
break;
}
else if (*(flag[i] + j) == 0 && *(shuzu[i] + j) == *(shuzu[k] + j)) {
*(flag[i] + j) = 1;
*(shuzu[i] + j) *= 2;
*(shuzu[k] + j) = 0;
continue;
}
}
}
}
}
void up_go(int(*shuzu)[4], int(*flag)[4])
{
int j, i, k;
for (j = 0; j < 4; j++) {
for (i = 0; i < 3; i++) {
for (k = i + 1; k < 3; k++) {
if (*(shuzu[i] + j) == 0 && *(shuzu[k] + j) != 0) {
*(shuzu[i] + j) = *(shuzu[k] + j);
*(shuzu[k] + j) = 0;
}
else if (*(shuzu[i] + j) != 0 && *(shuzu[k] + j) != 0 && *(shuzu[i] + j) != *(shuzu[k] + j)) {
break;
}
else if (*(flag[i] + j) == 0 && *(shuzu[i] + j) == *(shuzu[k] + j)) {
*(flag[i] + j) = 1;
*(shuzu[i] + j) *= 2;
*(shuzu[k] + j) = 0;
continue;
}
}
}
}
}
int main()
{
int shuzu[4][4];
int flag[4][4];
char* get = (char*)malloc(SIZE);
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
*(shuzu[i] + j) = *(flag[i] + j) = 0;
}
}
i = rand() % 4;
j = rand() % 4;
int a;
a = rand() % 2;
if (a == 0) {
a = 2;
}
else {
a = 4;
}
*(shuzu[i] + j) = a;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
printf("[%d]", *(shuzu[i] + j));
}
printf("\n");
}
for (; ; )
{
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
*(flag[i] + j) = 0;
}
}
fgets(get, SIZE, stdin);
get[strlen(get) - 1] = '\0';
if (!strcmp(get, ESC)) {
printf("This is \"ESC\" button!\n");
break;
}
if (!strcmp(get, UP)) {
printf("This is \"UP\" button!\n");
up_go(shuzu, flag);
}
if (!strcmp(get, DOWN)) {
printf("This is \"DOWN\" button!\n");
down_go(shuzu, flag);
}
if (!strcmp(get, LEFT)) {
printf("This is \"LEFT\" button!\n");
left_go(shuzu, flag);
}
if (!strcmp(get, RIGHT)) {
printf("This is \"RIGHT\" button!\n");
right_go(shuzu, flag);
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
printf("[%5d]", *(shuzu[i] + j));
}
printf("\n");
}
if (!chachong(shuzu)) {
printf("Game over!\n");
break;
}
rad(shuzu);
printf("************\n");
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
printf("[%5d]", *(shuzu[i] + j));
}
printf("\n");
}
}
return 0;
}
*少了个判断没移动时还会生成随机数的,挺简单的就不补了