没有输赢判定的话还是挺容易的
#include <iostream>#include <list>
#include <time.h>
using namespace std
/* 判断游戏是否结束 */
bool over(char ch[], int num)
/* 打印数组 */
void printGame(char game[], int num)
int takeNum()
int main()
{
const int MaxCount = 9
char game[MaxCount] // 存储整个数组
// 存储有效值,即还能下子的位置
list<int> valid
// 生成随机种数,使得每次生成的随机值不一样
srand(time(nullptr))
for (int i = 0 i < MaxCount i++)
{
game[i] = '1' + i
valid.push_back(i + 1)
}
int place
while (!over(game, MaxCount))
{
printGame(game, MaxCount)
place = takeNum()
// 如果不是数字,即该位置已被落子,则要重新下
while (!isdigit(game[place - 1]))
{
cout << "The place you entered has been taken, please enter a number not taken.\n"
place = takeNum()
}
// 将当前落子的位置从有效值列表中删除,这样电脑就不会选择已落子的位置了
valid.remove(place)
cout << endl
game[place - 1] = 'X'
printGame(game, MaxCount)
// 如果已无子可下,则程序结束
if (valid.empty())
break
cout << "Wait for the computer ...\n"
int index = rand() % valid.size()
// 通过迭代器取出指定下标的元素
list<int>::iterator it = valid.begin()
while (index-- > 0)
++it
place = *it
valid.remove(place)
game[place - 1] = 'O'
}
system("pause")
return 0
}
bool over(char ch[], int num)
{
for (int i = 0 i < num i++)
{
// 如果是数字的话代表游戏还未结束
if (isdigit(ch[i]))
return false
}
return true
}
void printGame(char game[], int num)
{
for (int i = 0 i < num i++)
{
cout.width(2)
cout << game[i]
if ((i + 1) % 3 == 0)
cout << endl
}
cout << endl
}
int takeNum()
{
int place
cout << "Enter the number you want to place: "
cin >> place
while (place < 1 || place > 9)
{
cout << "Please input a number between 1 and 9: "
cin >> place
}
return place
}
第一步是准备,不关C++的事,包括游戏的故事背景、情节。而后设计游戏的方式、确定开发工具,把剧本变为可以关卡化的章节。第二步分为两组,一组把各个章节的剧本要素(人物、景物),设计美工,按照剧本的要求对游戏元素进行建模;二组设计底层的事件驱动、地图系统、IO和AI,用简单的模型测试,比如人物用圆球,子d用圆柱暂时代替,AI 测试甚至可以是基于底层数据的,无需可视化。
第三步,拼接,把框架与美工元素整合起来。
而后就是调试发布。
用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()//绘制游戏结束时d出的对话框
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:realgeneral@hotmail.com")
}
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
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)