C语言实现2048小游戏
本文实例为大家分享了C语言实现2048游戏的具体代码,供大家参考,具体内容如下
滑块有颜色、有最高分(用到文件)
#include#include #include /*使用getch()函数*/ #include #include /*使用Sleep()函数*/ voidMenu();//菜单 voidRule_of_game();//游戏规则 voidBegin(intmax);//开始 voidTable();//打印4×4方格 intRandom_number1();//产生2或4的随机数 intRandom_number2();//产生0、1、2、3的随机数 intGet(int*p_cnt,intscore);//输入指令 voidMove();//保留上一次的棋盘布局 intIf_move();//判断是否移动 intOver();//判断是否结束 voidEstablish_game();//创建用于保存最高分的文件 voidWrite_max(intscore);//向2048游戏-最高记录写入最高分 intRead_max();//读出最高分记录的文件 voidEstablish_file();//创建存档文件 voidWrite_file(int*p_cnt,intscort);//存档 intRead_file(int*p_cnt);//读档 voidagain();//是否继续游戏 intcolor(intc);//更改颜色 voidbox_color(intx);//不同数值对应不同颜色 inta[4][4]={0};//定义全局的二维数组 intA[4][4];//保留上一步的棋局 char*name_max="2048游戏-最高记录"; char*name_file="[空白]-2048游戏"; intmain(){ system("modeconcols=90lines=30"); system("title2048超级大大型游戏");//程序标题 system("colorF0");//F表示背景颜色,0表示前景颜色 Menu(); system("pause");//暂停,输入任意键继续 system("cls");//清屏 again();//是否继续游戏 return0; } voidMenu()//菜单 { printf("\t\t╔══════════════════════════════════════════════╗\n"); printf("\t\t║欢迎使用由[空白]制作的2048超级大大型游戏║\n"); printf("\t\t╟──────────────────────────────────────────────╢\n"); printf("\t\t║请输入选项:║\n"); printf("\t\t║┌───┐║\n"); printf("\t\t║│1│游戏规则║\n"); printf("\t\t║└───┘║\n"); printf("\t\t║┌───┐║\n"); printf("\t\t║│2│开始游戏║\n"); printf("\t\t║└───┘║\n"); printf("\t\t║┌───┐║\n"); printf("\t\t║│3│继续游戏║\n"); printf("\t\t║└───┘║\n"); printf("\t\t║┌───┐║\n"); printf("\t\t║│4│退出游戏║\n"); printf("\t\t║└───┘║\n"); printf("\t\t╚══════════════════════════════════════════════╝\n"); intx=1,max=0; while(x){ switch(getch()){ case'1': x=0; Rule_of_game();//游戏规则 Menu(); break; case'2': x=0; system("cls");//清屏 Establish_game(name_file);//创建新的读档文件 Establish_game(name_max);//创建新的保存最高记录的文件 Begin(max);//开始游戏 break; case'3': x=0; system("cls");//清屏 max=Read_max();//读取之前的最高记录 Begin(max);//开始游戏 break; case'4': exit(0); default: printf("输入了非法选项,请重新选择!\n"); } } } voidRule_of_game() { system("cls");//清屏 printf("╔══════════════════════════════════════════════════════════════════════════════════╗\n"); printf("║本游戏通过按键W、S、A、D(不区分大小写)四个键分别控制滑块上移、下移、左移和右移。║\n"); printf("║滑块移动的过程中,如有相邻且相等数字的滑块将会相加,并获得相应的分数。║\n"); printf("║当棋盘上的所有位置均有数字,且不能合成,则游戏结束。本游戏未设置游戏成功。║\n"); printf("║游戏过程中输入I即为存档并退出游戏,输入O即为读档,输入P则退出游戏。║\n"); printf("║“开始游戏”则清除最高记录及存档、“继续游戏”则保存之前的最高记录,且可以读档。║\n"); printf("╚══════════════════════════════════════════════════════════════════════════════════╝\n"); system("pause");//暂停 system("cls");//清屏 } voidBegin(intmax) { intscore=0; intsign=1; inth,l,cnt=0; int*p_cnt=&cnt; while(1){ printf("\t\t╔══════════════════════════════════════════════╗\n"); printf("\t\t║欢迎使用由[空白]制作的2048超级大大型游戏║\n"); printf("\t\t╟──────────────────────────────────────────────╢\n"); printf("\t\t║移动:┌───┐存档:读档:退出:║\n"); printf("\t\t║│W│║\n"); printf("\t\t║┌───┼───┼───┐┌───┐┌───┐┌───┐║\n"); printf("\t\t║│A│S│D││I││O││P│║\n"); printf("\t\t║└───┴───┴───┘└───┘└───┘└───┘║\n"); printf("\t\t╚══════════════════════════════════════════════╝\n"); while(1){ if(sign==1){ h=Random_number2(); l=Random_number2(); if(a[h][l]==0){ a[h][l]=Random_number1(); cnt++; break; } } else{ break; } } Table();//打印棋盘 printf("\t\t移动的步数:%d\t当前得分:%d\n\t\t最高记录:%d\n",cnt-1,score,max); Move();//保留棋盘 score+=Get(p_cnt,score);//得分 sign=If_move();//判断棋盘是否有变动 if(Over()==0){ if(max 0;h--){ if(a[h-1][l]==0){ a[h-1][l]=a[h][l]; a[h][l]=0; } } } } /*竖直方向上,相邻且相同的数字相加*/ for(l=0;l<4;l++){ for(h=0;h<3;h++){ if(a[h][l]==a[h+1][l]){ a[h][l]+=a[h+1][l]; a[h+1][l]=0; sum+=a[h][l]; } } } /*向上聚集数字*/ for(l=0;l<4;l++){ for(t=0;t<4;t++){ for(h=3;h>0;h--){ if(a[h-1][l]==0){ a[h-1][l]=a[h][l]; a[h][l]=0; } } } } break; case's': case'S': for(l=0;l<4;l++){ for(t=0;t<4;t++){ for(h=0;h<3;h++){ if(a[h+1][l]==0){ a[h+1][l]=a[h][l]; a[h][l]=0; } } } } for(l=0;l<4;l++){ for(h=3;h>0;h--){ if(a[h][l]==a[h-1][l]){ a[h][l]+=a[h-1][l]; a[h-1][l]=0; sum+=a[h][l]; } } } for(l=0;l<4;l++){ for(t=0;t<4;t++){ for(h=0;h<3;h++){ if(a[h+1][l]==0){ a[h+1][l]=a[h][l]; a[h][l]=0; } } } } break; case'a': case'A': for(h=0;h<4;h++){ for(t=0;t<4;t++){ for(l=3;l>0;l--){ if(a[h][l-1]==0){ a[h][l-1]=a[h][l]; a[h][l]=0; } } } } for(h=0;h<4;h++){ for(l=0;l<3;l++){ if(a[h][l]==a[h][l+1]){ a[h][l]+=a[h][l+1]; a[h][l+1]=0; sum+=a[h][l]; } } } for(h=0;h<4;h++){ for(t=0;t<4;t++){ for(l=3;l>0;l--){ if(a[h][l-1]==0){ a[h][l-1]=a[h][l]; a[h][l]=0; } } } } break; case'd': case'D': for(h=0;h<4;h++){ for(t=0;t<4;t++){ for(l=0;l<3;l++){ if(a[h][l+1]==0){ a[h][l+1]=a[h][l]; a[h][l]=0; } } } } for(h=0;h<4;h++){ for(l=3;l>0;l--){ if(a[h][l]==a[h][l-1]){ a[h][l]+=a[h][l-1]; a[h][l-1]=0; sum+=a[h][l]; } } } for(h=0;h<4;h++){ for(t=0;t<4;t++){ for(l=0;l<3;l++){ if(a[h][l+1]==0){ a[h][l+1]=a[h][l]; a[h][l]=0; } } } } break; case'i': case'I'://存档当前游戏格局 Establish_file();//创建用于存档的文件 Write_file(p_cnt,score);//调用存档函数 break; case'o': case'O': sum=Read_file(p_cnt);//读档 break; case'p': case'P': exit(0);//退出程序 default: break; } returnsum; } voidMove() { inth,l; for(h=0;h<4;h++){ for(l=0;l<4;l++){ A[h][l]=a[h][l]; } } } intIf_move() { inth,l,sign=0; for(h=0;h<4;h++){ for(l=0;l<4;l++){ if(a[h][l]!=A[h][l]){//未进入条件框,说明滑块没有发生移动 sign=1; gotoout; } } } out: returnsign; } intOver() { intover=0; inth,l; for(h=0;h<4;h++){ for(l=0;l<4;l++){ if(a[h][l]==0){//有空格 over=1;//游戏继续 return1; } } } if(over==0){//没有空格 for(h=0;h<3;h++){ for(l=0;l<3;l++){ if(a[h][l]==a[h][l+1]){ over=1;//游戏继续 break; } elseif(a[h][l]==a[h+1][l]){ over=1;//游戏继续 break; } } if(over==1){ break; } } } returnover;//游戏结束 } voidEstablish_game()//创建文件 { inth; if(h=fopen(name_max,"wb")==NULL){//函数fopen()返回NULL则创建文件失败 printf("\t\t创建文件失败!程序即将自动退出...\n"); Sleep(3000);//睡眠3000毫秒,即停留3秒钟 exit(0);//退出程序 } } voidWrite_max(intscore)//写入文件 { /*FILE*fp是指向文件的指针*/ FILE*fp=fopen(name_max,"at+");//at+读写打开或着建立一个文本文件;允许读写。 if(fp==NULL)//函数fopen()返回NULL则创建文件失败 { printf("\t\t保存最高分失败!程序即将自动退出..."); Sleep(3000);//睡眠3000毫秒,即停留3秒钟 exit(0);//退出程序 } else{ fprintf(fp,"%d",score);//将score的值写入*pf指向的文件内 } fclose(fp);//关闭*pf指向的文件 } intRead_max()//读出文件 { intmax_score=0; FILE*fp=fopen(name_max,"at+");//at+读写打开或着建立一个文本文件;允许读写。 if(fp==NULL) { printf("\t\t读取失败!程序即将自动退出..."); Sleep(3000);//睡眠3000毫秒,即停留3秒钟 exit(0);//退出程序 } else{ fscanf(fp,"%d",&max_score);//从*pf指向的文件内数值赋值给max_score } fclose(fp);//关闭*pf指向的文件 returnmax_score;//返回最高记录的值 } voidEstablish_file()//创建文件 { inth; if(h=fopen(name_file,"wb")==NULL){//函数fopen()返回NULL则创建文件失败 printf("\t\t创建文件失败!程序即将自动退出...\n"); Sleep(3000);//睡眠3000毫秒,即停留3秒钟 exit(0);//退出程序 } } voidWrite_file(int*p_cnt,intscore) { inth,l; FILE*fp=fopen(name_file,"at+");//at+读写打开或着建立一个文本文件;允许读写。 if(fp==NULL) { printf("\t\t存档失败!程序即将自动退出...\n"); Sleep(3000);//睡眠3000毫秒,即停留3秒钟 exit(0); } else{ for(h=0;h<4;h++){ for(l=0;l<4;l++){ fprintf(fp,"%d",a[h][l]); } } } fprintf(fp,"%d",score); fprintf(fp,"%d",*p_cnt-1); printf("\t\t存档成功!游戏即将自动退出...\n"); Sleep(3000);//睡眠3000毫秒,即停留3秒钟 exit(0); fclose(fp);//关闭文件 } intRead_file(int*p_cnt) { inth,l,score=0; FILE*fp=fopen(name_file,"at+");//at+读写打开或着建立一个文本文件;允许读写。 if(fp==NULL) { printf("\t\t读档失败!程序即将自动退出...\n"); Sleep(3000);//睡眠3000毫秒,即停留3秒钟 exit(0); } else{ for(h=0;h<4;h++){ for(l=0;l<4;l++){ fscanf(fp,"%d",&a[h][l]); } } } fscanf(fp,"%d",&score); fscanf(fp,"%d",p_cnt); fclose(fp);//关闭文件 returnscore; } voidagain()//是否继续游戏 { printf("\t\t╔══════════════════════════════════════════════╗\n"); printf("\t\t║您已失败║\n"); printf("\t\t╟──────────────────────────────────────────────╢\n"); printf("\t\t║是否继续:║\n"); printf("\t\t║┌───┐║\n"); printf("\t\t║│1│扶我起来,我还能再来一局!║\n"); printf("\t\t║└───┘║\n"); printf("\t\t║┌───┐║\n"); printf("\t\t║│2│不了不了,我要学习!║\n"); printf("\t\t║└───┘║\n"); printf("\t\t╚══════════════════════════════════════════════╝\n"); if(_getch()=='1'){ system("cls");//清屏 inth,l; for(h=0;h<4;h++){ for(l=0;l<4;l++){ a[h][l]=0; A[h][l]=0; } } Menu();//回到菜单 } else{ printf("\t\t游戏结束!\n"); } } intcolor(intc) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_INTENSITY| BACKGROUND_BLUE| BACKGROUND_RED| BACKGROUND_GREEN| c); return0; } voidbox_color(intx) { switch(x){ case2: color(8); break; case4: color(0); break; case8: color(2); break; case16: color(6); break; case32: color(10); break; case64: color(3); break; case128: color(9); break; case256: color(11); break; case512: color(5); break; case1024: color(13); break; case2048: color(12); break; default: color(4); break; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。