1. 程式人生 > >C語言在linux終端下實現2048小遊戲:第二版

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

linuxc語言利用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/ 原來的程式沒有註釋,最近這段時間在學習網路程式設計這塊,就在網上找了個程式來學習,第一次找的程式下載下來後,編譯沒通過,

linuxC語言__FILE__,__LINE__,FUNCTION__實現程式碼跟蹤除錯

__FILE__,__LINE__,FUNCTION__實現程式碼跟蹤除錯(linux下C語言程式設計 )先看下簡單的初始程式碼:注意其編譯執行後的結果。 [email protected]:~/cpropram/2# cat global.h //標頭檔案 #

C語言實現2048遊戲

給大一新生寫的一個小遊戲。 缺點:函式名稱和功能略微不對應,函式功能寫得比較亂,時間記錄有誤差,可擴充套件性弱。 優點:通過幾個配置陣列,將單位方塊移動的函式縮短到30行以內。 #include <stdio.h> #include <windows.h&