用C++编写的小游戏源代码

用C++编写的小游戏源代码,第1张

五子棋的代码:

#include<iostream>

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

usingnamespacestd

constintN=15         //15*15的棋盘

constcharChessBoardflag=''     //棋盘标志

constcharflag1='o'       //玩家1或电脑的棋子标志

constcharflag2='X'       //玩家2的棋子标志

typedefstructCoordinate     //坐标类

{

intx             //代表行

inty             //代表列

}Coordinate

classGoBang          //五子棋类

{

public:

GoBang()        //初始化

{

InitChessBoard()

}

voidPlay()        //下棋

{

CoordinatePos1   //玩家1或电脑

CoordinatePos2   //玩家2

intn=0

while(1)

{

intmode=ChoiceMode()

while(1)

{

if(mode==1)    //电脑vs玩家

{

ComputerChess(Pos1,flag1)   //电脑下棋

if(GetVictory(Pos1,0,flag1)==1)   //0表示电脑,真表示获胜

break

PlayChess(Pos2,2,flag2)   //玩家2下棋

if(GetVictory(Pos2,2,flag2))   //2表示玩家2

break

}

else      //玩家1vs玩家2

{

PlayChess(Pos1,1,flag1)   //玩家1下棋

if(GetVictory(Pos1,1,flag1))   //1表示玩家1

break

PlayChess(Pos2,2,flag2)   //玩家2下棋

if(GetVictory(Pos2,2,flag2)) //2表示玩家2

break

}

}

cout<<"***再来一局***"<<endl

cout<<"yorn:"

charc='y'

cin>>c

if(c=='n')

break

}

}

protected:

intChoiceMode()      //选择模式

{

inti=0

system("cls")    //系统调用,清屏

InitChessBoard()    //重新初始化棋盘

cout<<"***0、退出 1、电脑vs玩家 2、玩家vs玩家***"<<endl

while(1)

{

cout<<"请选择:"

cin>>i

if(i==0)     //选择0退出

exit(1)

if(i==1||i==2)

returni

cout<<"输入不合法"<<endl

}

}

voidInitChessBoard()   //初始化棋盘

{

for(inti=0i<N+1++i)

{

for(intj=0j<N+1++j)

{

_ChessBoard[i][j]=ChessBoardflag

}

}

}

voidPrintChessBoard()  //打印棋盘,这个函数可以自己调整

{

system("cls")        //系统调用,清空屏幕

for(inti=0i<N+1++i)

{

for(intj=0j<N+1++j)

{

if(i==0)                //打印列数字

{

if(j!=0)

printf("%d ",j)

else

printf("  ")

}

elseif(j==0)        //打印行数字

printf("%2d",i)

else

{

if(i<N+1)

{

printf("%c|",_ChessBoard[i][j])

}

}

}

cout<<endl

cout<<"  "

for(intm=0m<Nm++)

{

printf("--|")

}

cout<<endl

}

}

voidPlayChess(Coordinate&pos,intplayer,intflag)    //玩家下棋

{

PrintChessBoard()     //打印棋盘

while(1)

{

printf("玩家%d输入坐标:",player)

cin>>pos.x>>pos.y

if(JudgeValue(pos)==1)     //坐标合法

break

cout<<"坐标不合法,重新输入"<<endl

}

_ChessBoard[pos.x][pos.y]=flag

}

voidComputerChess(Coordinate&pos,charflag)    //电脑下棋

{

PrintChessBoard()     //打印棋盘

intx=0

inty=0

while(1)

{

x=(rand()%N)+1   //产生1~N的随机数

srand((unsignedint)time(NULL))

y=(rand()%N)+1   //产生1~N的随机数

srand((unsignedint)time(NULL))

if(_ChessBoard[x][y]==ChessBoardflag)   //如果这个位置是空的,也就是没有棋子

break

}

pos.x=x

pos.y=y

_ChessBoard[pos.x][pos.y]=flag

}

intJudgeValue(constCoordinate&pos)    //判断输入坐标是不是合法

{

if(pos.x>0&&pos.x<=N&&pos.y>0&&pos.y<=N)

{

if(_ChessBoard[pos.x][pos.y]==ChessBoardflag)

{

return1  //合法

}

}

return0    //非法

}

intJudgeVictory(Coordinatepos,charflag)      //判断有没有人胜负(底层判断)

{

intbegin=0

intend=0

intbegin1=0

intend1=0

//判断行是否满足条件

(pos.y-4)>0?begin=(pos.y-4):begin=1

(pos.y+4)>N?end=N:end=(pos.y+4)

for(inti=pos.x,j=beginj+4<=endj++)

{

if(_ChessBoard[i][j]==flag&&_ChessBoard[i][j+1]==flag&&

_ChessBoard[i][j+2]==flag&&_ChessBoard[i][j+3]==flag&&

_ChessBoard[i][j+4]==flag)

return1

}

//判断列是否满足条件

(pos.x-4)>0?begin=(pos.x-4):begin=1

(pos.x+4)>N?end=N:end=(pos.x+4)

for(intj=pos.y,i=begini+4<=endi++)

{

if(_ChessBoard[i][j]==flag&&_ChessBoard[i+1][j]==flag&&

_ChessBoard[i+2][j]==flag&&_ChessBoard[i+3][j]==flag&&

_ChessBoard[i+4][j]==flag)

return1

}

intlen=0

//判断主对角线是否满足条件

pos.x>pos.y?len=pos.y-1:len=pos.x-1

if(len>4)

len=4

begin=pos.x-len    //横坐标的起始位置

begin1=pos.y-len   //纵坐标的起始位置

pos.x>pos.y?len=(N-pos.x):len=(N-pos.y)

if(len>4)

len=4

end=pos.x+len    //横坐标的结束位置

end1=pos.y+len   //纵坐标的结束位置

for(inti=begin,j=begin1(i+4<=end)&&(j+4<=end1)++i,++j)

{

if(_ChessBoard[i][j]==flag&&_ChessBoard[i+1][j+1]==flag&&

_ChessBoard[i+2][j+2]==flag&&_ChessBoard[i+3][j+3]==flag&&

_ChessBoard[i+4][j+4]==flag)

return1

}

//判断副对角线是否满足条件

(pos.x-1)>(N-pos.y)?len=(N-pos.y):len=pos.x-1

if(len>4)

len=4

begin=pos.x-len    //横坐标的起始位置

begin1=pos.y+len   //纵坐标的起始位置

(N-pos.x)>(pos.y-1)?len=(pos.y-1):len=(N-pos.x)

if(len>4)

len=4

end=pos.x+len    //横坐标的结束位置

end1=pos.y-len   //纵坐标的结束位置

for(inti=begin,j=begin1(i+4<=end)&&(j-4>=end1)++i,--j)

{

if(_ChessBoard[i][j]==flag&&_ChessBoard[i+1][j-1]==flag&&

_ChessBoard[i+2][j-2]==flag&&_ChessBoard[i+3][j-3]==flag&&

_ChessBoard[i+4][j-4]==flag)

return1

}

for(inti=1i<N+1++i)      //棋盘有没有下满

{

for(intj=1j<N+1++j)

{

if(_ChessBoard[i][j]==ChessBoardflag)

return0           //0表示棋盘没满

}

}

return-1   //和棋

}

boolGetVictory(Coordinate&pos,intplayer,intflag)  //对JudgeVictory的一层封装,得到具体那个玩家获胜

{

intn=JudgeVictory(pos,flag)  //判断有没有人获胜

if(n!=0)          //有人获胜,0表示没有人获胜

{

PrintChessBoard()

if(n==1)        //有玩家赢棋

{

if(player==0)   //0表示电脑获胜,1表示玩家1,2表示玩家2

printf("***电脑获胜***\n")

else

printf("***恭喜玩家%d获胜***\n",player)

}

else

printf("***双方和棋***\n")

returntrue   //已经有人获胜

}

returnfalse  //没有人获胜

}

private:

char_ChessBoard[N+1][N+1]

}

扩展资料:

设计思路

1、进行问题分析与设计,计划实现的功能为,开局选择人机或双人对战,确定之后比赛开始。

2、比赛结束后初始化棋盘,询问是否继续比赛或退出,后续可加入复盘、悔棋等功能。

3、整个过程中,涉及到了棋子和棋盘两种对象,同时要加上人机对弈时的AI对象,即涉及到三个对象。

"扫雷"小游戏C代码

#include<stdio.h>

#include<math.h>

#include<time.h>

#include<stdlib.h>

main( )

{char a[102][102],b[102][102],c[102][102],w

int i,j /*循环变量*/

int x,y,z[999] /*雷的位置*/

int t,s /*标记*/

int m,n,lei /*计数*/

int u,v /*输入*/

int hang,lie,ge,mo /*自定义变量*/

srand((int)time(NULL)) /*启动随机数发生器*/

leb1:  /*选择模式*/

printf("\n   请选择模式:\n   1.标准  2.自定义\n")

scanf("%d",&mo)

if(mo==2)  /*若选择自定义模式,要输入三个参数*/

{do

{t=0printf("请输入\n行数 列数 雷的个数\n")

scanf("%d%d%d",&hang,&lie,&ge)

if(hang<2){printf("行数太少\n")t=1}

if(hang>100){printf("行数太多\n")t=1}

if(lie<2){printf("列数太少\n")t=1}

if(lie>100){printf("列数太多\n")t=1}

if(ge<1){printf("至少要有一个雷\n")t=1}

if(ge>=(hang*lie)){printf("雷太多了\n")t=1}

}while(t==1)

}

else{hang=10,lie=10,ge=10}  /*否则就是选择了标准模式(默认参数)*/

for(i=1i<=gei=i+1)  /*确定雷的位置*/

{do

{t=0z[i]=rand( )%(hang*lie)

for(j=1j<ij=j+1){if(z[i]==z[j]) t=1}

}while(t==1)

}

for(i=0i<=hang+1i=i+1)  /*初始化a,b,c*/

{for(j=0j<=lie+1j=j+1) {a[i][j]='1'b[i][j]='1'c[i][j]='0'} }

for(i=1i<=hangi=i+1)

{for(j=1j<=liej=j+1) {a[i][j]='+'} }

for(i=1i<=gei=i+1)  /*把雷放入c*/

{x=z[i]/lie+1y=z[i]%lie+1c[x][y]='#'}

for(i=1i<=hangi=i+1)  /*计算b中数字*/

{for(j=1j<=liej=j+1)

{m=48

if(c[i-1][j-1]=='#')m=m+1if(c[i][j-1]=='#')m=m+1

if(c[i-1][j]=='#')m=m+1 if(c[i+1][j+1]=='#')m=m+1

if(c[i][j+1]=='#')m=m+1 if(c[i+1][j]=='#')m=m+1

if(c[i+1][j-1]=='#')m=m+1if(c[i-1][j+1]=='#')m=m+1

b[i][j]=m

}

}

for(i=1i<=gei=i+1)  /*把雷放入b中*/

{x=z[i]/lie+1y=z[i]%lie+1b[x][y]='#'}

lei=ge /*以下是游戏设计*/

do

{leb2:  /*输出*/

system("cls")printf("\n\n\n\n")

printf("    ")

for(i=1i<=liei=i+1)

{w=(i-1)/10+48printf("%c",w)

w=(i-1)%10+48printf("%c  ",w)

}

printf("\n   |")

for(i=1i<=liei=i+1){printf("---|")}

printf("\n")

for(i=1i<=hangi=i+1)

{w=(i-1)/10+48printf("%c",w)

w=(i-1)%10+48printf("%c |",w)

for(j=1j<=liej=j+1)

{if(a[i][j]=='0')printf("   |")

else printf(" %c |",a[i][j])

}

if(i==2)printf(" 剩余雷个数")

if(i==3)printf(" %d",lei)

printf("\n   |")

for(j=1j<=liej=j+1){printf("---|")}

printf("\n")

}

scanf("%d%c%d",&u,&w,&v) /*输入*/

u=u+1,v=v+1

if(w!='#'&&a[u][v]=='@')

goto leb2

if(w=='#')

{if(a[u][v]=='+'){a[u][v]='@'lei=lei-1}

else if(a[u][v]=='@'){a[u][v]='?'lei=lei+1}

else if(a[u][v]=='?'){a[u][v]='+'}

goto leb2

}

a[u][v]=b[u][v]

leb3:  /*打开0区*/

t=0

if(a[u][v]=='0')

{for(i=1i<=hangi=i+1)

{for(j=1j<=liej=j+1)

{s=0

if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1

if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1

if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1

if(a[i][j-1]=='0')s=1 if(a[i][j+1]=='0')s=1

if(s==1)a[i][j]=b[i][j]

}

}

for(i=1i<=hangi=i+1)

{for(j=liej>=1j=j-1)

{s=0

if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1

if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1

if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1

if(a[i][j-1]=='0')s=1   if(a[i][j+1]=='0')s=1

if(s==1)a[i][j]=b[i][j]

}

}

for(i=hangi>=1i=i-1)

{for(j=1j<=liej=j+1)

{s=0

if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1

if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1

if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1

if(a[i][j-1]=='0')s=1 if(a[i][j+1]=='0')s=1

if(s==1)a[i][j]=b[i][j]

}

}

for(i=hangi>=1i=i-1)

{for(j=liej>=1j=j-1)

{s=0

if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1

if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1

if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1

if(a[i][j-1]=='0')s=1  if(a[i][j+1]=='0')s=1

if(s==1)a[i][j]=b[i][j]

}

}

for(i=1i<=hangi=i+1)  /*检测0区*/

{for(j=1j<=liej=j+1)

{if(a[i][j]=='0')

{if(a[i-1][j-1]=='+'||a[i-1][j-1]=='@'||a[i-1][j-1]=='?')t=1

if(a[i-1][j+1]=='+'||a[i-1][j+1]=='@'||a[i-1][j+1]=='?')t=1

if(a[i+1][j-1]=='+'||a[i+1][j-1]=='@'||a[i+1][j-1]=='?')t=1

if(a[i+1][j+1]=='+'||a[i+1][j+1]=='@'||a[i+1][j+1]=='?')t=1

if(a[i+1][j]=='+'||a[i+1][j]=='@'||a[i+1][j]=='?')t=1

if(a[i][j+1]=='+'||a[i][j+1]=='@'||a[i][j+1]=='?')t=1

if(a[i][j-1]=='+'||a[i][j-1]=='@'||a[i][j-1]=='?')t=1

if(a[i-1][j]=='+'||a[i-1][j]=='@'||a[i-1][j]=='?')t=1

}

}

}

if(t==1)goto leb3

}

n=0 /*检查结束*/

for(i=1i<=hangi=i+1)

{for(j=1j<=liej=j+1)

{if(a[i][j]!='+'&&a[i][j]!='@'&&a[i][j]!='?')n=n+1}

}

}

while(a[u][v]!='#'&&n!=(hang*lie-ge))

for(i=1i<=gei=i+1)  /*游戏结束*/

{x=z[i]/lie+1y=z[i]%lie+1a[x][y]='#'}

printf("    ")

for(i=1i<=liei=i+1)

{w=(i-1)/10+48printf("%c",w)

w=(i-1)%10+48printf("%c  ",w)

}

printf("\n   |")

for(i=1i<=liei=i+1){printf("---|")}

printf("\n")

for(i=1i<=hangi=i+1)

{w=(i-1)/10+48printf("%c",w)

w=(i-1)%10+48printf("%c |",w)

for(j=1j<=liej=j+1)

{if(a[i][j]=='0')printf(" |")

else  printf(" %c |",a[i][j])

}

if(i==2)printf(" 剩余雷个数")

if(i==3)printf(" %d",lei)printf("\n   |")

for(j=1j<=liej=j+1) {printf("---|")}

printf("\n")

}

if(n==(hang*lie-ge)) printf("你成功了!\n")

else printf("    游戏结束!\n")

printf("    重玩请输入1\n")

t=0

scanf("%d",&t)

if(t==1)goto leb1

}

/*注:在DEV c++上运行通过。行号和列号都从0开始,比如要确定第0行第9列不是“雷”,就在0和9中间加入一个字母,可以输入【0a9】三个字符再按回车键。3行7列不是雷,则输入【3a7】回车;第8行第5列是雷,就输入【8#5】回车,9行0列是雷则输入【9#0】并回车*/

Python程序开发之简单小程序实例

(11)小 游戏 -跳动的小球

一、项目功能

用户控制挡板来阻挡跳动的小球

二、项目分析

根据项目功能自定义两个类,一个用于控制小球在窗体中的运动,一个用于接收用户按下左右键时,挡板在窗体中的运动。在控制小球的类中,我们还需要考虑当小球下降时,碰到挡板时的位置判断。

三、程序源代码

源码部分截图:

源码:

#!/usr/bin/python3.6

# -*- coding: GBK -*-

#导入相应模块

from tkinter import *

import random

import time

#自定义小球的类 Ball

class Ball:

# 初始化

def __init__(self,canvas,paddle,color):

#传递画布值

self.canvas=canvas

#传递挡板值

self.paddle=paddle

#画圆并且保存其ID

self.id=canvas.create_oval(10,10,25,25,fill=color)

self.canvas.move(self.id,245,100)

#小球的水平位置起始列表

start=[-3,-2,-1,1,2,3]

#随机化位置列表

random.shuffle(start)

self.x=start[0]

self.y=-2

self.canvas_heigh=self.canvas.winfo_height()#获取窗口高度并保存

self.canvas_width=self.canvas.winfo_width()

#根据参数值绘制小球

def draw(self):

self.canvas.move(self.id,self.x,self.y)

pos=self.canvas.coords(self.id)#返回相应ID代表的图形的当前坐标(左上角和右上角坐标)

#使得小球不会超出窗口

pad=self.canvas.coords(self.paddle.id)#获取小球挡板的坐标

if pos[1]=self.canvas_heigh or(pos[3]>=pad[1] and pos[2]>=pad[0] and pos[2]


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8152071.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存