C語言在linux終端下實現2048小遊戲:第二版
原來我轉載過一個機遇ncurses的2048,今天無聊自己手寫了一個,看下我的目錄結構:
$ tree ../2048/
../2048/
├── 2048.c
├── 2048.h
└── main.c
0 directories, 3 files
2048.h
#ifndef _2048_H #define _2048_H #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <curses.h> #include <time.h> #include <math.h> #include <termios.h> #define VK_LEFT (97) #define VK_UP (119) #define VK_RIGHT (100) #define VK_DOWN (115) #define VK_QUIT (113) int table[16]; int init(); void show(); int random_position(); void handle(char VK); int check_zero(); int check_alive(); char getch_from_terminal(); #endif /*<_2048_H>*/
2048.c
#include "2048.h" int init() { int id; for(id=0; id<16; id++) { table[id] = 0; } table[random_position()] = 1; return 0; } void show() { system("clear"); printf("\n\n"); int ix, iz, id; char ch; for(ix=0; ix<4; ix++) { for(iz=0; iz<4; iz++) { id = iz*4 + ix; printf("%7d", table[id]); } printf("\n\n"); } if(-1 == check_alive()) { printf("You die!\n"); printf("press <y> to play, <n> to quit\n"); switch_ch: ch = getchar(); switch(ch) { case 'y': init(); show(); break; case 'n': printf("Goodbye! Have a good day!\n"); exit(1); break; default: goto switch_ch; break; } } } int random_position() { srand( (unsigned)time( NULL ) ); int id; if(0 == check_zero()) { while(1) { id = rand()%16; if(table[id] == 0) { return id; } } } } int check_zero() { int id, i, j, ij; for(id=0; id<16; id++) { if(table[id] != 0) { if(id == 15) { return -1; } continue; } else { return 0; } } } int check_alive() { int id, ix, iz; if(table[0] == table[1] || table[0] == table[4] || table[3] == table[2] || table[3] == table[7] || table[12] == table[13] || table[12] == table[8] || table[15] == table[14] || table[15] == table[11] || table[2] == table[3] || table[4] == table[8] || table[7] == table[11] || table[13] == table[14]) { return 0; } for(ix=0; ix<4; ix++) { for(iz=0; iz<4; iz++) { id = ix*4+iz; if(table[id] == 0) { return 0; } if(ix >= 1 && ix <= 2 && iz >=1 && iz <= 2) { if(table[id] == table[id-1]) { return 0; } if(table[id] == table[id+1]) { return 0; } if(table[id] == table[id-4]) { return 0; } if(table[id] == table[id+4]) { return 0; } } } } return -1; } void handle(char VK) { int ix, iz, i, id; switch(VK) { case VK_UP: for(ix=0; ix<4; ix++) { loop_VK_UP_1: for(iz=0; iz<4; iz++) { if(table[ix*4+iz] == 0) { for(i=iz; i<4; i++) { if(i==3) { table[ix*4+i] = 0; } else { table[ix*4+i] = table[ix*4+i+1]; } } } } for(iz=0; iz<4; iz++) { if(table[ix*4+iz] != 0) { for(i=0; i<iz; i++) { if(table[ix*4+i] == 0) { goto loop_VK_UP_1; } } } } loop_VK_UP_2: for(iz=0; iz<3; iz++) { if(table[ix*4+iz] == table[ix*4+iz+1]) { table[ix*4+iz] = table[ix*4+iz] + table[ix*4+iz+1]; for(i=iz+1; i<4; i++) { if(i==3) { table[ix*4+i] = 0; } else { table[ix*4+i] = table[ix*4+i+1]; } } } } for(iz=0; iz<3; iz++) { if(table[ix*4+iz] != 0 && table[ix*4+iz] == table[ix*4+iz+1]) { goto loop_VK_UP_2; } } } table[random_position()] = 1; break; case VK_DOWN: for(ix=0; ix<4; ix++) { loop_VK_DOWN_1: for(iz=3; iz>=0; iz--) { if(table[ix*4+iz] == 0) { for(i=iz; i>=0; i--) { if(i==0) { table[ix*4+i] = 0; } else { table[ix*4+i] = table[ix*4+i-1]; } } } } for(iz=3; iz>=0; iz--) { if(table[ix*4+iz] != 0) { for(i=3; i>iz; i--) { if(table[ix*4+i] == 0) { goto loop_VK_DOWN_1; } } } } loop_VK_DOWN_2: for(iz=3; iz>=1; iz--) { if(table[ix*4+iz] == table[ix*4+iz-1]) { table[ix*4+iz] = table[ix*4+iz] + table[ix*4+iz-1]; for(i=iz-1; i>=0; i--) { if(i==0) { table[ix*4+i] = 0; } else { table[ix*4+i] = table[ix*4+i-1]; } } } } for(iz=3; iz>=1; iz--) { if(table[ix*4+iz] != 0 && table[ix*4+iz] == table[ix*4+iz-1]) { goto loop_VK_DOWN_2; } } } table[random_position()] = 1; break; case VK_LEFT: for(iz=0; iz<4; iz++) { loop_VK_LEFT_1: for(ix=0; ix<4; ix++) { if(table[ix*4+iz] == 0) { for(i=ix; i<4; i++) { if(i==3) { table[i*4+iz] = 0; } else { table[i*4+iz] = table[(i+1)*4+iz]; } } } } for(ix=0; ix<4; ix++) { if(table[ix*4+iz] != 0) { for(i=0; i<ix; i++) { if(table[i*4+iz] == 0) { goto loop_VK_LEFT_1; } } } } loop_VK_LEFT_2: for(ix=0; ix<3; ix++) { if(table[ix*4+iz] == table[(ix+1)*4+iz]) { table[ix*4+iz] = table[ix*4+iz] + table[(ix+1)*4+iz]; for(i=ix+1; i<4; i++) { if(i==3) { table[i*4+iz] = 0; } else { table[i*4+iz] = table[(i+1)*4+iz]; } } } } for(ix=0; ix<3; ix++) { if(table[ix*4+iz] != 0 && table[ix*4+iz] == table[(ix+1)*4+iz]) { goto loop_VK_LEFT_2; } } } table[random_position()] = 1; break; case VK_RIGHT: for(iz=0; iz<4; iz++) { loop_VK_RIGHT_1: for(ix=3; ix>=0; ix--) { if(table[iz+ix*4] == 0) { for(i=ix; i>=0; i--) { if(i==0) { table[iz+i*4] = 0; } else { table[iz+i*4] = table[iz+(i-1)*4]; } } } } for(ix=3; ix>=0; ix--) { if(table[iz+ix*4] != 0) { for(i=3; i>ix; i--) { if(table[iz+i*4] == 0) { goto loop_VK_RIGHT_1; } } } } loop_VK_RIGHT_2: for(ix=3; ix>=1; ix--) { if(table[iz+ix*4] == table[iz+(ix-1)*4]) { table[iz+ix*4] = table[iz+ix*4] + table[iz+(ix-1)*4]; for(i=ix-1; i>=0; i--) { if(i==0) { table[iz+i*4] = 0; } else { table[iz+i*4] = table[iz+(i-1)*4]; } } } } for(ix=3; ix>=1; ix--) { if(table[iz+ix*4] != 0 && table[iz+ix*4] == table[iz+(ix-1)*4]) { goto loop_VK_RIGHT_2; } } } table[random_position()] = 1; break; default: break; } } char getch_from_terminal() /*https://blog.csdn.net/Timsley/article/details/51424068*/ { FILE *input; FILE *output; struct termios initial_settings, new_settings; int inputString; input = fopen("/dev/tty", "r"); output = fopen("/dev/tty", "w"); if(!input || !output) { fprintf(stderr, "Unable to open /dev/tty\n"); exit(1); } tcgetattr(fileno(input), &initial_settings); new_settings = initial_settings; new_settings.c_lflag &= ~ICANON; new_settings.c_lflag &= ~ECHO; new_settings.c_cc[VMIN] = 1; new_settings.c_cc[VTIME] = 0; new_settings.c_lflag &= ~ISIG; if(tcsetattr(fileno(input), TCSANOW, &new_settings) != 0) { fprintf(stderr, "Could not set attributes\n"); } //while(inputString != 'q') //{ //do //{ inputString = fgetc(input); //}while(inputString == '\n' || inputString == '\r'); //return (char )inputString; //} tcsetattr(fileno(input), TCSANOW, &initial_settings); return (char)inputString; }
main.c
#include "2048.h" /* 64 32 16 8 32 16 8 4 16 8 4 2 8 4 2 1 You die! press <y> to play, <n> to quit */ int main() { system("clear"); init(); show(); char ch; while((ch = getch_from_terminal()) != VK_QUIT) //while((ch = getchar()) != VK_QUIT) { switch(ch) { case VK_UP: handle(VK_UP); show(); break; case VK_DOWN: handle(VK_DOWN); show(); break; case VK_LEFT: handle(VK_LEFT); show(); break; case VK_RIGHT: handle(VK_RIGHT); show(); break; case 'q': exit(1); break; default: printf("<w><s><a><d>\n"); break; } } return 0; }
編譯執行:
$ gcc main.c -I . 2048.c
$ ./a.exe
1 2 8 1
32 16 4 2
1 64 32 8
2 1 4 2
You die!
press <y> to play, <n> to quit
Goodbye! Have a good day!
[email protected] ~/2048
相關推薦
C語言在linux終端下實現2048小遊戲:第二版
原來我轉載過一個機遇ncurses的2048,今天無聊自己手寫了一個,看下我的目錄結構: $ tree ../2048/ ../2048/ ├── 2048.c ├── 2048.h └── main.c 0 directories, 3 files 2048.h
C++實現2048小遊戲(控制檯版的)
無聊,在公司寫了個2048小遊戲的程式,聊以自娛。(事實是我手機壞了,沒得玩)。 很簡單,直接上程式碼了。 #include <iostream> #include <windows.h> #include <ctime> using
C語言介面實現2048小遊戲
這是我在大一第二學期(兩年前)為了參加比賽,自學後寫的一個Dome,拿出來和大家分享一下,程式碼為兩年前的程式碼,未改動,優化以及各式可能很一般,請見諒。 #include "stdio.h" #include "stdlib.h" #include "time.h" #d
linux終端下實現的conio.h中的getch()功能函式
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <termios.h> char
C語言linux環境下使用gettimeofday函式得到程式執行時間
編寫的一個打字遊戲中需要計算程式的執行時間,通過網上查閱資料發現大多數都是說通過clock()函式來獲取時間,之後做差從而的到程式的執行時間。但是在linux中測試以後發現結果是0,並不能得到程式的執行時間。 請教老師後得知可以通過引用標頭檔案time.h,使
C#實現2048小遊戲
要實現這個簡單的小遊戲主要在於實現一個方向移動 數字的移動及合併該如何處理 然後其它方向的邏輯是相同的 我做的這個基本功能實現了 主要分為三個類 Box.cs格子類(一些格子裡儲存的資料,行下標,列下標,是否合併過的開關。。) Grid.cs網格類(主要演算法在裡
C++實現2048小遊戲
程式碼如下: #define _CRT_SECURE_NO_WARNINGS//去掉編譯器內部擴增問題#include<stdio.h>#include<stdlib.h>#include<math.h>#include<graphics.h>//需要下載圖形庫
用C語言寫一個簡單的掃雷小遊戲
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <time.h> /* 用 C 語言寫一個簡單的掃雷遊戲 */ // 1.寫一個遊戲選單 M
JQuery初體驗-JavaScript實現2048小遊戲PC端
目錄 效果圖 遊戲頁面 遊戲頁面樣式 遊戲基礎邏輯 遊戲動畫邏輯 遊戲主邏輯 遊戲互動邏輯 效果圖: 遊戲頁面: <!DOCTYPE html> <html lang="en"> <head> <
C語言編寫的坦克大戰exe小遊戲
C語言編寫的坦克大戰exe小遊戲! (含有部分C++函式,不過不需要知道實現細節,主要用於鍵盤讀取等) 適合初學者學習的坦克大戰程式碼,無圖片,遊戲全部功能畫面顯示全部由 printf 列印的哦! C++視訊跟筆記都是全網最新最全的,加群玖四捌,玖伍四,四捌四 C語言/C艹程式設計入
c語言控制檯的一個貪吃蛇小遊戲
#include<stdio.h> #include<Windows.h> #include<conio.h> #include<stdlib.h> #include<time.h> #define HEAD 1
java實現2048小遊戲
學習Java基礎有一段時間了,一直想做個小的桌面程式練下手,最近自己有點時間用Java寫了一個2048的桌面程式,和大家分享一下!!! 遊戲效果展示: 1、設計思想 AppFrame.java遊戲的啟動類,只調用了一個MainFrame的構造方法 MainFrame.ja
js實現2048小遊戲
最近同學參加宣講會,說有個公司要求是寫一個2048小遊戲,參考了一點網上的程式碼以後,自己寫了一個。 寫的思路如下: 1.設定好HTML佈局。大盒子巢狀小盒子,這塊沒什麼可說的。 2.實現遊戲初始化,生成一開始的兩個小塊。這裡就要實現生成隨機2或4,還
學Android--實現2048小遊戲
1、遊戲佈局(activity_main.xml) 首先在xml檔案中實現遊戲的整體佈局 (1)新增兩個TextView用來顯示分數 <LinearLayout android:layout_width="match_pare
C語言實現簡易2048小遊戲
blog 而在 而是 null 移動 是我 我們 空指針 主體 一直很喜歡玩這個小遊戲,簡單的遊戲中包含運氣與思考與策略,喜歡這種簡約又不失內涵的遊戲風格。於是萌生了用C語言實現一下的想法。 具體代碼是模仿這個:https://www.cnblogs.com/judgeyo
linux下c語言利用iconv函式實現utf-8轉unicode
由於專案中需要轉換原生unicode到ascii的功能,本來想的用的是linux或者windows自帶的寬位元組轉成窄位元組的函式,但由於本身使用了apr_iconv庫,所以直接使用庫函式來解決。 期間碰到了庫函式使用一直出錯的問題,一
C語言實現最簡單的2048小遊戲
網上解釋很多了,直接上程式碼吧,這個功能很簡單,易於學習,後期有時間會完善功能 #include<stdio.h> #include<stdlib.h> #include<string.h> #define Key_Up 0x4800
Linux 下c語言ftp伺服器簡單實現
這個程式轉載自http://aijiekj.blog.163.com/blog/static/12986678920112321853230/ 原來的程式沒有註釋,最近這段時間在學習網路程式設計這塊,就在網上找了個程式來學習,第一次找的程式下載下來後,編譯沒通過,
linux下C語言__FILE__,__LINE__,FUNCTION__實現程式碼跟蹤除錯
__FILE__,__LINE__,FUNCTION__實現程式碼跟蹤除錯(linux下C語言程式設計 )先看下簡單的初始程式碼:注意其編譯執行後的結果。 [email protected]:~/cpropram/2# cat global.h //標頭檔案 #
C語言實現的2048小遊戲
給大一新生寫的一個小遊戲。 缺點:函式名稱和功能略微不對應,函式功能寫得比較亂,時間記錄有誤差,可擴充套件性弱。 優點:通過幾個配置陣列,將單位方塊移動的函式縮短到30行以內。 #include <stdio.h> #include <windows.h&