📄 game2.c
字号:
#include<io.h>
#include<stdio.h>
#include<dos.h>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<bios.h>
#include<mem.h>
#include<fcntl.h>
#include<stdlib.h>
#include<conio.h>
#define VGA256 0x13
#define TEXT_MODE 0x03
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 200
#define CHAR_HEIGHT 8
#define CHAR_WIDTH 8
unsigned char far *video_buffer=(char far *)0xA0000000L;
unsigned char far *rom_char_set=(char far *)0xF000FA6EL;
int xa=0,ya=0,l=0;
void Set_Video_Mode(int mode)
{
union REGS inregs,outregs;
inregs.h.ah=0;
inregs.h.al=(unsigned char)mode;
int86(0x10,&inregs,&outregs);
}
void Plot_Pixel_Fast(int x,int y,char color)
{
video_buffer[((y<<8)+(y<<6))+x]=color;
}
void H_Line(int x1,int x2,int y,unsigned int color)
{
memset( (char far *) (video_buffer + ( (y<<8) + (y<<6) ) + x1) , color , x2-x1+1 );
}
void V_Line(int y1,int y2,int x,unsigned int color)
{
int i;
for(i=y1;i<y2;i++)
video_buffer[ (i<<8) + (i<<6) + x]=color;
}
void Rectangle(int x1,int y1,int x2,int y2,int color)
{
H_Line(x1,x2,y1,color);
H_Line(x1,x2,y2,color);
V_Line(y1,y2,x1,color);
V_Line(y1,y2,x2,color);
}
void Fill_Rectangle(int x1,int y1,int x2,int y2,int color)
{
int i;
for(i=y1;i<=y2;i++)
{
H_Line(x1,x2,i,color);
}
}
void Blit_Char(int xc,int yc,char c,int color,int trans_flag)
{
int offset,x,y;
char far *work_char;
unsigned char bit_mask=0x80;
work_char=rom_char_set+c*CHAR_HEIGHT;
offset=(yc<<8)+(yc<<6)+xc;
for(y=0;y<CHAR_HEIGHT;y++)
{
bit_mask=0x80;
for(x=0;x<CHAR_WIDTH;x++)
{
if((*work_char&bit_mask))
video_buffer[offset+x]=color;
else if(!trans_flag)
video_buffer[offset+x]=0;
bit_mask=(bit_mask>>1);
}
offset+=SCREEN_WIDTH;
work_char++;
}
}
void Blit_String(int x,int y,int color,char *string,int trans_flag)
{
int index;
for(index=0;string[index]!=0;index++)
{
Blit_Char(x+(index<<3),y,string[index],color,trans_flag);
}
}
void Fill_Screen(int value)
{
_fmemset(video_buffer,(char)value,SCREEN_WIDTH*SCREEN_HEIGHT+1);
}
int menu(void)
{
int key,flag=1;
char *a[3]={"","",""};
char *menu[4]={"new game","load game","save game","quit game"};
if(l==0)
{
Blit_String(100,85,WHITE,menu[0],1);
Blit_String(100,105,WHITE,menu[1],1);
Blit_String(100,125,8,menu[2],1);
Blit_String(100,145,WHITE,menu[3],1);
}
else
{
Blit_String(100,85,WHITE,menu[0],1);
Blit_String(100,105,8,menu[1],1);
Blit_String(100,125,WHITE,menu[2],1);
Blit_String(100,145,WHITE,menu[3],1);
}
Blit_String(0,180,BLUE,"(press up and down arrow key to choice)",1);
Fill_Rectangle(95,80,180,95,WHITE);
Blit_String(100,85,BLACK,"new game",1);
while(key!=13)
{
switch(key=getch())
{
case 80:
if(flag<4)
{
Fill_Rectangle(95,60+20*flag,180,75+20*flag,BLACK);
Blit_String(100,65+20*flag,WHITE,menu[flag-1],1);
if((l==0&&flag==2)||(l!=0&&flag==1))
flag=flag+2;
else
flag=flag+1;
Fill_Rectangle(95,60+20*flag,180,75+20*flag,WHITE);
Blit_String(100,65+20*flag,BLACK,menu[flag-1],1);
}
break;
case 72:
if(flag>1)
{
Fill_Rectangle(95,60+20*flag,180,75+20*flag,BLACK);
Blit_String(100,65+20*flag,WHITE,menu[flag-1],1);
if((l!=0&&flag==3)||(l==0&&flag==4))
flag=flag-2;
else
flag=flag-1;
Fill_Rectangle(95,60+20*flag,180,75+20*flag,WHITE);
Blit_String(100,65+20*flag,BLACK,menu[flag-1],1);
}
break;
}
}
Fill_Screen(0);
return flag;
}
void Write_To_File(char flag,char *file,int *word)
{
const char *xy;
int i=0;
FILE *stream;
if ((stream = fopen(file, "w+b")) == NULL)
{
fprintf(stderr, "Cannot open output file.\n");
return 1;
}
while(word[i]!=-1)
{
itoa(word[i],xy,10);
fwrite(xy,strlen(xy), 1, stream);
fputc(flag,stream);
i++;
}
fclose(stream);
}
void game()
{
int color=YELLOW,key;
while(key!='q')
{
Fill_Rectangle(xa*16,ya*10,xa*16+15,ya*10+9,color);
switch(key=getch())
{
case 75:
if(xa>0)
{
Fill_Rectangle(xa*16,ya*10,xa*16+15,ya*10+9,BLACK);
xa=xa-1;
}
break;
case 77:
if(xa<19)
{
Fill_Rectangle(xa*16,ya*10,xa*16+15,ya*10+9,BLACK);
xa=xa+1;
}
break;
case 72:
if(ya>0)
{
Fill_Rectangle(xa*16,ya*10,xa*16+15,ya*10+9,BLACK);
ya=ya-1;
}
break;
case 80:
if(ya<19)
{
Fill_Rectangle(xa*16,ya*10,xa*16+15,ya*10+9,BLACK);
ya=ya+1;
}
break;
}
}
}
void Read_From_File(char flag,char *file,int *word)
{
int i,j=0,k=0;
char *buf;
FILE *stream;
if ((stream = fopen(file, "r+b")) == NULL)
{
fprintf(stderr, "Cannot open output file.\n");
return 1;
}
for(i=0;!feof(stream);i++)
{
fread(buf,1, 1, stream);
if(buf[0]==flag)
{
fseek(stream,k, SEEK_SET);
fread(buf,i-k+1,1,stream);
buf[i-k]='\x0';
word[j]=atoi(buf);
j++;
k=i+1;
}
}
fclose(stream);
}
void main(void)
{
int load=0,i;
char flag=';';
char *file="load.dat";
char *buf="";
int *word;
Set_Video_Mode(VGA256);
while(load!=4&&load!=3)
{
if(load==2)
{
Read_From_File(flag,file,word);
xa=word[0];
ya=word[1];
game();
}
else if(load==1)
{
xa=0;
ya=0;
game();
}
load=menu();
if(load==3)
{
word[0]=xa;
word[1]=ya;
word[2]=-1;
Write_To_File(flag,file,word);
}
l++;
}
Set_Video_Mode(TEXT_MODE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -