本文主要介绍如何用C语言完整实现2048游戏。很详细,有一定的参考价值。感兴趣的朋友一定要看完!
00-1010 1.在程序开始时,会出现一个菜单,允许玩家选择开始游戏或退出游戏。
2.玩家选择开始游戏后,出现一个棋盘,通过箭头键选择移动方向。
3.移动后,所有的方块都将向这个方向移动,直到空格被填满,相同数量的方块将被合并到它们的和中,并生成一个2或4的随机位置。
4.当“2048”出现时,游戏获胜;当棋盘已满,无法被淘汰时,游戏失败。
00-1010
一、游戏思路
菜单
voidmenu()
{
printf(' * * * * * * * * * * * * * * * * * * * * * * * \ n ');
printf(' * * * * * *按1开始游戏* * * * \ n ');
printf(' * * * * * *按0退出游戏* * * * \ n ');
printf(' * * * * * * * * * * * * * * * * * * * * * * * \ n ');
}菜单选择
intmain()
{
intinput=0;
做
{
menu();
Printf('请选择:');
scanf(“% d”,输入);
开关(输入)
{
案例1:
game 2048();
打破;
案例0:
Printf('退出游戏,客人常来玩~)\ n ');
打破;
默认值:
Printf('给你一个重新选择的机会\ n ');
打破;
}
}while(输入);
返回0;
}实际效果
我觉得菜单挺顺眼的,就是有点难看。毕竟对初学者要求不要太高。
00-1010
二、游戏框架
生成一个4行4列的数组(这里的行数和列数是由头文件中的#define宏定义的)。
打印出来。
void display board(int board[ROW][COL],introw,intcol)
{
inti=0;
int j=0;
for(int j=0;jCOLj)
printf('-');
printf(' \ n ');
for(inti=0;iROW(一)
{
for(int j=0;jCOLj)
{
printf(' | ');
if(board[i][j]!=0)
(=NationalBureauofStandards)国家标准局
p; printf("%5d", board[i][j]);
else
printf(" ");
}
printf("|\n");
for (int j = 0; j < COL; j++)
{
printf("+-----");
}
printf("+\n");
}
}
效果如下:
方吗?方就对了,方就是个好界面!
2.随机生成初始数字
游戏的界面我们现在已经有了,接下来要做的就是加入两个随机位置的”2"。
void get_num(int board[ROW][COL]) { int x, y; x = rand() % ROW; y = rand() % COL; board[x][y] = 2;//一开始随机的数为2 x = rand() % ROW; y = rand() % COL; while (board[x][y] == 2) { x = rand() % ROW; y = rand() % COL; } board[x][y] = 2; system("cls"); //清屏,美观界面 return; }
(这里照例还是使用了时间戳获取随机数的方法)
可以看到每一次出现的两个位置都是随机的。
3.实现移动
这里我们以向上为例,我们要实现移动,以及判定两个方块数字相同就合并成为它们的和,并且当合并后存在空格时继续向上移动。
简单来说,就是 移动 → 合并 → 再次移动补空。其他三个方向也是一样的道理,只需要改变其中的数值便可实现。
void up(int board[ROW][COL]) { int i = 0; int j = 0; int x = 0; int y = 0; for (i = 0; i < ROW; i++) { //移动 j = 0; y = 0; while (j < COL-1 && y < COL-1 ) { if (board[j][i] == 0) { for (x = j; x < ROW-1; x++) board[x][i] = board[x + 1][i]; board[ROW-1][i] = 0; y++; } else j++; } //合并 for (j = 0; j < COL-1; j++) if (board[j][i] == board[j + 1][i] && board[j][i] != 0) { board[j][i] = board[j][i] * 2; //和 board[j + 1][i] = 0; } //再次移动补空 j = 0; y = 0; while (j < COL - 1 && y < COL - 1) { if (board[j][i] == 0) { for (x = j; x < ROW - 1; x++) board[x][i] = board[x + 1][i]; board[ROW - 1][i] = 0; y++; } else j++; } } }
4.增加新数字
每次移动会在随机位置出现一个新的数字,可能是2,可能是4。
通过查询网上资料得知,随机到2的概率约为 9/10,随机到4的概率约为 1/10。
void put_num(int board[ROW][COL]) { int x = 0; int y = 0; int z = 0; x = rand() % ROW; y = rand() % COL; while (board[x][y] !=0) { x = rand() % ROW; y = rand() % COL; } z = rand() % 10; if (z<9) board[x][y] = 2; else board[x][y] = 4; return; }
5.判定胜负
当出现2048时胜利,当格子满了且无法消除时失败。
int is_fail(int board[ROW][COL]) { int i = 0; int j = 0; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (board[i][j] == 0) return 0; if (i > 0) { if (board[i - 1][j] == board[i][j]) return 0; } if (j > 0) { if (board[i][j - 1] == board[i][j]) return 0; } } } return 1; } int is_win(int board[ROW][COL]) { int i = 0; int j = 0; int num = 0; for (i = 0; i < ROW; i++) for (j = 0; j < COL; j++) { if (board[i][j] > num) num = board[i][j]; } if (num >= 2048) return 1; else return 0; }
6.游戏函数
将上述代码结合起来
void game2048() { int board[ROW][COL] = { {0} }; int control = 0; DisplayBoard(board); init_num(board); system("cls"); //清屏,美观界面 DisplayBoard(board); while ((control = _getch()) != 0x1b) { switch (control) { case 0xe0: switch (control = getch()) { case 72: up(board); break; case 80: down(board); break; case 75: left(board); break; case 77: right(board); break; default: break; } system("cls"); DisplayBoard(board); if (is_win(board) == 1) { printf("恭喜你赢了!"); } if (is_fail(board) == 1) { printf("哈哈哈哈哈哈哈好菜\n"); } } } }
三、游戏运行
已知目前游戏存在bug,当格子满了的时候假定一个方向可以消除,另一个方向不可以消除,按了那个不可以消除的方向的话,就会无法操作了,鉴于本人目前初学者并未能够想到很好的解决方法。若有大佬有好的方法也可指点一下。
我太菜了玩了好久都玩不到2048,最高只有512,1024还是舍友打出来的。
更新:修复了bug
先判断数组是否相同再选择是否添加新的随机位置的数字。
在此感谢各位帮助我测试的朋友,无论成功与否,当然特别感谢提供了这张图片的朋友。
四、所有代码
game2048.h
#pragma once #include <stdio.h> #include <time.h> #include <stdlib.h> #include <windows.h> #include<conio.h> #define ROW 4 #define COL 4 const int copy[ROW][COL]; //初始化并打印游戏界面 void DisplayBoard(int board[ROW][COL]); //开局随机生成两个2 void init_num(int board[ROW][COL]); //在移动后随机放置数字2或4 void put_num(int board[ROW][COL]); //移动 void up(int board[ROW][COL]); void down(int board[ROW][COL]); void left(int board[ROW][COL]); void right(int board[ROW][COL]); //判定胜负 int is_win(int board[ROW][COL]); int is_fail(int board[ROW][COL]);
game2048.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game2048.h" void DisplayBoard(int board[ROW][COL]) { int i = 0; int j = 0; printf("tip:*方向键控制方块移动*ESC键返回菜单*\n"); for (int j = 0; j < COL; j++) printf("+-----"); printf("+\n"); for (int i = 0; i < ROW; i++) { for (int j= 0; j < COL; j++) { printf("|"); if (board[i][j]!=0) printf("%5d", board[i][j]); else printf(" "); } printf("|\n"); for (int j = 0; j < COL; j++) { printf("+-----"); } printf("+\n"); } } void init_num(int board[ROW][COL]) { int x, y; x = rand() % ROW; y = rand() % COL; board[x][y] = 2;//随机在一个位置生成2 x = rand() % ROW; y = rand() % COL; while (board[x][y] == 2) { x = rand() % ROW; y = rand() % COL; } board[x][y] = 2; return; } void put_num(int board[ROW][COL]) { int x = 0; int y = 0; int z = 0; x = rand() % ROW; y = rand() % COL; while (board[x][y] !=0) { x = rand() % ROW; y = rand() % COL; } z = rand() % 10; if (z<9) board[x][y] = 2; else board[x][y] = 4; return; } void up(int board[ROW][COL]) { int i = 0; int j = 0; int x = 0; int y = 0; for (i = 0; i < ROW; i++) { //移动 j = 0; y = 0; while (j < COL-1 && y < COL-1 ) { if (board[j][i] == 0) { for (x = j; x < ROW-1; x++) board[x][i] = board[x + 1][i]; board[ROW-1][i] = 0; y++; } else j++; } //合并 for (j = 0; j < COL-1; j++) if (board[j][i] == board[j + 1][i] && board[j][i] != 0) { board[j][i] = board[j][i] * 2; board[j + 1][i] = 0; } //再次移动补空 j = 0; y = 0; while (j < COL - 1 && y < COL - 1) { if (board[j][i] == 0) { for (x = j; x < ROW - 1; x++) board[x][i] = board[x + 1][i]; board[ROW - 1][i] = 0; y++; } else j++; } } if (contrast(board) == 0) put_num(board); else return; } void down(int board[ROW][COL]) { int i = 0; int j = 0; int x = 0; int y = 0; for (i = 0; i < ROW; i++) { j = COL-1; y = 0; while (j > 0 && y < COL-1) { if (board[j][i] == 0) { for (x = j; x > 0; x--) board[x][i] = board[x - 1][i]; board[0][i] = 0; y++; } else j--; } for (j = COL-1; j > 0; j--) if (board[j][i] == board[j - 1][i] && board[j][i] != 0) { board[j][i] = board[j][i] * 2; board[j - 1][i] = 0; } j = COL - 1; y = 0; while (j > 0 && y < COL - 1) { if (board[j][i] == 0) { for (x = j; x > 0; x--) board[x][i] = board[x - 1][i]; board[0][i] = 0; y++; } else j--; } } if (contrast(board) == 0) put_num(board); else return; } void left(int board[ROW][COL]) { int i = 0; int j = 0; int x = 0; int y = 0; for (i = 0; i < ROW; i++) { j = 0; y = 0; while (j < 3 && y < 3 ) { if (board[i][j] == 0) { for (x = j; x < ROW-1; x++) board[i][x] = board[i][x + 1]; board[i][COL-1] = 0; y++; } else j++; } for (j = 0; j < 3; j++) if (board[i][j] == board[i][j + 1] && board[i][j] != 0) { board[i][j] = board[i][j] * 2; board[i][j + 1] = 0; } j = 0; y = 0; while (j < 3 && y < 3) { if (board[i][j] == 0) { for (x = j; x < ROW - 1; x++) board[i][x] = board[i][x + 1]; board[i][COL - 1] = 0; y++; } else j++; } } if (contrast(board) == 0) put_num(board); else return; } void right(int board[ROW][COL]) { int i = 0; int j = 0; int x = 0; int y = 0; for (i = 0; i < 4; i++) { j = COL-1; y = 0; while (j>0 && y < COL-1) { if (board[i][j] == 0) { for (x = j; x > 0; x--) board[i][x] = board[i][x - 1]; board[i][0] = 0; y++; } else j--; } for (j = 3; j > 0; j--) if (board[i][j] == board[i][j - 1] && board[i][j] != 0) { board[i][j] = board[i][j] * 2; board[i][j - 1] = 0; } j = COL - 1; y = 0; while (j > 0 && y < COL - 1) { if (board[i][j] == 0) { for (x = j; x > 0; x--) board[i][x] = board[i][x - 1]; board[i][0] = 0; y++; } else j--; } } if (contrast(board) == 0) put_num(board); else return; } int is_fail(int board[ROW][COL]) { int i = 0; int j = 0; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (board[i][j] == 0) return 0; if (i > 0) { if (board[i - 1][j] == board[i][j]) return 0; } if (j > 0) { if (board[i][j - 1] == board[i][j]) return 0; } } } return 1; } int is_win(int board[ROW][COL]) { int i = 0; int j = 0; int num = 0; for (i = 0; i < ROW; i++) for (j = 0; j < COL; j++) { if (board[i][j] > num) num = board[i][j]; } if (num >= 2048) return 1; else return 0; } void copyboard(int board[ROW][COL],int copy[ROW][COL]) { int i = 0; int j = 0; for (i = 0; i < ROW; i++) for (j = 0; j < COL; j++) copy[i][j] = board[i][j]; } int contrast(int board[ROW][COL]) { int i = 0; int j = 0; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) if (copy[i][j] != board[i][j]) return 0; return 1; }
test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game2048.h" void menu() { printf("**************************\n"); printf("*****按 1 开 始 游 戏*****\n"); printf("*****按 0 退 出 游 戏*****\n"); printf("**************************\n"); } void game2048() { int board[ROW][COL] = { {0} }; int control = 0; DisplayBoard(board); init_num(board); system("cls"); //清屏,美观界面 DisplayBoard(board); while ((control = _getch()) != 0x1b) { switch (control) { case 0xe0: switch (control = getch()) { case 72: copyboard(board, copy); up(board); break; case 80: copyboard(board, copy); down(board); break; case 75: copyboard(board, copy); left(board); break; case 77: copyboard(board, copy); right(board); break; default: break; } system("cls"); DisplayBoard(board); if (is_win(board) == 1) { printf("恭喜你赢了!\n"); } if (is_fail(board) == 1) { printf("哈哈哈哈哈哈哈好菜\n"); } } } } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:"); scanf("%d", &input); switch (input) { case 1: game2048(); break; case 0: printf("退出游戏,客官常来玩呀~)\n"); break; default: printf("给你一次重新选择的机会\n"); break; } } while (input); return 0; }
以上是“怎么用C语言完整实现2048游戏”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/110320.html