2048-C语言版
来源:互联网 发布:因子分解机 推荐算法 编辑:程序博客网 时间:2024/06/02 23:01
//Main函数调用
#include<stdio.h>
#include <string.h>
#include "Root.h"
int maxNum = 0;//最大值
int score = 0;//当前得分
int hisScore = 0;//历史最高分
int main(int argc,const char * argv[]) {
int numbers[X][Y]={0};
int * p = *numbers;
randNum(p,1);//首次登陆显示两个随机数
randNum(p,1);
show(p);
maxNum =selMax(p,&maxNum);
read_file(&maxNum, &hisScore);
showMain(numbers,p,&maxNum,&score,&hisScore);
printf("max = %d\n",maxNum);
return0;
}
//
#include "Root.h"
void showMain(int (*numbers)[],int *p,int *maxNum,int *score,int *hisScore)
{
int cond=0;//循环条件
int zt =0;//状态
char gesture[2];//滑动指令
do {
printf("W(上)、S(下)、A(左)、D(右)\n");
printf("MAX = %d\t当前得分=%d\t历史最高分=%d\n",*maxNum,*score,*hisScore);
printf("指令:");
scanf("%s",gesture);
if (strcmp(gesture,"W") == 0
|| strcmp(gesture,"w") == 0
|| strcmp(gesture,"S") == 0
|| strcmp(gesture,"s") == 0
|| strcmp(gesture,"A") == 0
|| strcmp(gesture,"a") == 0
|| strcmp(gesture,"D") == 0
|| strcmp(gesture,"d") == 0) {
zt = changeXY(numbers,gesture,score,hisScore);
if (zt ==1) {
randNum(p,1);
show(p);
int cd =selMax(p,maxNum);
//存储最大值和历史最高分
if (*score > *hisScore
|| cd > *maxNum) {
*maxNum = cd;
write_file(maxNum,score);//保存历史最高分
}
}elseif(zt == -1) {
if(isEnd(numbers) ==0) {
printf("game over!\n");
cond = 1;
}
}
}else{
printf("指令有误!\n");
}
} while (cond ==0);
}
/*
返回值 -1无可随机位置
返回值 0正常
参数 index = 0校验是否结束
参数 index = 1生成随机数
*/
int randNum(int *p,int index)//index判断是否生产随机数,
{
srand((unsigned)time(0));
int nums[X*Y]={0};
int z =0;//可用位置存储
int z1 =0;//是否有可用位置
int baseNum =0;//基数
for (int i =0; i < X*Y; i++) {
if (*(p+i) ==0) {
nums[z] = i;
z++;
z1 = 1;
}
}
if (z1 ==0) {
return -1;
}
//index = 0 校验是否结束
//index = 1 生成随机数
if (index ==1) {
int location =0;//位置
location = rand()%z;
baseNum = (rand()%2+1)*2;//随机2、4
*(p+nums[location]) = baseNum;
}
return0;
}
/*
返回值 isChange 0 1-1
-1 无可移动需要判断是否结束
0 无可移动
1 移动完成
*/
int changeXY(int (*p)[Y],char gest[],int *score,int *hisScore)
{
int i =0;
int isChange =0;//是否移动过;
do{
if (strcmp(gest,"W") == 0
|| strcmp(gest,"w") == 0) {
for (int i =1; i < X; i++) {
for (int j =0; j < Y; j++) {
if (*(*(p+i)+j) == *(*(p+i-1)+j)
&& *(*(p+i)+j) != 0) {
*(*(p+i-1)+j) = *(*(p+i-1)+j) *2;
*(*(p+i)+j) = 0;
isChange = 1;
*score += *(*(p+i-1)+j);
}elseif (*(*(p+i-1)+j) ==0
&& *(*(p+i)+j) != 0) {
*(*(p+i-1)+j) = *(*(p+i)+j);
*(*(p+i)+j) = 0;
isChange = 1;
}
}
}
}elseif (strcmp(gest,"A") == 0
|| strcmp(gest,"a") == 0) {
for (int j =1; j < Y; j++) {
for (int i =0; i<X; i++) {
if (*(*(p+i)+j) == *(*(p+i)+j-1)
&& *(*(p+i)+j) != 0) {
*(*(p+i)+j-1) = *(*(p+i)+j-1) *2;
*(*(p+i)+j) = 0;
isChange = 1;
*score += *(*(p+i)+j-1);
}elseif (*(*(p+i)+j-1) ==0
&& *(*(p+i)+j) != 0) {
*(*(p+i)+j-1) = *(*(p+i)+j);
*(*(p+i)+j) = 0;
isChange = 1;
}
}
}
}elseif (strcmp(gest,"D") == 0
|| strcmp(gest,"d") == 0) {
for (int j =Y-2; j >=0; j--) {
for (int i =X-1; i>=0; i--) {
if (*(*(p+i)+j) == *(*(p+i)+j+1)
&& *(*(p+i)+j) != 0) {
*(*(p+i)+j+1) = *(*(p+i)+j+1) *2;
*(*(p+i)+j) = 0;
isChange = 1;
*score += *(*(p+i)+j+1);
}elseif (*(*(p+i)+j+1) ==0
&& *(*(p+i)+j) != 0) {
*(*(p+i)+j+1) = *(*(p+i)+j);
*(*(p+i)+j) = 0;
isChange = 1;
}
}
}
}else{
for (int i =X-2; i >=0; i--) {
for (int j =Y - 1; j >=0; j--) {
if (*(*(p+i)+j) == *(*(p+i+1)+j)
&& *(*(p+i)+j) != 0) {
*(*(p+i+1)+j) = *(*(p+i+1)+j) *2;
*(*(p+i)+j) = 0;
isChange = 1;
*score += *(*(p+i+1)+j);
}elseif (*(*(p+i+1)+j) ==0
&& *(*(p+i)+j) != 0) {
*(*(p+i+1)+j) = *(*(p+i)+j);
*(*(p+i)+j) = 0;
isChange = 1;
}
}
}
}
i++;
}while(i <3);
if (isChange ==0) {
isChange = randNum(*p,0);
}
return isChange;
}
int selMax(int *p,int *max)
{
for (int i =0; i < X*Y; i++) {
*max = *(p+i) > *max ?*(p+i):*max;
}
return *max;
}
//返回值 0结束,1,正常
int isEnd(int (*p)[Y])
{
// int i = 0;
int isEnd =0;//是否结束
// do{
//W
for (int i =1; i < X; i++) {
for (int j =0; j < Y; j++) {
if (*(*(p+i)+j) == *(*(p+i-1)+j)
&& *(*(p+i)+j) != 0) {
isEnd = 1;
}elseif (*(*(p+i-1)+j) ==0
&& *(*(p+i)+j) != 0) {
isEnd = 1;
}
}
}
//A
for (int j =1; j < Y; j++) {
for (int i =0; i<X; i++) {
if (*(*(p+i)+j) == *(*(p+i)+j-1)
&& *(*(p+i)+j) != 0) {
isEnd = 1;
}elseif (*(*(p+i)+j-1) ==0
&& *(*(p+i)+j) != 0) {
isEnd = 1;
}
}
}
//D
for (int j =Y-2; j >=0; j--) {
for (int i =X-1; i>=0; i--) {
if (*(*(p+i)+j) == *(*(p+i)+j+1)
&& *(*(p+i)+j) != 0) {
isEnd = 1;
}elseif (*(*(p+i)+j+1) ==0
&& *(*(p+i)+j) != 0) {
isEnd = 1;
}
}
}
//S
for (int i =X-2; i >=0; i--) {
for (int j =Y - 1; j >=0; j--) {
if (*(*(p+i)+j) == *(*(p+i+1)+j)
&& *(*(p+i)+j) != 0) {
isEnd = 1;
}elseif (*(*(p+i+1)+j) ==0
&& *(*(p+i)+j) != 0) {
isEnd = 1;
}
}
}
// i++;
// }while(i < 3);
return isEnd;
}
void show(int *p)
{
for (int i =0; i < X*Y; i++) {
if(i %4 == 0)printf("\n");
if (*(p+i) >0) {
printf("%d\t",*(p+i));
}else{
printf(".\t");
}
}
printf("\n");
}
void write_file(int *max,int *hisScore)
{
FILE * fp =NULL;
fp = fopen("2048Root.dat","w");
if(!fp) {
return;
}
fwrite(max,sizeof(int),1, fp);
fwrite(hisScore,sizeof(int),1, fp);
fclose(fp);
}
void read_file(int *max,int *hisScore)
{
FILE * fp =NULL;
fp = fopen("2048Root.dat","r");
if(!fp) {
return;
}
fread(max,sizeof(int),1, fp);
fread(hisScore,sizeof(int),1, fp);
fclose(fp);
}
//#ifndef ___048____Root__
#define ___048____Root__
#define X 4
#define Y 4
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int randNum(int *p,int index);
int changeXY(int (*p)[Y],char gest[],int *max,int *hisScore);
int isEnd(int (*p)[Y]);
void show(int *p);
int selMax(int *p,int *max);
void showMain(int (*numbers)[],int *p,int *maxNum,int *score,int *hisScore);
void write_file(int *max,int *hisScore);
void read_file(int *max,int *hisScore);
#endif /* defined(___048____Root__) */
- 2048 C语言版
- 2048-C语言版
- c语言版2048
- C语言版 双截棍
- 双截棍-C语言版
- C语言版--二叉树
- bnu1272 Plural C语言版
- bnu1299 ZUMA C语言版
- bnu1055 阶乘 C语言版
- bnu1057 魔方 C语言版
- bnu1074 小试牛刀 C语言版
- bnu1120 新闻 C语言版
- bnu1246 倒背如流 C语言版
- bnu1251 采蝶轩 C语言版
- bnu1308 空调 C语言版
- bnu1309 Mp3 C语言版
- bnu1310 排队 C语言版
- c语言版汇款系统
- 查找并删除
- 提高项目2-求解分段函数的值
- java 导出Excel 大数据量(一)
- 删除单链表中的重复节点(删除重复项)
- 阅读笔记3-FCNT:Visual Tracking with Fully Convolutional Networks
- 2048-C语言版
- Android缓存机制&一个缓存框架推荐
- EL表达式和JSTL
- 解决了winscp连接不上的问题
- HBase (1)---数据模型
- JAVA JDK 动态代理以及Mybatis的理解
- 解决jquery.js在myeclipse中报错的问题
- remove()与 empty()的区别
- PHP去除字符串中的中文字符