标题:大家一起来,打地鼠
只看楼主
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
结帖率:100%
 问题点数:0 回复次数:5 
大家一起来,打地鼠
无聊编了个打地鼠的字符简易小游戏,与大家一起分享
这个游戏需要 SDL 的支持,用 SDL 检测按键还有定时器确是比较方便阿(不过这个小游戏只用到了定时器)
还有一个小缺陷,因为是个简易版就懒得搞了,就是按键之后还得再按下回车,不过“有条件的同学”可以把 getchar 换成 getch 就 OK 了
还有 clear_screen,windows 下的同学需要修改一下 system ("cls");
小游戏,结构简单,不多说了,上代码

程序代码:
#include "stdlib.h"
#include "stdio.h"
#include "SDL2/SDL.h"

struct map
{
        char state[3][3];               //state of every cave
};
struct map map = {{0, 0, 0, 0, 0, 0, 0, 0, 0}};

void clear_screen (void)
{
        system ("clear");               //clear the screen, can't use gotoxy
}

void draw_map (struct map *map)         //use pointer can save space
{
        clear_screen ();

        int i,j;
        for (i=0; i<3; i++)
        {
                for (j=0; j<3; j++)
                {
                        if ((*map).state[i][j])                 //map[y][x]
                        {
                                printf ("%c ", '$');            //use $ represent mouse
                        }
                        else
                        {
                                printf ("%c ", '0');
                        }
                }
                printf ("\n");
        }
}

void change_state (struct map *map, int pos)            //pos range [0, 8]
{
        int x, y;
        x = pos%3;
        y = pos/3;

        (*map).state[y][x] = !(*map).state[y][x];
}

int get_state (struct map *map, int pos)                //pos range [0, 8]
{
        int x, y;
        x = pos%3;
        y = pos/3;

        return (*map).state[y][x];
}

int judge (struct map *map)
{
        int i,j;
        for (i=0; i<3; i++)
        {
                for (j=0; j<3; j++)
                {
                        if ((*map).state[i][j])
                        {
                                return 1;
                        }
                }
        }

        return 0;
}

void over (void)
{
        printf ("Game Over");
        exit (0);
}

Uint32 SDL_callback (Uint32 interval, struct map *map)
{
        if (judge(map))
        {
                over ();
        }
        else
        {
                change_state (map, rand()%9);
                draw_map (map);
                return interval;
        }
}

/* change         7 8 9 to 1 2 3

 *                4 5 6    4 5 6

 *                1 2 3    7 8 9

 */
void change_key (int *key)              //change the key to adapt the program
{
        switch (*key)
        {
                case 7: *key=1; break;
                case 8: *key=2; break;
                case 9: *key=3; break;
                case 1: *key=7; break;
                case 2: *key=8; break;
                case 3: *key=9; break;
        }
}

int main (void)
{
        int key;
        SDL_TimerID timer;

        SDL_Init (SDL_INIT_TIMER);

        change_state (&map, rand()%9);
        draw_map (&map);

        timer = SDL_AddTimer (2000, (SDL_TimerCallback)SDL_callback, &map);

        while (key = getchar ())
        {
                //handle the key
                if ((key<'1') || (key>'9'))
                {
                        continue;
                }
                key -= 0x30;
                change_key (&key);
                key -= 1;

                if (get_state (&map, key))
                {
                        change_state (&map, key);
                        draw_map (&map);
                }
        }

        SDL_RemoveTimer (timer);
        return 0;
}



不足之处,敬请指正

[ 本帖最后由 pycansi 于 2014-9-13 15:50 编辑 ]
搜索更多相关主题的帖子: windows 小游戏 system 打地鼠 定时器 
2014-09-13 15:44
网络小白
Rank: 2
等 级:论坛游民
帖 子:26
专家分:35
注 册:2014-9-13
得分:0 
我是菜鸟中的菜鸟。。。为什么我允许提示找不到"SDL2/SDL.h",,,求指点
2014-09-15 17:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用网络小白在2014-9-15 17:46:32的发言:

我是菜鸟中的菜鸟。。。为什么我允许提示找不到"SDL2/SDL.h",,,求指点

程序代码:
// 以下代码只适合VC以及兼容vc crt库的编译器,因为代码使用了 _kbhit/_getch/system("cls") 等非标准的东西
// 以下代码,在VC9.0上编译测试通过;在GCC4.8.1上编译测试通过
// 以下代码,使用了古老的C89语法。只要将注释后的代码替换注释前的代码,就变为了C99/C11代码,可以在GCC4.8.1(-std=c11)上编译通过
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define bool int // #include <stdbool.h>
#include <conio.h> // 使用了非标准的东西

struct bitset_data
{
    unsigned mask_;
};
void bitset_constructor( struct bitset_data* data )
{
    data->mask_ = 0;
};
void bitset_print( const struct bitset_data* data )
{
    unsigned i; for( i=0; i!=9; ++i ) // for( unsigned i=0; i!=9; ++i )
        printf( "%c%s", "0$"[(data->mask_&(1u<<(6-i/3*3+i%3)))!=0], "\n"+(i%3!=2) );
}
bool bitset_any( const struct bitset_data* data )
{
    return data->mask_ != 0;
}
void bitset_reset( struct bitset_data* data, unsigned index )
{
    data->mask_ &= ~(1u<<index);
}
void bitset_set( struct bitset_data* data, unsigned index )
{
    data->mask_ |= 1u<<index;
}
bool bitset_test( const struct bitset_data* data, unsigned index )
{
    return (data->mask_ | (1u<<index)) != 0;
}

int main( void )
{
    struct bitset_data whackmole;
    bitset_constructor( &whackmole );
   

    {
        clock_t t = clock() - 2*CLOCKS_PER_SEC; for( ; ; ) // for( clock_t t=clock()-2*CLOCKS_PER_SEC; ; )
        {
            if( clock() >= t+2*CLOCKS_PER_SEC )
            {
                if( bitset_any(&whackmole) )
                {
                    printf( "%s\n", "Game Over" );
                    break;
                }

                bitset_set( &whackmole, rand()%9 );
                system("cls");
                bitset_print( &whackmole );
                t = clock();
            }

            if( _kbhit() )
            {
                int ch = _getch();
                if( ch>='1' && ch<='9' ) // 小键盘输入
                {
                    unsigned index = ch - '1';
                    if( bitset_test( &whackmole, index ) )
                    {
                        bitset_reset( &whackmole, index );
                        system("cls");
                        bitset_print( &whackmole );
                    }
                }
            }
        }
    }

    return 0;
}
2014-09-16 10:02
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
得分:0 
回复 2 楼 网络小白
请参考: tjumyk.


莫问前尘有愧,但求今生无悔
2014-09-16 13:01
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
得分:0 
回复 3 楼 rjsp
高,学习了

想起 b版 了,也是一手优雅的位操作


莫问前尘有愧,但求今生无悔
2014-09-16 14:51
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
得分:0 
"\n" + (i%3 != 2)
巧妙运用了字符串末尾的 0 ,漂亮


莫问前尘有愧,但求今生无悔
2014-09-16 15:27



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-436035-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.116246 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved