学期末了,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即可。
下面贴一张运行截图。