//声明
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<windows.h>
#define SIZE 4
static int score=0
void putn(int n[][SIZE])
void getn(int n[][SIZE])
int isempty(int n[][SIZE])
int isfull(int n[][SIZE])
void math(int n[][SIZE],char c)
void tow(int n[][SIZE])
void toa(int n[][SIZE])
void tos(int n[][SIZE])
void tod(int n[][SIZE])
//主函数
int main()
{
int i,j
int n[SIZE][SIZE]
char c=' '
for(i=0i<SIZEi++)
{
for(j=0j<SIZEj++)
{
n[i][j]=0
}
}
printf( "***********************\n"
" 2048(%dX%d) \n"
" control:W/A/S/D \n"
"press any key to begin \n"
"***********************\n",SIZE,SIZE)
getch()
system("cls")
//n[0][1]=2048
//n[0][3]=2048
while(1)
{
if(isempty(n))
getn(n)
putn(n)
if(!isempty(n)&&isfull(n))
break
sleep(200)
c=getch()
while(c!='w'&&c!='a'&&c!='s'&&c!='d')
c=getch()
math(n,c)
system("cls")
}
printf(" Game Over!\n",score)
return 0
}
//函数
void putn(int n[][SIZE])
{
int i,j
for(i=0i<SIZEi++)
{
for(j=0j<SIZEj++)
printf("| ")
printf("|\n")
for(j=0j<SIZEj++)
{
if(n[i][j]==0)
printf("| ")
else
printf("|%4d ",n[i][j])
}
printf("|\n")
for(j=0j<SIZEj++)
printf("|_____")
printf("|\n")
}
printf("score: %d",score)
}
void getn(int n[][SIZE])
{
int a,b
a=rand()%SIZE
b=rand()%SIZE
while(n[a][b]!=0)
{
a=rand()%SIZE
b=rand()%SIZE
}
n[a][b]=2
}
int isempty(int n[][SIZE])
{
int i,j,count=0
for(i=0i<SIZEi++)
for(j=0j<SIZEj++)
if(n[i][j]==0)
count++
return count
}
int isfull(int n[][SIZE])
{
int i,j,count=0
for(i=0i<SIZEi++)
{
for(j=1j<SIZE-1j++)
{
if(n[i][j]==n[i][j+1]||n[i][j]==n[i][j-1])
count++
}
}
for(j=0j<SIZEj++)
{
for(i=1i<SIZE-1i++)
{
if(n[i][j]==n[i+1][j]||n[i][j]==n[i-1][j])
count++
}
}
return count>0?0:1
}
void math(int n[][SIZE],char c)
{
switch(c)
{
case 'w':tow(n)break
case 'a':toa(n)break
case 's':tos(n)break
case 'd':tod(n)break
default :
}
}
void tow(int n[][SIZE])
{
int i,j,a
int m[SIZE]
for(a=0a<SIZEa++)
m[a]=0
for(j=0j<SIZEj++)
{
for(a=0a<SIZEa++)
{
for(i=0i<SIZE-1i++)
{
if(n[i][j]==0)
{
n[i][j]=n[i+1][j]
n[i+1][j]=0
}
}
}
}
for(j=0j<SIZEj++)
{
for(a=0,i=0i<SIZEi++)
{
if(n[i][j]!=n[i+1][j]&&n[i][j]!=0||n[i][j]==2048)
{
m[a++]=n[i][j]
n[i][j]=0
}
else if(n[i][j]==n[i+1][j])
{
m[a++]=n[i][j]+n[i+1][j]
score+=m[a-1]
n[i][j]=0,n[i+1][j]=0
}
}
for(i=0i<SIZEi++)
{
n[i][j]=m[i]
m[i]=0
}
}
}
void toa(int n[][SIZE])
{
int i,j,a
int m[SIZE]
for(a=0a<SIZEa++)
m[a]=0
for(i=0i<SIZEi++)
{
for(a=0a<SIZEa++)
{
for(j=0j<SIZE-1j++)
{
if(n[i][j]==0)
{
n[i][j]=n[i][j+1]
n[i][j+1]=0
}
}
}
}
for(i=0i<SIZEi++)
{
for(a=0,j=0j<SIZEj++)
{
if(n[i][j]!=n[i][j+1]&&n[i][j]!=0||n[i][j]==2048)
{
m[a++]=n[i][j]
n[i][j]=0
}
else if(n[i][j]==n[i][j+1])
{
m[a++]=n[i][j]+n[i][j+1]
score+=m[a-1]
n[i][j]=0,n[i][j+1]=0
}
}
for(j=0j<SIZEj++)
{
n[i][j]=m[j]
m[j]=0
}
}
}
void tos(int n[][SIZE])
{
int i,j,a
int m[SIZE]
for(a=0a<SIZEa++)
m[a]=0
for(j=SIZE-1j>=0j--)
{
for(a=SIZE-1a>=0a--)
{
for(i=SIZE-1i>0i--)
{
if(n[i][j]==0)
{
n[i][j]=n[i-1][j]
n[i-1][j]=0
}
}
}
}
for(j=SIZE-1j>=0j--)
{
for(a=SIZE-1,i=SIZE-1i>=0i--)
{
if(n[i][j]!=n[i-1][j]&&n[i][j]!=0||n[i][j]==2048)
{
m[a--]=n[i][j]
n[i][j]=0
}
else if(n[i][j]==n[i-1][j])
{
m[a--]=n[i][j]+n[i-1][j]
score+=m[a+1]
n[i][j]=0,n[i-1][j]=0
}
}
for(i=SIZE-1i>=0i--)
{
n[i][j]=m[i]
m[i]=0
}
}
}
void tod(int n[][SIZE])
{
int i,j,a
int m[SIZE]
for(a=0a<SIZEa++)
m[a]=0
for(i=SIZE-1i>=0i--)
{
for(a=SIZE-1a>=0a--)
{
for(j=SIZE-1j>0j--)
{
if(n[i][j]==0)
{
n[i][j]=n[i][j-1]
n[i][j-1]=0
}
}
}
}
for(i=SIZE-1i>=0i--)
{
for(a=SIZE-1,j=SIZE-1j>=0j--)
{
if(n[i][j]!=n[i][j-1]&&n[i][j]!=0||n[i][j]==2048)
{
m[a--]=n[i][j]
n[i][j]=0
}
else if(n[i][j]==n[i][j-1])
{
m[a--]=n[i][j]+n[i][j-1]
score+=m[a+1]
n[i][j]=0,n[i][j-1]=0
}
}
for(j=SIZE-1j>=0j--)
{
n[i][j]=m[j]
m[j]=0
}
}
}
需要注意的是:
srand((unsigned) time(0)rand()是固定形式,不要更改任何一个字符!
如果不能编译,请把sleep(200)注释掉,如果提示不能找到system("cls")请把system("cls")更换为clrscr()。
c语言中没有类,只有结构,也可以像类一样编写,用结构,但其成员都是公开访问的,C++才有真正的类。
用c++实现的"贪吃蛇"游戏源码// greedsnake.cpp
#include <bios.h>
#include <conio.h>
#include <dos.h>
#include <graphics.h>
#include <stdlib.h>
#include <time.h>
#include "conf.h"
typedef struct node
{
int x,y
struct node *next
}Node
typedef struct
{
Node *head,*tail
int length
}Snake
typedef struct
{
int left,top,right,bottom
}Frame
typedef enum //四个方向
{
up,down,left,right
}Direction
typedef enum
{
false,true
}bool//*/
void InitGraphMode()//初始化图形驱动
void CloseGraphMode()
void Foot(int,int)
void Head(int,int)
void CreateFrame()//完成整个游戏框架的绘制
void CreateSnake()//创建一条两个节点的蛇,蛇的每一节是队列中的一个节点
bool PlayGame()//游戏的主体函数,
int Hit(int,int) //判断是否越界,或者撞到自身,两个参数分别是新的头接点的x,y坐标
bool GameOver()//绘制游戏结束时弹出的对话框
void Enqueue(Node)//入队函数
Node Dequeue()//出队函数
void ClearKeyBuf()//清除键盘缓冲,此函数可以消除不停的按无效键的影响
Snake snake
Frame frame
void main()
{
InitGraphMode()
do
{
CreateFrame()
}while(PlayGame())
CloseGraphMode()
}
void InitGraphMode()
{
int gdriver=DETECT,gmode
initgraph(&gdriver,&gmode,"../bgi/")
cleardevice()
}
void CloseGraphMode()
{
cleardevice()
closegraph()
}
void CreateFrame()
{
setbkcolor(CYAN)
//下面的四行代码用于计算主框架的左上角和右下角的坐标
frame.left=(getmaxx()+1-BlockWidth*RowOfFrame)/2
frame.top=(getmaxy()+1-BlockHeight*ColumnOfFrame)/2
frame.right=frame.left+BlockWidth*RowOfFrame
frame.bottom=frame.top+BlockHeight*ColumnOfFrame
Head(frame.left+100,frame.top-20)
setfillstyle(SOLID_FILL,LIGHTGRAY)
bar(frame.left,frame.top,frame.right,frame.bottom)
setlinestyle(SOLID_LINE,1,1)
setcolor(DARKGRAY)
line(frame.left,frame.top,frame.right,frame.top)
line(frame.left,frame.top,frame.left,frame.bottom)
setlinestyle(SOLID_LINE,1,1)
setcolor(WHITE)
line(frame.left,frame.bottom,frame.right,frame.bottom)
line(frame.right,frame.top,frame.right,frame.bottom)
setlinestyle(DOTTED_LINE,1,1)
setcolor(BLUE)
for(int row=1row<RowOfFramerow++)
line(frame.left+row*BlockWidth,frame.top,frame.left+row*BlockWidth,frame.bottom)
for(int column=1column<ColumnOfFramecolumn++)
line(frame.left,frame.top+column*BlockHeight,frame.right,frame.top+column*BlockHeight)
Foot(frame.left,frame.bottom+20)
}
void CreateSnake()
{
Node *node1=new Node
Node *node2=new Node
node1->x=frame.left+BlockWidth
node1->y=frame.top
node1->next=NULL
snake.tail=node1
node2->x=frame.left
node2->y=frame.top
node2->next=snake.tail
snake.head=node2
snake.length=2
setfillstyle(SOLID_FILL,BLUE)
bar(snake.head->x+1,snake.head->y+1,snake.head->x+BlockWidth-1,snake.head->y+BlockHeight-1)
bar(snake.tail->x+1,snake.tail->y+1,snake.tail->x+BlockWidth-1,snake.tail->y+BlockHeight-1)
}
bool PlayGame()
{
int speed=300,key
Direction CurrentDirection=right
Node randomNode
Node newNode,outNode
bool neednode=true
bool overlap=false
int randx,randy
CreateSnake()
while(true)
{
if(neednode==true)
{
randomize()
do
{
randx=frame.left+rand()%RowOfFrame*BlockWidth
randy=frame.top+rand()%ColumnOfFrame*BlockHeight
for(Node *p=snake.headp!=NULLp=p->next)//hit itself
if(randx==p->x&&randy==p->y)
{overlap=truebreak}
}
while(overlap==true)
randomNode.x=randx
randomNode.y=randy
randomNode.next=NULL
setfillstyle(SOLID_FILL,RED)
bar(randomNode.x+1,randomNode.y+1,randomNode.x+BlockWidth-1,randomNode.y+BlockHeight-1)
neednode=false
}
if((key=bioskey(1))!=0)
{
switch(key)
{
case ESC: return false
case UP:
if(CurrentDirection!=down)
CurrentDirection=up
ClearKeyBuf()
break
case DOWN:
if(CurrentDirection!=up)
CurrentDirection=down
ClearKeyBuf()
break
case LEFT:
if(CurrentDirection!=right)
CurrentDirection=left
ClearKeyBuf()
break
case RIGHT:
if(CurrentDirection!=left)
CurrentDirection=right
ClearKeyBuf()
break
case PAGEUP:speed=speed-100
if(speed<100)
speed=100
ClearKeyBuf()
break
case PAGEDOWN:speed=speed+100
if(speed>500)
speed=500
ClearKeyBuf()
break
default :break
}
}
int headx=snake.tail->x
int heady=snake.tail->y
switch(CurrentDirection)
{
case up: heady-=BlockHeightbreak
case down: heady+=BlockHeightbreak
case left: headx-=BlockWidthbreak
case right: headx+=BlockWidthbreak
}
if(Hit(headx,heady)) //whether the snake hit the wall or itself
return GameOver()
else
{ //eat
if(headx==randomNode.x&&heady==randomNode.y)
{
Enqueue(randomNode)
setfillstyle(SOLID_FILL,BLUE)
bar(randomNode.x+1,randomNode.y+1,randomNode.x-1+BlockWidth,randomNode.y-1+BlockHeight)
neednode=true
}
else //no eat
{
newNode.x=headx
newNode.y=heady
newNode.next=NULL
Enqueue(newNode)
outNode=Dequeue()
setfillstyle(SOLID_FILL,LIGHTGRAY)
bar(outNode.x+1,outNode.y+1,outNode.x+BlockWidth-1,outNode.y+BlockHeight-1)
setfillstyle(SOLID_FILL,BLUE)
bar(newNode.x+1,newNode.y+1,newNode.x-1+BlockWidth,newNode.y-1+BlockHeight)
}
}
delay(speed)
}
}
void ClearKeyBuf()
{
do
bioskey(0)
while(bioskey(1))
}
void Foot(int x,int y)
{
setcolor(BLUE)
outtextxy(x,y,"writer:[T]RealXL E-MAIL:[email protected]")
}
void Head(int x,int y)
{
setcolor(RED)
outtextxy(x,y,"GREEDY SNAKE")
}
void Enqueue(Node inNode)
{
Node *p=new Node
p->x=inNode.x
p->y=inNode.y
p->next=inNode.next
snake.tail->next=p
snake.tail=p
snake.length++
}
Node Dequeue()
{
Node *p=snake.head
Node outNode=*p
snake.head=p->next
snake.length--
delete p
return outNode
}
int Hit(int x,int y)
{
if(x<frame.left||x>=frame.right||y<frame.top||y>=frame.bottom)//hit the wall
return 1
Node *p=snake.head->next
for(int i=snake.length-1i>3i--,p=p->next)//hit itself
if(x==p->x&&y==p->y)
return 1
return 0
}
bool GameOver()
{
int x=getmaxx()/2-50
int y=getmaxy()/2-20
setfillstyle(SOLID_FILL,DARKGRAY)
bar(x+3,y+3,x+103,y+43)
setfillstyle(SOLID_FILL,MAGENTA)
bar(x,y,x+100,y+40)
setlinestyle(0,3,1)
setcolor(RED)
rectangle(x,y,x+100,y+40)
outtextxy(x+20,y+10,"GAGE OVER!")
char c
while(true) //按q或Q表示退出程序,按r或R表示重新开始游戏
{
c=getch()
if(c=='q'||c=='Q')
return false
else if(c=='r'||c=='R')
return true
}
}
C++五子棋源程序:
#include
#include
#include
#define backcolor CYAN
#define defaultcolor BLACK
#define linecolor MAGENTA
#define player1_color RED
#define player2_color WHITE
#define error_color RED
#define winner_color RED
const int left=40
const int top=390
const int d=30
const int line_num=9
const int turn=0
const int r=d/3
const int j=10
int x,y,k=1,step=(line_num+1)*(line_num+1)
union REGS regs1,regs2
class player1
class player2
class qipan{
public:
qipan()
~qipan(){}
void init_qipan()
friend void fall(player1 &num1,player2 &num2,qipan &num)
friend void input(player1 &num1,player2 &num2,qipan &num)
private:
int point[line_num+1][line_num+1]
}
class player1{
public:
player1()
~player1(){}
friend void fall(player1 &num1,player2 &num2,qipan &num)
friend void input(player1 &num1,player2 &num2)
friend int judge_winner(player1 &num1,player2 &num2)
private:
int point1[line_num+1][line_num+1]
}
class player2{
public:
player2()
~player2(){}
friend void fall(player1 &num1,player2 &num2,qipan &num)
friend void input(player1 &num1,player2 &num2,qipan &num)
friend int judge_winner(player1 &num1,player2 &num2)
private:
int point2[line_num+1][line_num+1]
}
void input(player1 &num1,player2 &num2)
void fall(player1 &num1,player2 &num2,qipan &num)
int judge_winner(qipan &num,player1 &num1,player2 &num2)
void inputerror()
void display_winner(int)
void main()
{
int driver=DETECT,mode
initgraph(&driver,&mode,"e:\tc30\bgi")
qipan num
player1 num1
player2 num2
while(step--)
{
input(num1,num2,num)
fall(num1,num2,num)
if(judge_winner(num1,num2))
{
display_winner(k)
}
}
// getchar()
}
qipan::qipan(void)
{ int j,i
char ch[2]="0"
setbkcolor(backcolor)
setcolor(linecolor)
for(i=0i<=line_numi++)
{
line(left,top-i*d,left+line_num*d,top-i*d)
}
for(i=0i<=line_numi++)
{
line(left+i*d,top,left+i*d,top-line_num*d)
}
for(i=0i<=line_numi++)
{ if(*ch=='9'+1) *ch='a'
settextstyle(DEFAULT_FONT,HORIZ_DIR,1)
outtextxy(left+i*d-2,top+r+3,ch)
(*ch)=(*ch)+1
}
*ch='0'
for(i=0i<=line_numi++)
{if(*ch=='9'+1) *ch='a'
settextstyle(DEFAULT_FONT,HORIZ_DIR,1)
outtextxy(left-r-10,top-d*i-3,ch)
(*ch)=(*ch)+1
}
setcolor(defaultcolor)
for(i=0i<=line_numi++)
{
for(j=0j<=line_numj++)
point[i][j]=0
}
}
void fall(player1 &num1,player2 &num2,qipan &num)
{
int flag=k%2
if(flag)
{ setcolor(player2_color)
num2.point2[x][y]=1
num.point[x][y]=2
circle(left+d*x,top-d*y,r)
setfillstyle(1,player2_color)
floodfill(left+d*x,top-d*y,player2_color)
}
else
{ num1.point1[x][y]=1
num.point[x][y]=1
setcolor(player1_color)
circle(left+d*x,top-d*y,r)
setfillstyle(1,player1_color)
floodfill(left+d*x,top-d*y,player1_color)
}
setcolor(defaultcolor)
}
void input(player1 &num1,player2 &num2,qipan &num)
{ char xx,yy
k++
while(1)
{
regs1.h.ah=0
xx=int86(22,®s1,®s1)-'0'
if(xx==('q'-'0')||xx==('Q'-'0'))
{ step=0
return
}
regs1.h.ah=0
yy=int86(22,®s1,®s1)-'0'
if(yy==('q'-'0')||yy==('Q'-'0'))
{
step=0
return
}
if(xx<0||xx>line_num)
{ inputerror()
continue
}
if(yy<0||yy>line_num)
{inputerror()
continue
}
if(num.point[xx][yy]==0)
{
break
}
else
{
inputerror()
continue
}
}
x=(int)xx
y=(int)yy
setcolor(backcolor)
settextstyle(DEFAULT_FONT,HORIZ_DIR,1)
outtextxy(left+d*line_num/3,top+d*2,"Input error")
setcolor(defaultcolor)
}
player1::player1()
{
int i,j
for(i=0i<=line_numi++)
{
for(j=0j<=line_numj++)
point1[i][j]=0
}
}
player2::player2()
{ int i,j
for(i=0i<=line_numi++)
{
for(j=0j<=line_numj++)
point2[i][j]=0
}
}
void inputerror(void)
{ setcolor(error_color)
settextstyle(DEFAULT_FONT,HORIZ_DIR,1)
outtextxy(left+d*line_num/3,top+d*2,"Input error")
setcolor(defaultcolor)
}
int judge_winner(player1 &num1,player2 &num2)
{
int count=0,m=0,n=0,a=0,b=0,xx0,yy0
int flag=k%2
xx0=xyy0=y
if(!flag)
{ //left <------->right
while(xx0>=1&&m<4) {xx0--m++}
while(n<9&&xx0<=line_num)
{
if(num1.point1[xx0][y]==1)
{
count++
if(count==5) return 1
}
else
{
count=0
}
n++
xx0++
}
//up <------>down
count=0xx0=xm=0n=0
while(yy0>=1&&m<4){yy0--m++}
while(n<9&&yy0<=line_num)
{
if(num1.point1[x][yy0]==1)
{
count++
if(count==5)
return 1
}
else
{
count=0
}
n++
yy0++
}
//left up ----- right down
xx0=x
yy0=y
m=0
n=0
count=0
while(xx0>=1&&m<4){ xx0--a++m++} m=0
while(yy0<=line_num&&m<4){ yy0++b++m++}
if(a<=b)
{
xx0=x-ayy0=y+a
}
else
{
xx0=x-byy0=y+b
}
while(xx0<=line_num&&yy0>=0&&n<9)
{
if(num1.point1[xx0][yy0]==1)
{
count++
if(count==5)
return 1
}
else
{
count=0
}
xx0++
yy0--
n++
}
//right up <----->left down
count=0
a=0
b=0
n=0
m=0
xx0=x
yy0=y
while(xx0while(yy0if(a<=b)
{
xx0=x+a
yy0=y+a
}
else
{
xx0=x+b
yy0=y+b
}
while(xx0>=0&&yy0>=0&&n<9)
{
if(num1.point1[xx0][yy0]==1)
{
count++
if(count==5)
return 1
}
else
count=0
xx0--
yy0--
n++
}
//no winer
return 0
}
else
{
//left <------->right
while(xx0>=1&&m<4) {xx0--m++}
while(n<9&&xx0<=line_num)
{
if(num1.point1[xx0][y]==1)
{
count++
if(count==5) return 1
}
else
{
count=0
}
n++
xx0++
}
//up <------>down
count=0xx0=xm=0n=0
while(yy0>=1&&m<4){yy0--m++}
while(n<9&&yy0<=line_num)
{
if(num2.point2[x][yy0]==1)
{
count++
if(count==5)
return 1
}
else
{
count=0
}
n++
yy0++
}
//left up ----- right down
xx0=x
yy0=y
m=0
n=0
count=0
while(xx0>=1&&m<4){ xx0--a++m++} m=0
while(yy0<=line_num&&m<4){ yy0++b++m++}
if(a<=b)
{
xx0=x-ayy0=y+a
}
else
{
xx0=x-byy0=y+b
}
while(xx0<=line_num&&yy0>=0&&n<9)
{
if(num2.point2[xx0][yy0]==1)
{
count++
if(count==5)
return 1
}
else
{
count=0
}
xx0++
yy0--
n++
}
//right up <----->left down
count=0
a=0
b=0
n=0
m=0
xx0=x
yy0=y
while(xx0while(yy0if(a<=b)
{
xx0=x+a
yy0=y+a
}
else
{
xx0=x+b
yy0=y+b
}
while(xx0>=0&&yy0>=0&&n<9)
{
if(num2.point2[xx0][yy0]==1)
{
count++
if(count==5)
return 1
}
else
count=0
xx0--
yy0--
n++
}
//no winer
return 0
}
}
void display_winner(int k)
{
int flag=k%2
if(!flag)
{ setcolor(winner_color)
settextstyle(DEFAULT_FONT,HORIZ_DIR,2)
outtextxy(left+d*2,top+40,"Red is winner")
setcolor(defaultcolor)
step=0
getchar()
}
else
{ setcolor(winner_color)
settextstyle(DEFAULT_FONT,HORIZ_DIR,2)
outtextxy(left+2*d,top+40,"White is winner")
setcolor(defaultcolor)
step=0
}
}
intShutOne(int
time)
{
//计时清零,
//3秒,2秒,1秒到开始显示一随机字符;
//从键盘读入一字符直到是显示的字符,超过10次返回负;
//得到结束时间,
//求得射击时间TimShut=时间-3000毫秒;
//电脑产生一随机数Trand,比如time+randomize(1000);//假定1000ms内能完成射击,这里time(ms)时间是游戏难度,
//返回
:Trand
-
TimShut
电脑时间》
射击时间为玩家胜。0,或
负
}
int
main(void)
{
int
x,result=0
......
for(i=0
i<10
i++)
{
x=ShutOne(500)
//难度为
500ms
if(x>0)
result++
}
if(result==5)
//again
{
x=ShutOne(500)
f(x>0)
result++
}
if(result》5)
输出玩家胜;
否则:
玩家负
}