Linux下的curses屏幕游戏编程

来源:互联网 发布:创意营销网站知乎 编辑:程序博客网 时间:2024/05/01 19:30

学期末了,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;     } } //初始Simenvoid 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即可。

下面贴一张运行截图。

运行截图

原创粉丝点击