怎么运行这个用c语言的小游戏?

软件和网站开发以及相关技术探讨
回复
清 凉散 人
帖子: 89
注册时间: 2008-11-18 8:50

怎么运行这个用c语言的小游戏?

#1

帖子 清 凉散 人 » 2009-06-09 22:44

我是刚学习c的,想找点小游戏用来提高兴趣,在这个网站上有很多源码,http://study.qqcf.com/web/178/20681.htm 但是不能用gcc编译。请高手帮忙看一下。。先谢谢了。。
#include <stdio.h>
#include <bios.h>
#include <ctype.h>
#include <conio.h>
#include <dos.h>
#define CROSSRU 0xbf /*右上角点*/
#define CROSSLU 0xda /*左上角点*/
#define CROSSLD 0xc0 /*左下角点*/
#define CROSSRD 0xd9 /*右下角点*/
#define CROSSL 0xc3 /*左边*/
#define CROSSR 0xb4 /*右边*/
#define CROSSU 0xc2 /*上边*/
#define CROSSD 0xc1 /*下边*/
#define CROSS 0xc5 /*十字交叉点*/

/*定义棋盘左上角点在屏幕上的位置*/
#define MAPXOFT 5
#define MAPYOFT 2

/*定义1号玩家的操作键键码*/
#define PLAY1UP 0x1157/*上移--'W'*/
#define PLAY1DOWN 0x1f53/*下移--'S'*/
#define PLAY1LEFT 0x1e41/*左移--'A'*/
#define PLAY1RIGHT 0x2044/*右移--'D'*/
#define PLAY1DO 0x3920/*落子--空格键*/

/*定义2号玩家的操作键键码*/
#define PLAY2UP 0x4800/*上移--方向键up*/
#define PLAY2DOWN 0x5000/*下移--方向键down*/
#define PLAY2LEFT 0x4b00/*左移--方向键left*/
#define PLAY2RIGHT 0x4d00/*右移--方向键right*/
#define PLAY2DO 0x1c0d/*落子--回车键Enter*/

/*若想在游戏中途退出, 可按 Esc 键*/
#define ESCAPE 0x011b

/*定义棋盘上交叉点的状态, 即该点有无棋子 */
/*若有棋子, 还应能指出是哪个玩家的棋子 */
#define CHESSNULL 0 /*没有棋子*/
#define CHESS1 'O'/*一号玩家的棋子*/
#define CHESS2 'X'/*二号玩家的棋子*/

/*定义按键类别*/
#define KEYEX99v 0/*退出键*/
#define KEYFALLCHESS 1/*落子键*/
#define KEYMOVECURSOR 2/*光标移动键*/
#define KEYINVALID 3/*无效键*/

/*定义符号常量: 真, 假 --- 真为1, 假为0 */
#define TRUE 1
#define FALSE 0

/**********************************************************/
/* 定义数据结构 */

/*棋盘交叉点坐标的数据结构*/
struct point
{
int x,y;
};

/**********************************************************/
/*自定义函数原型说明 */
void Init(void);
int GetKey(void);
int CheckKey(int press);
int ChangeOrder(void);
int ChessGo(int Order,struct point Cursor);
void DoError(void);
void DoOK(void);
void DoWin(int Order);
void MoveCursor(int Order,int press);
void DrawCross(int x,int y);
void DrawMap(void);
int JudgeWin(int Order,struct point Cursor);
int JudgeWinLine(int Order,struct point Cursor,int direction);
void ShowOrderMsg(int Order);
void EndGame(void);
/**********************************************************/

/**********************************************************/
/* 定义全局变量 */
int gPlayOrder; /*指示当前行棋方 */
struct point gCursor; /*光标在棋盘上的位置 */
char gChessBoard[19][19];/*用于记录棋盘上各点的状态*/
/**********************************************************/
xinyu391
帖子: 99
注册时间: 2007-04-21 7:37

Re: 怎么运行这个用c语言的小游戏?

#2

帖子 xinyu391 » 2009-06-09 22:59

你给的那个网页是 一份详细的五子棋说明
不是完正的源程序

连main函数都没有,怎么编译
还是好好学习c把
清 凉散 人
帖子: 89
注册时间: 2008-11-18 8:50

Re: 怎么运行这个用c语言的小游戏?

#3

帖子 清 凉散 人 » 2009-06-10 8:37

谢谢!但是这个有main函数怎么也不能编译呢?是不 是要用其它的工具啊,
#include<dos.h>
#include<graphics.h>
#include<stdio.h>
int x,y;
void doexit(),saveimage(),doimage(),imagedrive();
void *buff;
main()
{
int i,j,key;
int dokey();
char ch[]="BEAUIDEAL",c[]="help: right,down,left,up,enter,esc; very easy,OK!~!";
imagedrive();
saveimage();

cleardevice();
setbkcolor(7);
setcolor(1);
settextstyle(0,0,2);
outtextxy(250,50,ch);
setlinestyle(1,0,3);
rectangle(30,30,600,400);
setlinestyle(0,0,0);

settextstyle(0,0,1);
setcolor(8);
outtextxy(100,380,c);

setcolor(15);
for(i=0;i<5;i++)
for(j=0;j<5;j++)
rectangle(200+j*35,100+i*35,230+j*35,130+i*35);



setcolor(1);
rectangle(200,100,230,130);
x=200;
y=100;
while(1)
{
key=bioskey(0);
dokey(key);
}

free(buff);
closegraph();

}

void saveimage() /*存储方格*/
{

bar(0,0,29,29);
buff=sizeof(imagesize(0,0,29,29));
getimage(0,0,28,28,buff);
}

void imagedrive() /*图形模式初始化*/
{
int gd,gm;
gd=VGA;
gm=VGAHI;
initgraph(&gd,&gm,"");
cleardevice();
}

void doimage(x,y) /*画方格*/
{
void tell();
putimage(x+1,y+1,buff,1);
if(x!=200)
putimage(x+1-35,y+1,buff,1);
if(x!=340)
putimage(x+1+35,y+1,buff,1);
if(y!=100)
putimage(x+1,y+1-35,buff,1);
if(y!=240)
putimage(x+1,y+1+35,buff,1);
tell();
}


int dokey(key) /*键盘处理*/
int key;
{
int prect(),nrect();
switch(key)
{
case 0x4800 : if(y!=100) {prect(x,y);nrect(x,y-=35);} break;
case 0x4b00 : if(x!=200) {prect(x,y);nrect(x-=35,y);} break;
case 0x4d00 : if(x!=340) {prect(x,y);nrect(x+=35,y);} break;
case 0x5000 : if(y!=240) {prect(x,y);nrect(x,y+=35);} break;
case 0x11b : doexit();break;
case 0x1c0d : doimage(x,y);break;
}
}

void tell() /*判断是否画满*/
{
void win();
int color=15,t=0,i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(color!=getpixel(215+i*35,115+j*35))
{t=1;break;}
if(t==0)
win();
}

void win()

{
char c;
settextstyle(3,0,2);
outtextxy(50,100,"YOU WIN !! do you want to replay (y/n) ");
do
{
c=getch();
if(c=='y'||c=='Y')
main(); /*从新玩就返回主函数*/
if(c=='n'||c=='N')
doexit();
}while(c=='y'||c=='Y'||c=='n'||c=='N');
}



int prect(x,y) /*在新位置画方框*/
{
setcolor(15);
rectangle(x,y,x+30,y+30);
}

int nrect(x,y) /*将原来位置的方框清除*/
{
setcolor(1);
rectangle(x,y,x+30,y+30);
}
x3y1
帖子: 8
注册时间: 2007-11-15 9:08

Re: 怎么运行这个用c语言的小游戏?

#4

帖子 x3y1 » 2009-06-11 22:17

这个显然是Dos下用Turbo C写的程序,运到了Turbo C扩展的绘图函数,肯定不能用Gcc编译的!
清 凉散 人 写了:谢谢!但是这个有main函数怎么也不能编译呢?是不 是要用其它的工具啊,
#include<dos.h>
#include<graphics.h>
#include<stdio.h>
int x,y;
void doexit(),saveimage(),doimage(),imagedrive();
void *buff;
main()
{
int i,j,key;
int dokey();
char ch[]="BEAUIDEAL",c[]="help: right,down,left,up,enter,esc; very easy,OK!~!";
imagedrive();
saveimage();

cleardevice();
setbkcolor(7);
setcolor(1);
settextstyle(0,0,2);
outtextxy(250,50,ch);
setlinestyle(1,0,3);
rectangle(30,30,600,400);
setlinestyle(0,0,0);

settextstyle(0,0,1);
setcolor(8);
outtextxy(100,380,c);

setcolor(15);
for(i=0;i<5;i++)
for(j=0;j<5;j++)
rectangle(200+j*35,100+i*35,230+j*35,130+i*35);



setcolor(1);
rectangle(200,100,230,130);
x=200;
y=100;
while(1)
{
key=bioskey(0);
dokey(key);
}

free(buff);
closegraph();

}

void saveimage() /*存储方格*/
{

bar(0,0,29,29);
buff=sizeof(imagesize(0,0,29,29));
getimage(0,0,28,28,buff);
}

void imagedrive() /*图形模式初始化*/
{
int gd,gm;
gd=VGA;
gm=VGAHI;
initgraph(&gd,&gm,"");
cleardevice();
}

void doimage(x,y) /*画方格*/
{
void tell();
putimage(x+1,y+1,buff,1);
if(x!=200)
putimage(x+1-35,y+1,buff,1);
if(x!=340)
putimage(x+1+35,y+1,buff,1);
if(y!=100)
putimage(x+1,y+1-35,buff,1);
if(y!=240)
putimage(x+1,y+1+35,buff,1);
tell();
}


int dokey(key) /*键盘处理*/
int key;
{
int prect(),nrect();
switch(key)
{
case 0x4800 : if(y!=100) {prect(x,y);nrect(x,y-=35);} break;
case 0x4b00 : if(x!=200) {prect(x,y);nrect(x-=35,y);} break;
case 0x4d00 : if(x!=340) {prect(x,y);nrect(x+=35,y);} break;
case 0x5000 : if(y!=240) {prect(x,y);nrect(x,y+=35);} break;
case 0x11b : doexit();break;
case 0x1c0d : doimage(x,y);break;
}
}

void tell() /*判断是否画满*/
{
void win();
int color=15,t=0,i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(color!=getpixel(215+i*35,115+j*35))
{t=1;break;}
if(t==0)
win();
}

void win()

{
char c;
settextstyle(3,0,2);
outtextxy(50,100,"YOU WIN !! do you want to replay (y/n) ");
do
{
c=getch();
if(c=='y'||c=='Y')
main(); /*从新玩就返回主函数*/
if(c=='n'||c=='N')
doexit();
}while(c=='y'||c=='Y'||c=='n'||c=='N');
}



int prect(x,y) /*在新位置画方框*/
{
setcolor(15);
rectangle(x,y,x+30,y+30);
}

int nrect(x,y) /*将原来位置的方框清除*/
{
setcolor(1);
rectangle(x,y,x+30,y+30);
}
清 凉散 人
帖子: 89
注册时间: 2008-11-18 8:50

Re: 怎么运行这个用c语言的小游戏?

#5

帖子 清 凉散 人 » 2009-06-12 7:33

说的有理啊,谢谢这位朋友,那是不是可以用vc来编译啊,要不要装图形库相当于ubuntu下的gtk这类的软件。还有能不能提供几个能在ubuntu下编译并运行的c程序的游戏源码啊,边玩边学可以加深理解。谢谢了!
wenshu
帖子: 102
注册时间: 2006-08-15 20:35

Re: 怎么运行这个用c语言的小游戏?

#6

帖子 wenshu » 2009-06-12 9:08

你给的源码是很老的Dos下的游戏的源码,我没有试过,但猜测在VC下应该编译不过。

你可以找一些Win32的游戏源码,用VC编译,或者Linux游戏源码,用GCC编译。
还有一些跨平台的C/C++的游戏,比如使用SDL(一个游戏引擎)编写的游戏,但你需要先了解这些引擎如何使用。
我的bloghttp://www.liuzhongshu.com/
~ Tech、CodeGuitar、Design and my Life
jjbin
帖子: 120
注册时间: 2008-08-05 11:09

Re: 怎么运行这个用c语言的小游戏?

#7

帖子 jjbin » 2009-06-13 15:25

学习中.....
头像
lll9p
帖子: 1806
注册时间: 2007-07-18 18:56
联系:

Re: 怎么运行这个用c语言的小游戏?

#8

帖子 lll9p » 2009-06-13 15:32

turbo c的函数库,Linux下没
我的小站imtho.com
3n6uv7 2vw <---- 332 ?语星火是么什
清 凉散 人
帖子: 89
注册时间: 2008-11-18 8:50

Re: 怎么运行这个用c语言的小游戏?

#9

帖子 清 凉散 人 » 2009-06-13 22:36

GTK乒乓球

---用GTK实现乒乓球游戏



乒乓球游戏就是人控制一个板把从对面飞过来的球弹回去,当然有的会弹回去就打了一个正方形的格格。我现在这个只是把飞来的球弹回去,用左右控制板的移动,用SPACE控制暂停,用ENTER控制继续开始游戏,功能很简单!

运行的前提是在Windows平台下用VS2005+GTK的开发包,或者用Linux平台的GTK也可以。如果有什么问题,请联系我(可以留言),yanyegang521@126.com



//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#include <gtk/gtk.h>

#include <stdio.h>



gint sx=0;

gint sy=0;

gint ex=1;

gint ey=1;

gint barx=250;

gint diameter=50;

GtkWidget *window;

GtkWidget *da;

gint single =0;



static void destroy(GtkWidget *widget,gpointer data)

{

gtk_main_quit();

}



void press(GtkWidget *widget,GdkEventKey *event)

{

g_print ("press: %x\n",event->keyval);

switch(event->keyval)

{

case 65361: //左键

//g_print ("Rigth\n"); //use debug

if (barx>0 )

barx = barx - 10;

else

barx = 0;

break ;

case 65363: //右键

//g_print ("Left\n"); //use debug

if (barx<500 )

barx = barx + 10;

else

barx = 500;

break ;

case 32: //空格键

single = 1;

//g_print ("Stop\n"); //use debug

break;

case 65293: //回车键

single =0;

//g_print ("Begin\n"); //use debug



break;

default:

break;

}

}





gboolean my_expose(GtkWidget *da,GdkEventExpose *event,gpointer data )

{

GdkGC *gc1,*gc2,*gc;

GdkColor color;

gc1 = gdk_gc_new(da->window);

color.red = 0;

color.green = 65535;

color.blue = 0;

gdk_gc_set_rgb_fg_color(gc1,&color);

gc2 = gdk_gc_new(da->window);

color.red = 65535;

color.green = 0;

color.blue = 0;

gdk_gc_set_rgb_fg_color(gc2,&color);

gc = gc1;

gdk_draw_rectangle(da->window,gc,TRUE,barx,480,100,20);

gc = gc2;

gdk_draw_arc(da->window,gc,TRUE,ex,ey,diameter,diameter,0,64*360);

g_object_unref(G_OBJECT(gc1));

g_object_unref(G_OBJECT(gc2));



return TRUE;

}



void leave_notify_event(GtkWidget *widget, GdkEventMotion *event)

{

gint x, y;

GdkModifierType state;

GdkRectangle rect;

if (event->is_hint)

gdk_window_get_pointer(event->window,&x,&y,&state);

else{

x = (gint)event->x;

y = (gint)event->y;

state = (GdkModifierType)event->state;

}

barx = x;

rect.x = 0;

rect.y = 470;

rect.width = 600;

rect.height = 30;

gdk_window_invalidate_rect(da->window,&rect,FALSE);



}



gboolean inBar()

{

if(ex >=barx && ex <= (barx+100))

return TRUE;

return FALSE;

}



gboolean chPosition()

{

gint tempx=ex;

gint tempy=ey;



if ( single == 1)

{

return TRUE;

}

if(ex == 0 && ey > sy || ey == 0 && ex>sx)

{

ex++;

ey++;

}//右下

else if(ey == (480-diameter) && ex < sx && inBar() || ex == (600-diameter) && ey < sy )

{

ex--;

ey--;

}//左上

else if(ey == 0 && ex <sx || ex == (600-diameter) && ey > sy)

{

ex--;

ey++;

}//左下

else if(ey == (480-diameter) && inBar() && ex > sx || ex == 0 && ey < sy)

{

ex++;

ey--;

}//右上

else if(ey == (500-diameter) )

{

return FALSE;

}

else

{

ex = 2*ex - sx;

ey = 2*ey - sy;

}

sx = tempx;

sy = tempy;

gdk_window_invalidate_rect(da->window, NULL, FALSE);

return TRUE;

}



int main(int argc, char *argv[])

{



gtk_init(&argc,&argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_widget_set_events ( GTK_WIDGET(window), GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK|GDK_BUTTON_PRESS_MASK );

g_signal_connect(G_OBJECT(window),"delete_event", G_CALLBACK(gtk_main_quit),NULL);

g_signal_connect(G_OBJECT(window),"key_press_event", G_CALLBACK(press),NULL);

gtk_widget_add_events( GTK_WIDGET(window), GDK_KEY_PRESS_MASK |GDK_KEY_RELEASE_MASK|GDK_BUTTON_PRESS_MASK);

g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(destroy),NULL);

gtk_signal_connect(GTK_OBJECT(window),"leave_notify_event", GTK_SIGNAL_FUNC(leave_notify_event),NULL);

da = gtk_drawing_area_new();

gtk_widget_set_size_request(da,600,500);

gtk_container_add(GTK_CONTAINER(window),da);

g_signal_connect(da,"expose_event",G_CALLBACK(my_expose),NULL);

gtk_widget_show_all(window);

g_timeout_add(10,(GSourceFunc)chPosition,NULL);

gtk_main();

return 0;

}





这是一个gtk的小游戏,编 译后就能运行了。。有点意思。。
回复