//***************************************************************************//
//**************************刚学代码的小白************************************//
//想必大家小时候或者现在都玩过2048这款小游戏
//在此我用从学习c语言到现在所学知识简单完成此游戏
//大概思路:
// 1、创建一个菜单函数,在里面写入要执行的指令
// 2、通过一个二维数组来实现界面
// 3、通过合并相同值来实现上下左右移动
// 4、最后用文件操作来保存游戏和读档
//***************************************************************************//
#include<stdio.h>
#include<getch.h>
#include<stdbool.h>
#include<time.h>
#include<stdlib.h>
//创建一个二维数组
int arr[4][4];
//bool类型定义一个标志位来判断是否移动
bool IS_MOVE_MERGE = true;
//显示界面
void display(){
system("clear"); //清空屏幕
for(int i=0;i<4;i++){
printf("---------------------\n");
for(int j=0;j<4;j++){
if(0 == arr[i][j]){
printf("| ",arr[i][j]);
}else
printf("|%4d",arr[i][j]);
}
printf("|\n");
}
printf("---------------------");
}
void clear()
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
arr[i][j] == 0;
}
}
}
//判断是否满屏
bool is_null(void){
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(0 == arr[i][j]){
return true;
}
}
}
return false;
}
//创建一个数
void creat_num(){
while(is_null() && IS_MOVE_MERGE){
int x = rand()%4; //产生0-3的随机数
int y = rand()%4; //产生0-3的随机数
if(arr[x][y] == 0){
arr[x][y] = 2;
break;
}
}
}
//up
void up(){
for(int j=0;j<4;j++){
int end = 0;
for(int i=1;i<4;i++){
for(int m=i;m>end && arr[m][j];m--){
if(arr[m][j] == arr[m-1][j]){
arr[m-1][j] *= 2;
arr[m][j] = 0;
end = m;
IS_MOVE_MERGE = true;
}
else if(0 == arr[m-1][j]){
arr[m-1][j] = arr[m][j];
arr[m][j] = 0;
IS_MOVE_MERGE = true;
}
}
}
}
}
//down
void down(){
for(int j=0;j<4;j++){
int end = 3;
for(int i=2;i>=0;i--){
for(int m=i;m<end && arr[m][j];m++){
if(arr[m][j] == arr[m+1][j]){
arr[m+1][j] *= 2;
arr[m][j] = 0;
end = m;
IS_MOVE_MERGE = true;
}
else if(0 == arr[m+1][j]){
arr[m+1][j] = arr[m][j];
arr[m][j] = 0;
IS_MOVE_MERGE = true;
}
}
}
}
}
//right
void right(){
for(int i=0;i<4;i++){
int end = 3;
for(int j=2;j>=0;j--){
for(int m=j;m<end && arr[i][m];m++){
if(arr[i][m] == arr[i][m+1]){
arr[i][m+1] *= 2;
arr[i][m] = 0;
end = m;
IS_MOVE_MERGE = true;
}
else if(0 == arr[i][m+1]){
arr[i][m+1] = arr[i][m];
arr[i][m] = 0;
IS_MOVE_MERGE = true;
}
}
}
}
}
//left
void left()
{
for(int i=0;i<4;i++)
{
int end = 0;
for(int j=1;j<4;j++)
{
for(int m=j;m>end && arr[i][m];m--)
{
if(arr[i][m] == arr[i][m-1])
{
arr[i][m-1] *= 2;
arr[i][m] = 0;
end = m;
IS_MOVE_MERGE = true;
}
else if(0 == arr[i][m-1])
{
arr[i][m-1] = arr[i][m];
arr[i][m] = 0;
IS_MOVE_MERGE = true;
}
}
}
}
}
//存档操作
void save()
{
FILE *fwp = fopen("2048.txt","w");
fwrite(arr,sizeof(int),16,fwp);
printf("存档成功...");
fclose(fwp);
}
//读档操作
void load()
{
FILE *frp = fopen("2048.txt","r");
if(frp == NULL)
{
printf("没有存档,请开始游戏...\n");
return;
}
IS_MOVE_MERGE = false;
fread(arr,sizeof(int),16,frp);
fclose(frp);
}
//判断是否还能继续
bool is_over(void){
if(is_null()){
return false;
}
for(int x=0;x<4;x++){
for(int y=0;y<3;y++){
if(arr[x][y] == arr[x][y+1]){
return false;
}
}
}
for(int x=0;x<3;x++){
for(int y=0;y<4;y++){
if(arr[x][y] == arr[x+1][y]){
return false;
}
}
}
return true;
}
//重新开始游戏
int begin()
{
srand(time(NULL));
while(1)
{
creat_num();
display();
if(is_over())
{
printf("game is over!\n");
printf("返回存档位置(1)、重新开始(2)、结束(3)\n");
char val = getch();
if(val == '3')
{
return 0;
}
else if('1' == val)
{
load();
}
else if('2' == val)
{
begin();
}
}
IS_MOVE_MERGE = false;
switch(getch())
{
case 183: up(); break; //up
case 184: down(); break;//down
case 185: right(); break;//right
case 186: left(); break;//left
case 115: save(); return 0;
case 'q': system("rm 2048.txt"); return 0;
}
}
}
//继续游戏
int go_on()
{
load();
while(1)
{
srand(time(NULL));
creat_num();
display();
if(is_over())
{
printf("game is over!\n");
printf("返回存档位置(1)、重新开始(2)、结束(3)\n");
char val = getch();
if(val == '3')
{
return 0;
}
else if('1' == val)
{
load();
}
else if('2' == val)
{
begin();
}
}
IS_MOVE_MERGE = false;
switch(getch())
{
case 183: up(); break; //up
case 184: down(); break;//down
case 185: right(); break;//right
case 186: left(); break;//left
case 115: save(); return 0;
case 'q': system("rm 2048.txt"); return 0;
}
}
}
void menu()
{
system("clear");
printf("------欢迎来到2048------\n");
printf("1、重新开始\n");
printf("2、继续游戏\n");
printf("3、退出\n");
printf("-----------------------\n");
}
int main(){
menu();
while(1){
switch(getch())
{
case '1':begin(); break;
case '2':go_on(); break;
case '3': return 0;
}
}
}
//-----------------------------------------------------------------//
//总结:
// 总的来说C语言毕竟就这么点知识
// 单个运用和练习可能会比较简单,但是一起运用的话就会比较困难
// 在想成为优秀的程序员前,还是需要努力的学习新知识和熟练运用已学的知识
// 在这里也祝热爱打代码或者生活所迫的新手小白程序员们能不被现实打败 fighting!
C语言设计的简单2048小游戏
最新推荐文章于 2022-07-21 10:07:48 发布