Linux下的curses屏幕游戏编程

学期末了,Unix/Linux课程也结了。老师让写个小游戏,用curses库控制屏幕。

经过各种途径找,也没有找到比较合适的。索性自己写一个,反倒省事。


下面是我写的简版大富翁游戏,第一次发,不知到要写什么,直接上代码啦~

/************************************
        Name:	Simen's lunch
        author:	Yimeng
        Date:	2013-5-13
************************************/

#include <stdio.h>
#include <curses.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <signal.h>

#define RIGHT COLS-1   		//当前屏幕最大水平范围
#define BOTTOM LINES-1 		//当前屏幕最大垂直范围
#define BOARD_LENGTH   5  	//Simen长度 
#define LEFT 0  			//当前屏幕的最左边 
#define TOP 0   			//当前屏幕的最上边 
char BLANK=' ';  			//覆盖食物走过的轨迹 

int level=1;				//等级
int left_board=20;			//挡板左侧坐标 
int right_board=25; 			//挡板右侧坐标 
int is_lose=0;
int delay=100;
int num=1;
int row=0;
int lastRow=0;

struct Food
{
	int y;
	char name;
};

struct Food food;
int point=0;

 //绘制得分窗口
void socrewin (void)
 {
     int i;
     move(7,RIGHT-13);
     addstr("Score :");
     move(7,RIGHT-5);
     printw(" %d",point);
     move(11,RIGHT-13);
     addstr("Level :");
     move(11,RIGHT-5);
     printw(" %d",level);
     for (i = 0; i <=BOTTOM; i += 1)
     {
         move(i,RIGHT-15);
         addstr("|");    
     }
 }    
 //菜单选项
int menu(void)
 {
     int ch;
     move(1,5);
     addstr("Author :");
     move(1,15);
	 attron(A_BOLD);
     addstr("Yimeng");
	 attroff(A_BOLD);
     move(2,5);
     addstr("Date   :");
     move(2,15);
	 attron(A_BOLD);
     addstr("2013-5-13");
     attroff(A_BOLD);
     move(6,24);
     attron(A_BOLD);
     addstr("Welcome to the Simen's lunch!");
     attroff(A_BOLD);
     move(9,30);
     addstr("1.  Start.");
     move(11,30);
     addstr("2.  Quit.");    
     ch=getch();
     switch(ch)
     {
         case '1':
             return 1;
         case '2':
             return 2;
     }
 }
 //初始Simen
void Simenwin(int left_board)
{
	int i;
	right_board=left_board+BOARD_LENGTH;
       for(i=left_board;i<=right_board;i++){  
        if(i==left_board){
			move(BOTTOM,i);
			addch('(');
			}
		else if(i==right_board){
			move(BOTTOM,i);
			addch(')');
			}
		else{
			move(BOTTOM,i);
			addch('_');
			}
    }
}
void Rand_char(void)
{
	srand((int)time(0));
	 food.name=rand()%25;
	 food.name+=65;
        srand((int)time(0));
        food.y=rand()%(RIGHT-16);
}
//吃到没有
void get_it()
{
	int j;
	if((food.y>=left_board)&&(food.y<=left_board+5))
	{
		point+=10;
		socrewin();
	}
	move(lastRow,food.y);
	addch(' ');	
        Simenwin(left_board);
        move(BOTTOM,RIGHT);
	refresh();
	Rand_char();
	lastRow=0;
	row=0;
}
  //食物初始化
void food_init(int signum)
 {
        signal(SIGALRM,food_init);
	move(lastRow,food.y);
	addch(' ');
        move(row,food.y);
	printw("%c",food.name);
        move(BOTTOM,RIGHT);
	refresh();
        lastRow=row;
	row++;
	if(row>BOTTOM)
	{
		get_it();
	}
 }
 //游戏运行
int gamerun(void)
 {
     int cmd	,i=0;
     int num=0;
     
     clear();
     Simenwin(20);
   
     socrewin();
     Rand_char();
     nodelay(stdscr,TRUE);
     refresh();
     
signal(SIGALRM,food_init);
  set_ticker(1000);

     while(1)
     {
        cmd=getch();
        if(cmd=='q'||cmd=='Q'||cmd==27) break;  //强制退出游戏
        
        if(cmd==KEY_LEFT){
			if(left_board>0){
				move(BOTTOM,right_board);
				addch(' ');
				right_board--;
				left_board--; 
				move(BOTTOM,left_board);
				Simenwin(left_board);
				move(BOTTOM,RIGHT);
				refresh();
			}
		}     
		//挡板右移
		else if(cmd==KEY_RIGHT){
			if(right_board<RIGHT){
				move(BOTTOM,left_board);
				addch(' ');
				if(right_board<RIGHT-16){
				right_board++;
				left_board++;}
				move(BOTTOM,right_board);
				Simenwin(left_board);
				move(BOTTOM,RIGHT);
				refresh();
			}
		}
		//给球加速
		else if(cmd==KEY_UP){   
			if(level<6){
			level++;   
			delay/=2;}  
			set_ticker(delay);
			socrewin();
		}
		//给球减速
		else if(cmd==KEY_DOWN){  
			if(level>1){
			level--;  
			delay*=2;  }
			set_ticker(delay);
			socrewin();
		}
    }
	sleep(1);
	refresh();
	return 0;
}  
     
 int main ()
 {
     initscr();
     noecho();
     crmode();  /*中断模式*/	
     keypad(stdscr,TRUE);
     refresh();

     switch(menu())
     {
         case 1:
			gamerun();
			clear();
			move(10,30);    
			addstr("Game Over! ");
			move(12,30);
			addstr("Score : ");
			move(12,35);
			printw("  %d",point);
			refresh();
			sleep(3);
			endwin();
			break;
         case 2:     
            clear();
			move(10,25);
			addstr("You quit the game successfully!");
			refresh();
			sleep(3);
			endwin();
            break;
         }
     return 0;
 }
 //设置定时器
int set_ticker(int n_msecs){
    struct itimerval new_timeset;     
    long n_sec,n_usecs;
    n_sec=n_msecs/1000;
    n_usecs=(n_msecs%1000)*1000L;
    new_timeset.it_interval.tv_sec=n_sec;
    new_timeset.it_interval.tv_usec=n_usecs;
    new_timeset.it_value.tv_sec=n_sec;
    new_timeset.it_value.tv_usec=n_usecs;
    return setitimer(ITIMER_REAL,&new_timeset,NULL); 
}


编译命令是 gcc -o XXX -l curses

我使用的是Ubuntu,没有curses库,安装命令是 sudo apt-get install libncurses5-dev

运行命令 ./XXX即可。

下面贴一张运行截图。

运行截图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值