C语言设计的简单2048小游戏
//***************************************************************************//
//**************************刚学代码的小白************************************//
//想必大家小时候或者现在都玩过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]);}elseprintf("|%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; //upcase 184: down(); break;//downcase 185: right(); break;//rightcase 186: left(); break;//leftcase 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; //upcase 184: down(); break;//downcase 185: right(); break;//rightcase 186: left(); break;//leftcase 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小游戏相关推荐
- c语言写一个简单的小游戏-推箱子
在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...
- 一个简单的c 游戏编程语言,编程达人 c语言写一个简单的小游戏-推箱子
在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...
- C语言实训 easyx 2048小游戏(带背景音乐)
easyx2048小游戏 如果对你有帮助的话,希望可以给我点个赞支持一下. 想要别的实训代码源码的可以私信QQ2542909300找我,或者程序有什么内容的话也可以找我帮忙看看. https://gi ...
- 基于C语言设计的像素小鸟小游戏
资源下载地址:https://download.csdn.net/download/sheziqiong/85672935 一.设计目的 掌握定义函数,并熟练使用各函数 实现各函数模块的调用 学会将静 ...
- python2048小游戏程序设计大作业_C语言大作业报告——2048小游戏程序
大作业题目 类型 游戏 班 号 学 号 所在院系 学 期 2020 年春季学期 任课教师 实验类型 综合设计型 实验目的: 掌握程序设计的基本算法和简单数据结构基础,能够综合运用基本控制语句.算法 ...
- 用C语言写一个简单的小游戏——猜数字
我们该如何设计这个程序? 1.首先应该打印一个菜单,让玩家选择玩游戏或者退出游戏 2.当玩家选择玩游戏,我们让电脑生成一个1~100的随机数,让玩家去猜 3.如果玩家猜的数比电脑生成的数大,我们提示猜 ...
- 基于C语言设计的植物大战僵尸小游戏
资源下载地址:https://download.csdn.net/download/sheziqiong/86763979 资源下载地址:https://download.csdn.net/downl ...
- 用C语言实现简易的2048小游戏
main.c 调用init_game.start_game和end_game函数 #include <stdio.h> #include "game2048.h"int ...
- C语言学习:简单的小游戏 走迷宫、推箱子
目录 一.走迷宫分析: 走迷宫代码展示 二.推箱子分析: 推箱子代码展示 一.走迷宫分析: 数据分析: 1.定义二维字符数组作为迷宫地图 2.定义变量记录角色的位置 x ...
最新文章
- Vue el-menu高亮设置及点击菜单项实现路由跳转
- 【数学与算法】奇异矩阵、奇异值、奇异值分解、奇异性
- 【论文精读】PIFu: Pixel-Aligned Implicit Function for High-Resolution Clothed Human Digitization
- ubuntu 16.0安装ros-kinetic
- java应用程序利用Exe4j打包exe文件
- 记录hadoop HDFS与hadoop YARN无法访问问题
- 001 vagrant安装box
- 计算机设计思想 —— 虚拟化
- 【LeetCode题解】排序
- codeforces 212E IT Restaurants(树形dp+背包思想)
- WPS2019 所有宏被禁,用启用宏要付费,如何免费使用
- 台达b2伺服modbus通讯_台达伺服ASDA-B2使用手册-简体最新.pdf
- 真北方向、坐标北向以及磁北向
- 液压与气压传动(机电)_简要问答_复习笔记
- 限定通配符和非限定通配符_什么是通配符?
- 程序员年龄变大后的职业出路是什么?
- Never give up!!
- 柳传志回应“联想5G投票事件”:不要罔顾事实挑拨离间
- android随手记(持续更新)
- 番茄学习--番茄工具推荐