`
steven-zhou
  • 浏览: 213306 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

一个能在Telnet或SSH终端玩的贪食蛇小游戏

阅读更多
//snake.h
#define SHM_KEY 1234

#define UP	119
#define DOWN	115
#define LEFT	 97
#define RIGHT	100
#define QUIT	122

#define direct	(*((int *)p_shm))
extern void *p_shm;
extern int v_speed;

extern void snake_init();
extern int snake_nextstep();

#include "snake.h"

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <curses.h>
#include <string.h>
#include <sys/types.h>

#define START_X 10
#define START_Y 10
#define INIT_SIZ 5
#define H_LEN	80	
#define V_LEN	35


int screen_arr[H_LEN * V_LEN];
int snake_len = 0;
extern int v_speed;

/* Snake Body Node */
typedef struct node{
	int pos_x;
	int pos_y;
	struct node *next;
	struct node *pre;
}BNode;

BNode *s_head, *s_end;

/************************************************
 *		functions declare
 ***********************************************/
extern void snake_init();

static void snake_display();
static inline void snake_feed();
static inline void snake_head_grow(int px, int py);
static inline void snake_tail_cut();

extern void snake_init()
{
	s_head = (BNode *)malloc(sizeof(BNode));
	s_head->pos_x = START_X;
	s_head->pos_y = START_Y;
	s_head->next = NULL;
	s_head->pre = NULL;
	s_end = s_head;
	screen_arr[START_X + START_Y * H_LEN] = 1;
	
	int i;
	for (i = 1; i < INIT_SIZ; i++) 
		snake_head_grow(START_X + i, START_Y);
	snake_feed();
	snake_display();
}

extern int snake_nextstep()
{
	int next_px = s_head->pos_x;
	int next_py = s_head->pos_y;

	switch (direct) {
		case UP: 	next_py--;	break;
		case RIGHT:	next_px++;	break;
		case DOWN:	next_py++;	break;
		case LEFT:	next_px--;	break;
	}

	int pos = next_px + next_py * H_LEN;

	/* grip itself */
	if (screen_arr[pos] == 1)
		return ERR;
	
	/* up against the wall */
	if (next_px < 0 || next_px >= H_LEN ||
	    next_py < 0 || next_py >= V_LEN)
		return ERR;
	
	int grow = 0;
	/* eat a food */
	if (screen_arr[pos] == 2) {
		grow = 1;
		snake_len++;
		snake_feed();
	}

	snake_head_grow(next_px, next_py);

	if (!grow) 
		snake_tail_cut();

	snake_display();
	return OK;
}

static void snake_display()
{
	printw("  			    Hungry Snake -- Enjoy it! :)\n");
	printw("  +---------------------------------------------"
                  "-----------------------------------+\n");
	
	int i, j;
	for (i = 0; i < V_LEN; i++){
		printw("  |");
		for(j = 0; j < H_LEN; j++) {
			int pos = i * H_LEN + j;
			printw("%c", screen_arr[pos] == 0 ? ' ' :
				    (screen_arr[pos] == 1) ? '#' : '$');
		}
		printw("|\n");
	}
	printw("  +---------------------------------------------"
                  "-----------------------------------+\n");
	printw("  Direction: %s\n", direct == UP ? "Up" : 
		(direct == DOWN ? "Down" : (direct == LEFT ? "Left" : "Right")));
	printw("  Scores: %d", snake_len);
	refresh();
}


/********************************************************
 *		 static functions
 ********************************************************/

static inline void snake_feed()
{
	int pos = rand() % (H_LEN * V_LEN);
	while (screen_arr[pos] == 1) 
		pos = rand() % (H_LEN * V_LEN);
	screen_arr[pos] = 2;
	v_speed -= 10;
}

static inline void snake_head_grow(int px, int py)
{
	BNode *p = (BNode *)malloc(sizeof(BNode));
	p->pos_x = px;
	p->pos_y = py;
	
	p->pre = NULL;
	p->next = s_head;
	s_head->pre = p;
	s_head = p;
	screen_arr[px + py * H_LEN] = 1;
}

static inline void snake_tail_cut()
{
	screen_arr[s_end->pos_x + s_end->pos_y * H_LEN] = 0;
	s_end = s_end->pre;
	free(s_end->next);
	s_end->next = NULL;
}

//usr_handler.c
#include "snake.h"

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <curses.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <time.h>

static void wait_user_handle();

void *p_shm = NULL;
int shmid = 0;;
int v_speed = 200;

int main(int argc, char *argv[])
{
	pid_t pid;
	initscr();
	if ((pid = fork()) == 0) {
		sleep(2);
		shmid =
		    shmget((key_t) SHM_KEY, sizeof(int), 0666 | IPC_CREAT);
		p_shm = shmat(shmid, (void *) 0, 0);
		struct timespec slp = { (time_t) 0, 1000000 * v_speed };
		snake_init();
		while (true) {
			if (direct == QUIT)
				break;
			clear();
			snake_nextstep();	/* sleep specified nanoseconds and continue to run. */
			slp.tv_nsec = 1000000 * v_speed;
			nanosleep(&slp, NULL);
		}
		shmdt(p_shm);
	} else {		/* create shared memory by parent process. */
		shmid =
		    shmget((key_t) SHM_KEY, sizeof(int), 0666 | IPC_CREAT);
		if (shmid == -1) {
			printw("shmget failed!\n");
			exit(EXIT_FAILURE);
		}
		p_shm = shmat(shmid, (void *) 0, 0);
		wait_user_handle();
		waitpid(pid, NULL, 0);	/* destroy shared memory by parent process. */
		shmdt(p_shm);
		shmctl(shmid, IPC_RMID, 0);
		endwin();
	} exit(EXIT_SUCCESS);
} 

static void wait_user_handle()
{
	int i;
	int run = true;

	int UP_DOWN = UP + DOWN;
	int LEFT_RIGHT = LEFT + RIGHT;
	int sum;
	while (run) {
		noecho();
		i = getch();
		echo();
		switch (i) {
		case UP:
		case DOWN:
		case LEFT:
		case RIGHT:
			sum = i + direct;
			if(sum != UP_DOWN && sum != LEFT_RIGHT)
				direct = i;
			break;
		case QUIT:
			run = false;
			direct = i;
			break;
		}
	}
}
分享到:
评论

相关推荐

    C代码实现贪食蛇小游戏

    C语言实现贪食蛇小游戏。C语言实现贪食蛇小游戏。C语言实现贪食蛇小游戏。C语言实现贪食蛇小游戏。C语言实现贪食蛇小游戏。

    贪食蛇小游戏

    【贪食蛇小游戏】是一款基于C#编程语言开发的Windows桌面游戏,对于初学者来说,它是一个极好的学习资源,可以深入理解C#的基础组件和编程逻辑。这个游戏的经典玩法是控制一条不断移动的蛇,通过吃食物来增长,同时...

    java小游戏贪食蛇

    在这个项目中,开发者通过控制台或图形用户界面(GUI)实现了一个简单的游戏环境,玩家可以通过键盘输入来控制蛇的移动,吃到食物后蛇会变长,碰到边界或自身则游戏结束。 首先,让我们深入了解一下Java编程语言的...

    贪食蛇小游戏(Linux)

    【贪食蛇小游戏(Linux)】是一款在Linux操作系统上用C语言编写的经典游戏程序,其设计灵感来源于经典的街机游戏“贪食蛇”。通过这个项目,我们可以深入了解C语言编程基础,以及如何在Linux环境下进行软件开发。下面...

    一个MFC贪食蛇小游戏

    【MFC贪食蛇小游戏】是一款基于Microsoft Foundation Classes (MFC)框架开发的简单娱乐程序,它是初学者学习VC++编程的一个经典实例。MFC是一个C++类库,它为Windows应用程序开发提供了一种结构化的、面向对象的方法...

    java贪食蛇游戏.zip

    java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏 java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏 java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏...

    简单创意的html5贪食蛇小游戏代码

    本项目以"简单创意的html5贪食蛇小游戏代码"为主题,将介绍如何使用HTML5、CSS3和JavaScript来构建一个在线版本的贪食蛇游戏。 首先,我们需要理解HTML5中的Canvas元素。Canvas是HTML5中用于绘制图形的一个二维绘图...

    C# 经典小游戏 贪食蛇

    在本文中,我们将深入探讨如何使用C#编程语言来实现一个经典的贪食蛇游戏。C#是一种面向对象的、类型安全的编程语言,由微软公司开发,广泛应用于Windows平台和跨平台开发,如Unity游戏引擎。贪食蛇游戏是许多初学者...

    一个简单的贪食蛇小游戏程序

    本文将围绕“一个简单的贪食蛇小游戏程序”进行详细讲解,主要探讨如何使用C++编程语言,结合Microsoft Foundation Classes (MFC)库来实现这个游戏。 首先,MFC是微软为Windows开发环境提供的一套面向对象的类库,...

    一个简单有趣的贪食蛇小游戏.zip

    本项目提供了一个简单的贪食蛇游戏实现,让我们一起来深入探讨其中的技术细节。 1. **游戏结构** 游戏通常由多个组件构成,本项目中的文件名揭示了游戏的核心部分。`SnakeGame.class`是游戏主类,包含了游戏逻辑和...

    C# 编写的贪食蛇小游戏

    通过这个C#编写的贪食蛇小游戏,学生不仅可以巩固C#基础知识,还能锻炼问题解决能力和逻辑思维能力,为未来的游戏开发打下坚实基础。同时,这也是一个动手实践的好机会,能够提升编程实战经验。

    mfc版 贪食蛇小游戏 代码

    可以在游戏区域中选择一个未被蛇占据的格子作为食物的位置。考虑到游戏的公平性,食物不能生成在蛇身上。 最后,为了提高用户体验,我们还需要实现一些附加功能,如计分系统、游戏暂停与继续、重新开始等。这些可以...

    C++ 编写的贪食蛇小游戏

    7. **多线程编程**:虽然贪食蛇小游戏通常在单线程环境下运行,但理解如何在多线程环境下处理并发问题也是C++编程的一个重要方面。例如,可以考虑将游戏逻辑和UI更新放在两个不同的线程中,以避免阻塞。 8. **调试...

    QtCreator动态链接库包含贪食蛇小游戏

    在本主题中,我们将深入探讨如何利用Qt Creator结合动态链接库来构建一个贪食蛇小游戏。 Qt框架是一个C++库,提供了一系列丰富的API,涵盖了图形用户界面、网络通信、数据库连接等多个方面。在"Qt-4.85"版本中,...

    java制作贪食蛇,贪食蛇小游戏

    在本项目中,我们探索的是如何使用Java编程语言来实现一个经典的计算机游戏——贪食蛇。这个项目非常适合Java初学者,因为它涵盖了基本的编程概念,如控制结构、数据结构以及对象导向编程。以下是对这个“java制作...

    基于MFC的贪食蛇小游戏

    【标题】"基于MFC的贪食蛇小游戏"是一个使用Microsoft Foundation Classes (MFC)库开发的编程项目,旨在创建一个经典游戏——贪食蛇。MFC是微软为Windows应用程序开发提供的一组C++类库,它使得开发者可以更方便地...

Global site tag (gtag.js) - Google Analytics