要在家目录下
makefile
1 main : main.o fun.o input.o fb_draw.o 2 gcc -Wall -o [email protected] $^ 3 clean : 4 rm -rf *.o main
fb_draw.h
#ifndef __FB_DRAW_H #define __FB_DRAW_Hint fb_open(voID); voID fb_close(voID); voID fb_draw_point(int x,int y,unsigned int color); int xres(voID); int yres(voID); #endif
fun.h
#ifndef __input_H #define __input_H#define KEYBOARDMODE 0#define CHARMODE 1voID input_init(voID); int input_choice_mode(int mode); int input_kb_mode(voID); int input_char_mode(voID); voID input_recover(voID); #endif
inc.h
#ifndef __INC_H #define __INC_H #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/fb.h> #include <linux/input.h> #include <unistd.h> #include <sys/mman.h> #include <string.h> #include <termios.h> #include "input.h" #include "fb_draw.h"#endif
input.h
#ifndef __input_H #define __input_H#define KEYBOARDMODE 0#define CHARMODE 1voID input_init(voID); int input_choice_mode(int mode); int input_kb_mode(voID); int input_char_mode(voID); voID input_recover(voID); #endif
fb_draw.c
#include "include/inc.h"/*********************************************** 结构体中保存了有关 *** 作framebuffer设备所需的成员 fix : 本地的fb数据 var : 可变的fb数据 bpp : 一个像素点所占位数 fd : 保存fb文件的文件描述符 fbp : 获取映射空间地址 fbpi: 获取映射空间地址 ************************************************/struct { struct fb_fix_screeninfo fix;//本地fb数据 struct fb_var_screeninfo var;//可变fb数据 unsigned int bpp;//一个像素点所占位数 int fd;//保存fb文件的文件描述符 unsigned char *fbp;//获取映射空间地址 unsigned int *fbpi;//获取映射空间地址}fb_st; /*********************************************** int fb_open(voID); 功 能 : 把fb文件打开,通过ioctl控制fb设备 通过mmap映射fb文件 返回值 : 无 参 数 : 成功返回0,失败返回-1 ************************************************/int fb_open(voID) { int ret; fb_st.fd = open("/dev/fb0",O_RDWR); if(-1 == fb_st.fd) { perror("open"); goto error; } /* get fb_var_screeninfo */ ret = ioctl(fb_st.fd,FBIOGET_VSCREENINFO,&fb_st.var); if(-1 == ret) { perror("ioctl(fb_st.var)"); goto close_fd; } fb_st.bpp = fb_st.var.bits_per_pixel >> 3; /* get fb_fix_screeninfo */ ret = ioctl(fb_st.fd,FBIOGET_FSCREENINFO,&fb_st.fix); if(-1 == ret) { perror("ioctl(fb_st.fix)"); goto close_fd; } /* get framebuffer start address */ fb_st.fbp = mmap(0,fb_st.fix.smem_len,PROT_READ | PROT_WRITE,MAP_SHARED,fb_st.fd,0); if((voID *)-1 == fb_st.fbp) { perror("mmap"); goto close_fd; } return 0; close_fd: close(fb_st.fd); error: return -1; } /*********************************************** voID fb_close(); 功 能 : 解除设备文件的映射,关闭文件 返回值 : 无 参 数 : 无 ************************************************/voID fb_close() { munmap(fb_st.fbp,fb_st.fix.smem_len); close(fb_st.fd); } /*********************************************** voID fb_draw_point(int x,int y,int color); 功 能 : 通过framebuff画点 返回值 : 无 参 数 : x 横坐标 y 纵坐标 color 要显示的颜色(现只支持白色0xFF 黑色0x00) ************************************************/voID fb_draw_point(int x,unsigned int color) { unsigned long offset; offset = fb_st.bpp * x + y * fb_st.fix.line_length; //memset(fb_st.fbp + offset,color,fb_st.bpp); fb_st.fbpi = (unsigned int *)(fb_st.fbp + offset); *(fb_st.fbpi) = color; } /*********************************************** int xres(voID); 功 能 : 获取x轴坐标 返回值 : 获取到的x轴坐标 参 数 : 无 ************************************************/int xres(voID) { return fb_st.var.xres; } /*********************************************** int yres(voID); 功 能 : 获取y轴坐标 返回值 : 获取到的y轴坐标 参 数 : 无 ************************************************/int yres(voID) { return fb_st.var.yres; }
input.c
#include "include/inc.h"/*********************************************** 结构体中保存了有关键盘 *** 作或者终端设置的一些成员 old : 保存原始终端信息 new : 改变之后的终端信息 kb_fd : 保存键盘设备的设备号 ev : 保存输入设备的信息数据 ************************************************/struct { struct termios old; struct termios new; int kb_fd; struct input_event ev; }input_st; /*********************************************** voID input_init(voID); 功 能 : 用来在接收输入值之前设置终端 返回值 : 无 参 数 : 无 ************************************************/voID input_init(voID) { tcgetattr(0,&input_st.old); input_st.new = input_st.old; input_st.new.c_lflag &= ~ICANON; input_st.new.c_lflag &= ~ECHO; tcsetattr(0,TCSANow,&input_st.new); } /*********************************************** char *mystrcpy(char *dest,const char *src); 功 能 : 用来拷贝字符串,碰到尾0或者空格停止 返回值 : 指向dest的指针 参 数 : dest 拷贝的目标,dest指向拷贝的空间 src 拷贝的源,指向要拷贝的字符串 ************************************************/char *mystrcpy(char *dest,const char *src) { int i = 0; for(i = 0; src[i] != ‘‘‘ && src[i] != ‘ ) dest[i] ; i++ src[i]; dest[i] =‘= ‘; return dest; } /*********************************************** voID input_find_dev_file(char *buf_ev); 功 能 : 用来读取当前用户识别的键盘文件 返回值 : 无 参 数 : buf_ev 保存获取到的键盘设备文件名 ************************************************/voIDcharbuf_ev) { file input_find_dev_file( NulL; *char*fp =1280 buf[}; ] = {char"keyboard *find_kb = "; char"event *find_ev = "; char NulL; fp " *p =/proc/bus/input/devices= fopen(""r,"); whilesizeof1((fgets(buf, NulL) { p (buf) - strstr(buf,find_kb); ,fp)) !=if= NulL) continue(p ==; else { whileif NulL) ((fgets(buf,find_ev); continue(p ==; else { mystrcpy(buf_ev,p); break; } } break; } } fclose(fp); } /*********************************************** int input_choice_mode(int mode); 功 能 : 用来选择接收输入源的模式 返回值 : 0 代表使用键盘模式 1 代表使用字符模式 -1 代表选择模式失败 参 数 : KEYBOARDMODE 键盘模式 CHARMODE 字符模式 ************************************************/intint mode) { input_choice_mode(char64" dest[/dev/input/] = "; char80 buf[}; ] = {switch(mode) { case KEYBOARDMODE : input_find_dev_file(buf); strcat(dest,buf); input_st.kb_fd open(dest,O_RDONLY); if=0) { perror((input_st.kb_fd < "open()"); return1; } -break; casebreak; CHARMODE : defaultreturn1 : ; } -return mode; } /*********************************************** int input_kb_mode(voID); 功 能 : 获取键盘的键值,并返回 返回值 : 为了使用方便,返回[103上] 返回[108下],返回[105左] 返回[106右],返回[14落子] 返回[16quit] 参 数 : 无 ************************************************/intvoID) { read(input_st.kb_fd, input_kb_mode(sizeof(input_st.ev)); &input_st.ev,if EV_KEY) if(input_st.ev.type == SYN_REPORT) { if(input_st.ev.value ==16) { tcsetattr((input_st.ev.code == 0input_st.old); close(input_st.kb_fd); } return,& input_st.ev.code; } return0; } /*********************************************** int input_char_mode(voID); 功 能 : 获取键盘字符,返回[w上] 返回[s下],返回[a左] 返回[d右],返回[‘ ‘] 返回[qquit] 请自行处理大小写 参 数 : 无 ************************************************/intvoID) { input_char_mode(int0; val val = getchar(); if=‘q(val == ‘‘Q || val == ‘) tcsetattr(0input_st.old); return,& val; } /*********************************************** voID input_recover(voID); 功 能 : 用来恢复设置终端 返回值 : 无 参 数 : 无 ************************************************/voIDvoID) { tcsetattr( input_recover(0input_st.old); }fun.c,& #include
#include
#include <stdio.h>"<stdlib.h>include/inc.h" #include "include/fun.h"int0x000000// color = 棋盘线颜色 黑色; int0xFFFFFF// back_color = 棋盘背景颜色 白色; int0xCC9966// play1_color = 0x00BFFF; ;//玩家1棋子颜色int0x000000// play2_color = 0xFFBBFF; ;//玩家2棋子颜色struct00 cir c = {20,0x00BFFF,}; ,intint17 ifset(int (*arr)[int],y) { *x,if *16) ((*x) > 0; *x = if0) ((*x) < 16; *x = if16) ((*y) > 0; *y = if0) ((*y) < 16; *y = if12(arr[(*x)][(*y)] == ) || arr[(*x)][(*y)] == return1; return0; } voIDintint draw_circle(int x, color) { r,int x0,y0; for) { for(x0 = x - r; x0 <= x + r; x0++) { if(y0 = y - r; y0 <= y + r; y0++ r) fb_draw_point(x0,y0,color); } } } int((x0 - x) * (x0 - x) + (y0 - y) * (y0 - y) <= r *int17 is_win(int arr[][int], mode) { x,int00 i = 0,j = ; ,sum = for516(i = x; i < x + // && i <= 判断横向能否赢; i++) { if1 mode) sum(arr[i+; ][y] ==else++break; } for50(i = x; i > x - ) { && i >= if; i--1 mode) sum(arr[i-; ][y] ==else++break; } if4) (sum >= return1; else sum 0; = for516(i = y; i < y + // && i <= 判断纵向能否赢; i++) { if1 mode) sum(arr[x][i+; ] ==else++break; } for50(i = y; i >= y - ) { && i >= if; i--1 mode) sum(arr[x][i-; ] ==else++break; } if4) (sum >= return1; else sum 0; j = y; for=516(i = x; i < x + // && i <= 判断撇能否赢; i++) { if11(arr[i+ mode) sum][j-; ] ==else++break; j ; } j y; --for=50(i = x; i > x - ) { && i >= if; i--11(arr[i- mode) sum][j+; ] ==else++break; j ; } if++4) (sum >= return1; else sum 0; j = y; for=516(i = x; i < x + // && i <= 判断捺能否赢; i++) { if11(arr[i+ mode) sum][j+; ] ==else++break; } j y; for=50(i = x; i > x - ) { && i >= if; i--11(arr[i- mode) sum][j-; ] ==else++break; j ; } if--4) (sum >= return1; return0; } voID//打印棋盘 print() { int00 i = ; ,j = for5101410(i = //; i <= 打印棋盘背景颜色; i++) { for90990(j = ) fb_draw_point(i,j,back_color); } ; j <= for; j++5301390(i = //; i <= 打印棋盘外边框 上; i++) { for110113(j = ) fb_draw_point(i,color); } ; j <= for; j++5301390(i = //; i <= 打印棋盘外边框 下; i++) { for970973(j = ) fb_draw_point(i,color); } ; j <= for; j++530533(i = //; i <= 打印棋盘外边框 左; i++) { for110970(j = ) fb_draw_point(i,color); } ; j <= for; j++13901385(i = //; i >= 打印棋盘外边框 右; i--) { for112970(j = ) fb_draw_point(i,color); } } ; j <= voID; j++ print_line() { int00 i = ; ,j = for5601360(i = //; i <= 打印棋盘线条; i++) { for140940(j = 50; j <= ) fb_draw_point(i,color); } ; j += for5601360(i = 50; i <= ) { ; i += for140940(j = ) fb_draw_point(i,color); } } ; j <= voID; j++int17 print_intime(struct (*xy_point)[ cir q) { ],int00 i = 0,c = 0,d = 0,x = ; ,y = for5600(i = 1360,x = 50; i <= ) { ; i += for,x++1400(j = 940,y = 50; j <= ) { ; j += if,y++1) draw_circle(i,q.r,play1_color); (xy_point[x][y] == elseif2 ) draw_circle(i,play2_color); (xy_point[x][y] == elseif0 ) { draw_circle(i,back_color); (xy_point[x][y] == for2020(c = i + ) { ,d = j; c >= i - if; c--5601360(c < ) || c > continue; fb_draw_point(c,d,color); } for2020(d = j + ) { ,c = i; d >= j - if; d--140940(d < ) || d > continue; fb_draw_point(c,color); } } } } } voIDintint _set(y) { ( *x,; *if*x)++17) { (((*x) == 0; (*x) = ; if*y)++17) (((*y) == 0; } } *y) = intint17 play(int (*xy_point)[ mode) { ],int00 ret = 0,flag = 0,val = 0,tmpx = ; flag ,tmpy = input_choice_mode(CHARMODE); c.x 0=0= ; ; c.y = whilec.y)) _set(c.y); xy_point[c.x][c.y] (ifset(xy_point,&c.x,& mode; print_intime(xy_point,c); LEAP: &c.x,&if=0) { val (flag == input_kb_mode(); switch=(val) { case103 c.y; tmpx c.x; c.y : tmpy =; =while--c.y); xy_point[tmpx][tmpy] 0(ifset(xy_point,&; = break; case108 c.y; tmpx c.x; c.y : tmpy =; =while++c.y); xy_point[tmpx][tmpy] 0(ifset(xy_point,&; = break; case105 c.x; tmpy c.y; c.x : tmpx =; =while--c.y); xy_point[tmpx][tmpy] 0(ifset(xy_point,&; = break; case106 c.x; tmpy c.y; c.x : tmpx =; =while++c.y); xy_point[tmpx][tmpy] 0(ifset(xy_point,&; = break; case141 ; : ret = break; case160 ) ; } } : exit(elseif1 ) { val (flag == input_char_mode(); switch=(val) { case‘W ‘ : case‘w ‘ c.x; tmpy c.y; c.y : tmpx =; =while--c.y); xy_point[tmpx][tmpy] 0(ifset(xy_point,&; = break; case‘S ‘ : case‘s ‘ c.x; tmpy c.y; c.y : tmpx =; =while++c.y); xy_point[tmpx][tmpy] 0(ifset(xy_point,&; = break; case‘A ‘ : case‘a ‘ c.x; tmpy c.y; c.x : tmpx =; =while--c.y); xy_point[tmpx][tmpy] 0(ifset(xy_point,&; = break; case‘D ‘ : case‘d ‘ c.x; tmpy c.y; c.x : tmpx =; =while++c.y); xy_point[tmpx][tmpy] 0(ifset(xy_point,&; = break; case‘‘ 1 break : ret = ; ; case‘q ‘0) ; } } xy_point[c.x][c.y] : exit( mode; print_intime(xy_point,c); if=1) (ret != goto LEAP; if(is_win(xy_point,c.x,c.y,mode)) return mode; return0; } main.c #include
"
#include <stdio.h>include/fun.h" #include "include/inc.h"intvoID) { main(int00 i = //,j = 循环变量; int17 17 xy_point[0][//] = {保存棋盘坐标}; int0 // ret = 接收函数返回值; fb_open(); xres(); yres(); input_init(); print(); //打印棋盘边框和背景//打印棋盘 print_line(); while1 ) { ret (1//= play(xy_point,玩家1下棋); if0 ) (ret < break; elseif1 ) { printf((ret == "play1 win\n"); break; } ret 2//= play(xy_point,玩家2下棋); if0 ) (ret < break; elseif2 ) { printf((ret == "play2 win\n"); break; } } input_recover(); fb_close(); return0; }
总结 以上是内存溢出为你收集整理的五子棋 framebuffer版全部内容,希望文章能够帮你解决五子棋 framebuffer版所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)