C語言實(shí)現(xiàn)2048小游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)2048游戲的具體代碼,供大家參考,具體內(nèi)容如下
滑塊有顏色、有最高分(用到文件)
#include <stdio.h>
#include <stdlib.h>
#include <conio.h> /*使用getch()函數(shù)*/
#include <time.h>
#include <windows.h> /*使用Sleep()函數(shù)*/ 
void Menu();//菜單
void Rule_of_game();//游戲規(guī)則 
void Begin(int max); //開始 
void Table();//打印4×4方格 
int Random_number1();//產(chǎn)生2或4的隨機(jī)數(shù) 
int Random_number2();//產(chǎn)生0、1、2、3的隨機(jī)數(shù) 
int Get(int *p_cnt, int score);//輸入指令 
void Move();//保留上一次的棋盤布局 
int If_move();//判斷是否移動 
int Over();//判斷是否結(jié)束 
void Establish_game();//創(chuàng)建用于保存最高分的文件 
void Write_max(int score);//向2048游戲-最高記錄寫入最高分 
int Read_max();//讀出最高分記錄的文件
void Establish_file();//創(chuàng)建存檔文件 
void Write_file(int *p_cnt, int scort);//存檔 
int Read_file(int *p_cnt);//讀檔 
void again();//是否繼續(xù)游戲
int color(int c);//更改顏色
void box_color(int x);//不同數(shù)值對應(yīng)不同顏色 
int a[4][4] = {0};// 定義全局的二維數(shù)組 
int A[4][4]; //保留上一步的棋局 
char *name_max = "2048游戲-最高記錄";
char *name_file = "[空白]-2048游戲";
int main() {
 system("mode con cols=90 lines=30");
 system("title 2048超級大大型游戲"); //程序標(biāo)題 
 system("color F0");//F 表示背景顏色,0表示前景顏色 
 Menu();
 system("pause"); //暫停,輸入任意鍵繼續(xù) 
 system("cls"); //清屏 
 again(); //是否繼續(xù)游戲
 return 0;
}
void Menu() //菜單 
{
 printf("\t\t╔══════════════════════════════════════════════╗\n"); 
 printf("\t\t║ 歡迎使用由[空白]制作的2048超級大大型游戲 ║\n");
 printf("\t\t╟──────────────────────────────────────────────╢\n");
 printf("\t\t║請輸入選項(xiàng):   ║\n");
 printf("\t\t║ ┌───┐  ║\n");
 printf("\t\t║ │ 1 │ 游戲規(guī)則  ║\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 │ 繼續(xù)游戲  ║\n");
 printf("\t\t║ └───┘  ║\n");
 printf("\t\t║ ┌───┐  ║\n");
 printf("\t\t║ │ 4 │ 退出游戲  ║\n");
 printf("\t\t║ └───┘  ║\n");
 printf("\t\t╚══════════════════════════════════════════════╝\n");
 int x = 1, max = 0;
 while(x){
 switch(getch()){
 case '1':
 x = 0;
 Rule_of_game();//游戲規(guī)則
 Menu();
 break; 
 case '2':
 x = 0;
 system("cls");//清屏
 Establish_game(name_file);//創(chuàng)建新的讀檔文件 
 Establish_game(name_max);//創(chuàng)建新的保存最高記錄的文件 
 Begin(max); //開始游戲 
 break;
 case '3':
 x = 0;
 system("cls");//清屏
 max = Read_max();//讀取之前的最高記錄 
 Begin(max); //開始游戲 
 break;
 case '4':
 exit(0); 
 default:
 printf("輸入了非法選項(xiàng),請重新選擇!\n");
 }
 }
}
void Rule_of_game()
{ 
 system("cls");//清屏 
 printf("╔══════════════════════════════════════════════════════════════════════════════════╗\n"); 
 printf("║本游戲通過按鍵W、S、A、D(不區(qū)分大小寫)四個(gè)鍵分別控制滑塊上移、下移、左移和右移。║\n");
 printf("║滑塊移動的過程中,如有相鄰且相等數(shù)字的滑塊將會相加,并獲得相應(yīng)的分?jǐn)?shù)。 ║\n");
 printf("║當(dāng)棋盤上的所有位置均有數(shù)字,且不能合成,則游戲結(jié)束。本游戲未設(shè)置游戲成功。 ║\n");
 printf("║游戲過程中輸入I即為存檔并退出游戲,輸入O即為讀檔,輸入P則退出游戲。 ║\n");
 printf("║“開始游戲”則清除最高記錄及存檔、“繼續(xù)游戲”則保存之前的最高記錄,且可以讀檔。 ║\n"); 
 printf("╚══════════════════════════════════════════════════════════════════════════════════╝\n");
 system("pause");//暫停 
 system("cls");//清屏 
}
void Begin(int max)
{
 int score = 0;
 int sign = 1;
 int h, 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移動的步數(shù):%d\t當(dāng)前得分:%d\n\t\t最高記錄:%d\n", cnt-1, score, max);
 Move();//保留棋盤 
 score += Get(p_cnt, score);//得分
 sign = If_move();//判斷棋盤是否有變動 
 if(Over() == 0){ 
 if(max < score){//打破記錄 
 Establish_game(name_max);//清除之前的記錄 
 Write_max(score);//保存此次記錄
 printf("\t\t恭喜您已打破記錄!\n"); 
 } 
 break;
 } 
 system("cls"); //清屏
 }
}
void Table()
{
 int h, l;
 for(h = 0; h < 4; h ++){
 if(h == 0){
 printf("\t\t\t┏━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┓\n");
 }
 else {
 printf("\t\t\t┣━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━┫\n");
 }
 printf("\t\t\t┃ ┃ ┃ ┃ ┃\n");
 for(l = 0; l < 4; l ++){
 if(a[h][l] == 0){//如果二維數(shù)組與棋盤對應(yīng)的位置為零,則不放入數(shù)據(jù) 
 if(l == 0){
  printf("\t\t\t┃ ");
 }
 else {
  printf("┃ ");
 }
 }
 else{//否則放入與二維數(shù)組對應(yīng)的數(shù)據(jù) 
 if(l == 0){
  printf("\t\t\t┃");
  box_color(a[h][l]);//判斷滑塊的數(shù)值,給對應(yīng)顏色 
  printf("%5d ", a[h][l]);
  color(0);//恢復(fù)白色背景 
 }
 else {
  printf("┃");
  box_color(a[h][l]);//判斷滑塊的數(shù)值,給對應(yīng)顏色 
  printf("%5d ", a[h][l]); 
  color(0);//恢復(fù)白色背景 
 }
 }
 }
 printf("┃\n");
 printf("\t\t\t┃ ┃ ┃ ┃ ┃\n");
 }
 printf("\t\t\t┗━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┛\n");
}
int Random_number1()/*隨機(jī)生成2 or 4*/
{ 
 int s;
 srand( time(NULL) ); 
 s = ((unsigned)rand() % 2);
 s = s == 0 ? 2 : 4;
 return s;
}
int Random_number2()/*隨機(jī)生成二維數(shù)組的下標(biāo)*/
{ 
 int x;
 x = ((unsigned)rand() % 4);
 return x;
}
int Get(int *p_cnt, int score)
{
 int h, l, t, sum = 0;
 char ch;
 ch = getch();//輸入字符 
 switch (ch){
 /*滑塊向上移動*/ 
 case 'w':
 case 'W':
 /*向上聚集數(shù)字*/
 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;
  }
  }
 }
 }
 /*豎直方向上,相鄰且相同的數(shù)字相加*/ 
 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];
  }
 }
 }
 /*向上聚集數(shù)字*/ 
 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': //存檔當(dāng)前游戲格局 
 Establish_file();//創(chuàng)建用于存檔的文件 
 Write_file(p_cnt, score);//調(diào)用存檔函數(shù) 
 break;
 case 'o':
 case 'O':
 sum = Read_file(p_cnt);//讀檔
 break;
 case 'p':
 case 'P':
 exit(0);//退出程序 
 default:
 break;
 }
 return sum;
}
void Move()
{
 int h, l;
 for(h = 0; h < 4; h ++){
 for(l = 0; l < 4; l ++){
 A[h][l] = a[h][l];
 }
 }
}
int If_move()
{
 int h, l, sign = 0;
 for(h = 0; h < 4; h ++){
 for(l = 0; l < 4; l ++){
 if(a[h][l] != A[h][l]){//未進(jìn)入條件框,說明滑塊沒有發(fā)生移動 
 sign = 1;
 goto out;
 }
 }
 }
 out:
 return sign;
}
int Over()
{
 int over = 0;
 int h, l;
 for(h = 0; h < 4; h ++){
 for(l = 0; l < 4; l ++){
 if(a[h][l] == 0){//有空格 
 over = 1;//游戲繼續(xù) 
 return 1; 
 }
 }
 }
 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;//游戲繼續(xù) 
  break;
 }
 else if(a[h][l] == a[h+1][l]){
  over = 1;//游戲繼續(xù) 
  break;
 }
 }
 if(over == 1){
 break;
 } 
 }
 }
 return over;//游戲結(jié)束 
}
void Establish_game()//創(chuàng)建文件 
{
 int h;
 if(h = fopen(name_max, "wb") == NULL){ //函數(shù)fopen()返回NULL則創(chuàng)建文件失敗 
 printf("\t\t創(chuàng)建文件失敗!程序即將自動退出 . . .\n");
 Sleep(3000);//睡眠3000毫秒,即停留3秒鐘 
 exit(0); //退出程序
 }
}
void Write_max(int score)//寫入文件 
{
 /*FILE *fp是指向文件的指針*/ 
 FILE *fp=fopen(name_max,"at+");// at+讀寫打開或著建立一個(gè)文本文件;允許讀寫。
 if(fp==NULL) //函數(shù)fopen()返回NULL則創(chuàng)建文件失敗
 {
 printf("\t\t保存最高分失敗!程序即將自動退出 . . .");
 Sleep(3000);//睡眠3000毫秒,即停留3秒鐘 
 exit(0); //退出程序
 }
 else{
 fprintf(fp, "%d", score);//將score的值寫入*pf指向的文件內(nèi) 
 }
 fclose(fp);//關(guān)閉*pf指向的文件 
}
int Read_max()//讀出文件 
{
 int max_score = 0;
 FILE *fp=fopen(name_max,"at+");// at+讀寫打開或著建立一個(gè)文本文件;允許讀寫。
 if(fp==NULL)
 {
 printf("\t\t讀取失敗!程序即將自動退出 . . .");
 Sleep(3000);//睡眠3000毫秒,即停留3秒鐘 
 exit(0); //退出程序
 }
 else{
 fscanf(fp, "%d", &max_score);//從*pf指向的文件內(nèi)數(shù)值賦值給max_score
 }
 fclose(fp);//關(guān)閉*pf指向的文件
 return max_score;//返回最高記錄的值 
}
void Establish_file()//創(chuàng)建文件 
{
 int h;
 if(h = fopen(name_file, "wb") == NULL){ //函數(shù)fopen()返回NULL則創(chuàng)建文件失敗 
 printf("\t\t創(chuàng)建文件失??!程序即將自動退出 . . .\n");
 Sleep(3000);//睡眠3000毫秒,即停留3秒鐘 
 exit(0); //退出程序
 }
}
void Write_file(int *p_cnt, int score) 
{
 int h, l;
 FILE *fp=fopen(name_file,"at+");// at+讀寫打開或著建立一個(gè)文本文件;允許讀寫。
 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);//關(guān)閉文件 
}
int Read_file(int *p_cnt)
{
 int h, l, score = 0;
 FILE *fp=fopen(name_file,"at+");// at+讀寫打開或著建立一個(gè)文本文件;允許讀寫。
 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); //關(guān)閉文件 
 return score;
} 
void again()//是否繼續(xù)游戲 
{
 printf("\t\t╔══════════════════════════════════════════════╗\n"); 
 printf("\t\t║  您已失敗  ║\n");
 printf("\t\t╟──────────────────────────────────────────────╢\n");
 printf("\t\t║是否繼續(xù):   ║\n");
 printf("\t\t║ ┌───┐  ║\n");
 printf("\t\t║ │ 1 │ 扶我起來,我還能再來一局! ║\n");
 printf("\t\t║ └───┘  ║\n");
 printf("\t\t║ ┌───┐  ║\n");
 printf("\t\t║ │ 2 │ 不了不了,我要學(xué)習(xí)! ║\n");
 printf("\t\t║ └───┘  ║\n");
 printf("\t\t╚══════════════════════════════════════════════╝\n");
 if(_getch() == '1'){
 system("cls");//清屏
 int h, 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游戲結(jié)束!\n");
 } 
}
int color(int c)
{
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
  BACKGROUND_INTENSITY |
  BACKGROUND_BLUE |
  BACKGROUND_RED |
  BACKGROUND_GREEN |
  c);
 return 0;
}
void box_color(int x)
{
 switch(x){
 case 2:
 color(8);
 break;
 case 4:
 color(0);
 break;
 case 8:
 color(2);
 break;
 case 16:
 color(6);
 break;
 case 32:
 color(10);
 break;
 case 64:
 color(3);
 break;
 case 128:
 color(9);
 break;
 case 256:
 color(11);
 break;
 case 512:
 color(5);
 break;
 case 1024:
 color(13);
 break;
 case 2048:
 color(12);
 break;
 default :
 color(4);
 break;
 }
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
 - 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘
 


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段
 - 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
 
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 08-05DEDE織夢data目錄下的sessions文件夾有什
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 01-11ajax實(shí)現(xiàn)頁面的局部加載
 - 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
 - 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
 - 04-02jquery與jsp,用jquery
 - 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
 - 01-10C#中split用法實(shí)例總結(jié)
 


