//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;
}
}
}
分享到:
- 2008-10-23 23:49
- 浏览 1214
- 评论(0)
- 论坛回复 / 浏览 (0 / 2163)
- 查看更多
相关推荐
C语言实现贪食蛇小游戏。C语言实现贪食蛇小游戏。C语言实现贪食蛇小游戏。C语言实现贪食蛇小游戏。C语言实现贪食蛇小游戏。
【贪食蛇小游戏】是一款基于C#编程语言开发的Windows桌面游戏,对于初学者来说,它是一个极好的学习资源,可以深入理解C#的基础组件和编程逻辑。这个游戏的经典玩法是控制一条不断移动的蛇,通过吃食物来增长,同时...
在这个项目中,开发者通过控制台或图形用户界面(GUI)实现了一个简单的游戏环境,玩家可以通过键盘输入来控制蛇的移动,吃到食物后蛇会变长,碰到边界或自身则游戏结束。 首先,让我们深入了解一下Java编程语言的...
【贪食蛇小游戏(Linux)】是一款在Linux操作系统上用C语言编写的经典游戏程序,其设计灵感来源于经典的街机游戏“贪食蛇”。通过这个项目,我们可以深入了解C语言编程基础,以及如何在Linux环境下进行软件开发。下面...
【MFC贪食蛇小游戏】是一款基于Microsoft Foundation Classes (MFC)框架开发的简单娱乐程序,它是初学者学习VC++编程的一个经典实例。MFC是一个C++类库,它为Windows应用程序开发提供了一种结构化的、面向对象的方法...
java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏 java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏 java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏...
本项目以"简单创意的html5贪食蛇小游戏代码"为主题,将介绍如何使用HTML5、CSS3和JavaScript来构建一个在线版本的贪食蛇游戏。 首先,我们需要理解HTML5中的Canvas元素。Canvas是HTML5中用于绘制图形的一个二维绘图...
在本文中,我们将深入探讨如何使用C#编程语言来实现一个经典的贪食蛇游戏。C#是一种面向对象的、类型安全的编程语言,由微软公司开发,广泛应用于Windows平台和跨平台开发,如Unity游戏引擎。贪食蛇游戏是许多初学者...
本文将围绕“一个简单的贪食蛇小游戏程序”进行详细讲解,主要探讨如何使用C++编程语言,结合Microsoft Foundation Classes (MFC)库来实现这个游戏。 首先,MFC是微软为Windows开发环境提供的一套面向对象的类库,...
本项目提供了一个简单的贪食蛇游戏实现,让我们一起来深入探讨其中的技术细节。 1. **游戏结构** 游戏通常由多个组件构成,本项目中的文件名揭示了游戏的核心部分。`SnakeGame.class`是游戏主类,包含了游戏逻辑和...
通过这个C#编写的贪食蛇小游戏,学生不仅可以巩固C#基础知识,还能锻炼问题解决能力和逻辑思维能力,为未来的游戏开发打下坚实基础。同时,这也是一个动手实践的好机会,能够提升编程实战经验。
可以在游戏区域中选择一个未被蛇占据的格子作为食物的位置。考虑到游戏的公平性,食物不能生成在蛇身上。 最后,为了提高用户体验,我们还需要实现一些附加功能,如计分系统、游戏暂停与继续、重新开始等。这些可以...
7. **多线程编程**:虽然贪食蛇小游戏通常在单线程环境下运行,但理解如何在多线程环境下处理并发问题也是C++编程的一个重要方面。例如,可以考虑将游戏逻辑和UI更新放在两个不同的线程中,以避免阻塞。 8. **调试...
在本主题中,我们将深入探讨如何利用Qt Creator结合动态链接库来构建一个贪食蛇小游戏。 Qt框架是一个C++库,提供了一系列丰富的API,涵盖了图形用户界面、网络通信、数据库连接等多个方面。在"Qt-4.85"版本中,...
在本项目中,我们探索的是如何使用Java编程语言来实现一个经典的计算机游戏——贪食蛇。这个项目非常适合Java初学者,因为它涵盖了基本的编程概念,如控制结构、数据结构以及对象导向编程。以下是对这个“java制作...
【标题】"基于MFC的贪食蛇小游戏"是一个使用Microsoft Foundation Classes (MFC)库开发的编程项目,旨在创建一个经典游戏——贪食蛇。MFC是微软为Windows应用程序开发提供的一组C++类库,它使得开发者可以更方便地...