基于curses库实现弹球游戏
在网上找到,某人在基于Linux终端,用curses库实现的弹球游戏。本人曾经也做过五子棋游戏,分在其它文章中分享。
/* *基于curses库弹球游戏,编译gccxxx.c-lcurses */ #include#include #include #defineRIGHTCOLS-1/*球所能到达的当前屏幕最大水平范围*/ #defineBOTTOMLINES-1/*球所能到达的当前屏幕最大垂直范围*/ #defineBOARD_LENGTH10/*挡板长度*/ #defineLEFT0/*当前屏幕的最左边*/ #defineTOP0/*当前屏幕的最上边*/ charBALL='O';/*球的形状*/ charBLANK='';/*覆盖球走过的轨迹*/ intleft_board;/*挡板左侧坐标*/ intright_board;/*挡板右侧坐标*/ intis_lose=0; inthdir;/*控制球水平运动的变量*/ intvdir;/*控制球垂直运动的变量*/ intpos_X;/*球的横坐标*/ intpos_Y;/*球的纵坐标*/ intdelay=100; voidmoveBall(); voidinit(); voidcontrol(); intmain() { //初始化curses initscr(); crmode();/*中断模式*/ noecho();/*关闭回显*/ move(6,28); attron(A_BOLD); addstr("WelcometotheBallGame!"); move(8,20); attroff(A_BOLD); addstr("Help:"); move(9,23); addstr("'N':Startanewgame."); move(10,23); addstr("'Q':Quitgame."); move(11,23); addstr("'KEY_LEFT':Controlbaffleleftshift."); move(12,23); addstr("'KEY_RIGHT':Controlbafflerightshift."); move(13,23); addstr("'KEY_UP':Controloftheballspeed."); move(14,23); addstr("'KEY_DOWN':Controloftheballreducer."); intflag=1; charchoice; move(16,24); addstr("Pleasechooseyourchoice!(n/q):"); refresh(); choice=getch(); while(flag){ if(choice=='q'||choice=='Q'||choice=='n'||choice=='N') flag=0; elsechoice=getch(); } if(choice=='n'||choice=='N'){/*开始游戏*/ clear(); move(10,25); addstr("BallGamewillstart!Areyouread?"); refresh(); sleep(3); control(); } elseif(choice=='q'||choice=='Q'){/*退出游戏*/ clear(); move(10,25); addstr("Youquitthegamesuccessfully!"); refresh(); sleep(3); endwin(); } endwin();/*结束curses*/ return0; } voidinit(){ inti,j; clear(); if(start_color()==OK){/*改变球和挡板的颜色*/ attron(A_BOLD);/*打开粗体*/ init_pair(1,COLOR_YELLOW,COLOR_BLACK); attron(COLOR_PAIR(1)); } //初始球 pos_X=22;/*球初始的横坐标*/ pos_Y=BOTTOM-1;/*球初始的纵坐标*/ //初始化球的运动方向,朝右上方运动 hdir=1; vdir=-1; //初始挡板 left_board=20; right_board=left_board+BOARD_LENGTH; for(i=left_board;i<=right_board;i++){/*显示挡板*/ move(BOTTOM,i); addch('-'); } //初始刷新时间 signal(SIGALRM,moveBall); set_ticker(delay); keypad(stdscr,TRUE);/*打开keypad键盘响应*/ attroff(A_BLINK);/*关闭A_BLINK属性*/ is_lose=0; move(pos_Y,pos_X); addch(BALL); move(LINES-1,COLS-1); refresh(); usleep(100000);/*睡眠*/ move(LINES-1,COLS-1); refresh(); } voidmoveBall(){ if(is_lose)return; signal(SIGALRM,moveBall); move(pos_Y,pos_X); addch(BLANK); pos_X+=hdir; pos_Y+=vdir; //改变球的方向时 if(pos_X>=RIGHT){/*当球横坐标大于右边边缘时,球反弹朝左运动*/ hdir=-1; beep();/*球撞墙时,发出声音*/ } if(pos_X<=LEFT){/*当球横坐标大于左边边缘时,球反弹朝右运动*/ hdir=1; beep();/*球撞墙时,发出声音*/ } if(pos_Y<=TOP){/*当球纵坐标大于顶部边缘时,球反弹朝下运动*/ vdir=1; beep();/*球撞墙时,发出声音*/ } //当球在底部的时候进行额外的处理 if(pos_Y>=BOTTOM-1){ if(pos_X>=left_board&&pos_X<=right_board)/*球在挡板处*/ vdir=-1; else{/*球不在挡板处*/ is_lose=1; move(pos_Y,pos_X); addch(BALL); move(LINES-1,COLS-1); refresh(); usleep(delay*1000);/*睡眠*/ move(pos_Y,pos_X); addch(BLANK); pos_X+=hdir; pos_Y+=vdir; move(pos_Y,pos_X); addch(BALL); move(LINES-1,COLS-1); refresh(); } } //不改变球的方向时 move(pos_Y,pos_X); addch(BALL); move(LINES-1,COLS-1); refresh(); } voidcontrol(){ init(); intcmd; while(1) { if(!is_lose){ 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); addch('-'); move(BOTTOM,RIGHT); refresh(); } } //挡板右移 elseif(cmd==KEY_RIGHT){ if(right_board 用gccBounceBall.c-lcurses编译后,生成BounceBall.out,运行./BounceBall.out,游戏截图如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。