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

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

五子棋的代码:

#include<iostream>

#include<stdio.h>

#include<stdlib.h>

#include <time.h>

using namespace std

const int N=15                 //15*15的棋盘

const char ChessBoardflag = ' '          //棋盘标志

const char flag1='o'              //玩家1或电脑的棋子标志

const char flag2='X'              //玩家2的棋子标志

typedef struct Coordinate          //坐标类

int x                         //代表行

int y                         //代表列

}Coordinate

class GoBang                    //五子棋类

{

public:

GoBang()                //初始化

{

InitChessBoard()

}

void Play()               //下棋

{

Coordinate Pos1      // 玩家1或电脑

Coordinate Pos2      //玩家2

int n = 0

while (1)

{

int mode = 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 <<"y or n :"

char c = 'y'

cin >>c

if (c == 'n')

break

}     

}

protected:

int ChoiceMode()           //选择模式

{

int i = 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)

return i

cout <<"输入不合法" <搭旅州<endl

}

}

void InitChessBoard()      //初始化棋盘

{

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

{

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

{

_ChessBoard[i][j] = ChessBoardflag

}

}

}

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

{

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

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

{

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

{

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

{

if (j!=0)

printf("%d  ", j)

else

printf("   ")

}

else if (j == 0)                //打印行数字

printf("%2d ", i)

else

{

if (i <N+1)

{

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

}

}

}

cout <<endl

cout <<"   "

for (int m = 0m <Nm++)

{

printf("--|")

}

cout <<endl

}

}

void PlayChess(Coordinate&pos, int player, int flag)       //玩家下棋

{

PrintChessBoard()         //打印棋盘

while (1)

{

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

cin >>pos.x >>pos.y

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

break

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

}

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

}

void ComputerChess(Coordinate&pos, char flag)       //电脑下棋

{

PrintChessBoard()         //打印棋盘

int x = 0

int y = 0

while (1)

{

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

srand((unsigned int) time(NULL))

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

srand((unsigned int) time(NULL))

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

break

}

pos.x = x

pos.y = y

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

}

int JudgeValue(const Coordinate&pos)       //判断输入坐标是不是合法

{

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

{

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

{

return 1    //合法

}

}

return 0        //非法

}

int JudgeVictory(Coordinate pos, char flag)           //判断有没有人胜负(底层判断)

{

int begin = 0

int end = 0

int begin1 = 0

int end1 = 0

//判断行是否满足条件

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

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

for (int i = 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)

return 1

}

//判断列是否满足条件

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

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

for (int j = 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)

return 1

}

int len = 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 (int i = 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)

return 1

}

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

(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 (int i = 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)

return 1

}

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

{

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

{

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

return 0                      //0表示棋盘没满

}

}

return -1      //和棋

}

bool GetVictory(Coordinate&pos, int player, int flag)   //对JudgeVictory的一层封装,得到具体那个玩家获胜

{

int n = 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")

return true      //已经有人获胜

}

return false   //没有人获胜

}

private:

char _ChessBoard[N+1][N+1]   

}

扩展资料:

设计思路

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

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

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

*******************************************************************/

/* ALEX_LEE 五子棋 C语言小程序 */

/* o(∩_∩)o...可以用来复习一下C语言的小程序*/

/*My Blog:hi.baidu.com/毕嫌alexlee321*/

/******************************************************************/

/**********************************************************/

#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 KEYEXIT0/*退出键*/

#define KEYFALLCHESS 1/*落子键*/

#define KEYMOVECURSOR 2/*光标移动键*/

#define KEYINVALID 3/*无效键*/

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

#define TRUE1

#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]/*用于记录棋盘上各点的状态*/

/**********************************************************/

/**********************************************************/

/*主函数*/

void main()

{

int press

int bOutWhile=FALSE/*退出循环标志*/

Init()/*初始化图象,数据*/

while(1)

{

press=GetKey()/*获取用户的按键值*/

switch(CheckKey(press))/*判断按键类别*/

{

/*是退出键*/

case KEYEXIT:

clrscr()/*清屏*/

bOutWhile = TRUE

break

/*是落子键*/

case KEYFALLCHESS:

if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/

DoError()/*落子错误*/

else

{

DoOK()/*落子正确*/

/*如果当前行棋方赢棋*/

if(JudgeWin(gPlayOrder,gCursor)==TRUE)

{

DoWin(gPlayOrder)

bOutWhile = TRUE/*退出循环标志置为真*/

}

/*否则*/

else

/*交换行棋方*/

ChangeOrder()

}

break

/*是光标移动键*/

case KEYMOVECURSOR:

MoveCursor(gPlayOrder,press)

break

/*是无效键*/

case KEYINVALID:

break

}

if(bOutWhile==TRUE)

break

}

/*游戏结束*/

EndGame()

}

/**********************************************************/

/*界面初始化,数据初始化*/

void Init(void)

{

int i,j

char *Msg[]=

{

"Player1 key:",

" UP----w",

" DOWN--s",

" LEFT--a",

" RIGHT-d",

" DO----space",

"",

"Player2 key:",

" UP----up",

" DOWN--down",

" LEFT--left",

" RIGHT-right",

" DO----ENTER",

"",

"exit game:",

" ESC",

NULL,

}

/*先手方为1号玩家*/

gPlayOrder = CHESS1

/*棋盘数据清零, 即棋盘上各点开始的时候都没有棋子*/

for(i=0i<19i++)

for(j=0j<19j++)

gChessBoard[i][j]=CHESSNULL

/*光标初始位置*/

gCursor.x=gCursor.y=0

/*画棋盘*/

textmode(C40)

DrawMap()

/*显示 *** 作键说明*/

i=0

textcolor(BROWN)

while(Msg[i]!=NULL)

{

gotoxy(25,3+i)

cputs(Msg[i])

i++

}

/*显示当前行棋方*/

ShowOrderMsg(gPlayOrder)

/*光标移至棋盘的左上角点处*/

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT)

}

/*画棋盘*/

void DrawMap(void)

{

int i,j

clrscr()

for(i=0i<19i++)

for(j=0j<19j++)

DrawCross(i,j)

}

/*画棋盘上的交叉点*/

void DrawCross(int x,int y)

{

gotoxy(x+MAPXOFT,y+MAPYOFT)

/*交叉点上是一号玩家的棋子*/

if(gChessBoard[x][y]==CHESS1)

{

textcolor(LIGHTBLUE)

putch(CHESS1)

return

}

/*交叉点上是二号玩家的棋子*/

if(gChessBoard[x][y]==CHESS2)

{

textcolor(LIGHTBLUE)

putch(CHESS2)

return

}

textcolor(GREEN)

/*左上角交叉点*/

if(x==0&&y==0)

{

putch(CROSSLU)

return

}

/*左下角交叉点*/

if(x==0&&y==18)

{

putch(CROSSLD)

return

}

/*右上角交叉点*/

if(x==18&&y==0)

{

putch(CROSSRU)

return

}

/*右下角交叉点*/

if(x==18&&y==18)

{

putch(CROSSRD)

return

}

/*左边界交叉点*/

if(x==0)

{

putch(CROSSL)

return

}

/*右边界交叉点*/

if(x==18)

{

putch(CROSSR)

return

}

/*上边界交叉点*/

if(y==0)

{

putch(CROSSU)

return

}

/*下边界交叉点*/

if(y==18)

{

putch(CROSSD)

return

}

/*棋盘中间的交叉点*/

putch(CROSS)

}

/*交换行棋方*/

int ChangeOrder(void)

{

if(gPlayOrder==CHESS1)

gPlayOrder=CHESS2

else

gPlayOrder=CHESS1

return(gPlayOrder)

}

/*获取按键值*/

int GetKey(void)

{

char lowbyte

int press

while (bioskey(1) == 0)

/*如果用户没有按键,空循环*/

press=bioskey(0)

lowbyte=press&0xff

press=press&0xff00 + toupper(lowbyte)

return(press)

}

/*落子错误处理*/

void DoError(void)

{

sound(1200)

delay(50)

nosound()

}

/*赢棋处理*/

void DoWin(int Order)

{

sound(1500)delay(100)

sound(0) delay(50)

sound(800)delay(100)

sound(0) delay(50)

sound(1500)delay(100)

sound(0) delay(50)

sound(800)delay(100)

sound(0) delay(50)

nosound()

textcolor(RED+BLINK)

gotoxy(25,20)

if(Order==CHESS1)

cputs("PLAYER1 WIN!")

else

cputs("PLAYER2 WIN!")

gotoxy(25,21)

cputs(" \\<^+^>/")

getch()

}

/*走棋*/

int ChessGo(int Order,struct point Cursor)

{

/*判断交叉点上有无棋子*/

if(gChessBoard[Cursor.x][Cursor.y]==CHESSNULL)

{

/*若没有棋子, 则可以落子*/

gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT)

textcolor(LIGHTBLUE)

putch(Order)

gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT)

gChessBoard[Cursor.x][Cursor.y]=Order

return TRUE

}

else

return FALSE

}

/*判断当前行棋方落子后是否赢棋*/

int JudgeWin(int Order,struct point Cursor)

{

int i

for(i=0i<4i++)

/*判断在指定方向上是否有连续5个行棋方的棋子*/

if(JudgeWinLine(Order,Cursor,i))

return TRUE

return FALSE

}

/*判断在指定方向上是否有连续5个行棋方的棋子*/

int JudgeWinLine(int Order,struct point Cursor,int direction)

{

int i

struct point pos,dpos

const int testnum = 5

int count

switch(direction)

{

case 0:/*在水平方向*/

pos.x=Cursor.x-(testnum-1)

pos.y=Cursor.y

dpos.x=1

dpos.y=0

break

case 1:/*在垂直方向*/

pos.x=Cursor.x

pos.y=Cursor.y-(testnum-1)

dpos.x=0

dpos.y=1

break

case 2:/*在左下至右上的斜方向*/

pos.x=Cursor.x-(testnum-1)

pos.y=Cursor.y+(testnum-1)

dpos.x=1

dpos.y=-1

break

case 3:/*在左上至右下的斜方向*/

pos.x=Cursor.x-(testnum-1)

pos.y=Cursor.y-(testnum-1)

dpos.x=1

dpos.y=1

break

}

count=0

for(i=0i<testnum*2+1i++)

{

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

{

if(gChessBoard[pos.x][pos.y]==Order)

{

count++

if(count>=testnum)

return TRUE

}

else

count=0

}

pos.x+=dpos.x

pos.y+=dpos.y

}

return FALSE

}

/*移动光标*/

void MoveCursor(int Order,int press)

{

switch(press)

{

case PLAY1UP:

if(Order==CHESS1&&gCursor.y>0)

gCursor.y--

break

case PLAY1DOWN:

if(Order==CHESS1&&gCursor.y<18)

gCursor.y++

break

case PLAY1LEFT:

if(Order==CHESS1&&gCursor.x>0)

gCursor.x--

break

case PLAY1RIGHT:

if(Order==CHESS1&&gCursor.x<18)

gCursor.x++

break

case PLAY2UP:

if(Order==CHESS2&&gCursor.y>0)

gCursor.y--

break

case PLAY2DOWN:

if(Order==CHESS2&&gCursor.y<18)

gCursor.y++

break

case PLAY2LEFT:

if(Order==CHESS2&&gCursor.x>0)

gCursor.x--

break

case PLAY2RIGHT:

if(Order==CHESS2&&gCursor.x<18)

gCursor.x++

break

}

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT)

}

/*游戏结束处理*/

void EndGame(void)

{

textmode(C80)

}

/*显示当前行棋方*/

void ShowOrderMsg(int Order)

{

gotoxy(6,MAPYOFT+20)

textcolor(LIGHTRED)

if(Order==CHESS1)

cputs("Player1 go!")

else

cputs("Player2 go!")

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT)

}

/*落子正确处理*/

void DoOK(void)

{

sound(500)

delay(70)

sound(600)

delay(50)

sound(1000)

delay(100)

nosound()

}

/*检查用户的按键类别*/

int CheckKey(int press)

{

if(press==ESCAPE)

return KEYEXIT/*是退出键*/

else

if

( ( press==PLAY1DO &&gPlayOrder==CHESS1) ||

( press==PLAY2DO &&gPlayOrder==CHESS2)

)

return KEYFALLCHESS/*是落子键*/

else

if

( press==PLAY1UP || press==PLAY1DOWN ||

press==PLAY1LEFT || press==PLAY1RIGHT ||

press==PLAY2UP || press==PLAY2DOWN ||

press==PLAY2LEFT || press==PLAY2RIGHT

)

return KEYMOVECURSOR/*是光标移动键*/

else

return KEYINVALID/*按键无效*/

}

黑白棋游戏

#include "graphics.h" /*图形系统头文件*/

#define LEFT 0x4b00 /*光标左键值*/

#define RIGHT 0x4d00 /*光标右键值*/

#define DOWN 0x5000 /*光标下键值*/

#define UP 0x4800 /*光标上键值*/

#define ESC 0x011b /* ESC键值*/

#define ENTER 0x1c0d /* 回车键值*/

int a[8][8]={0},key,score1,score2/*具体分数以及按键与存放棋子的变量*/

char playone[3],playtwo[3]/*两个人的得分转换成字符串输出*/

void playtoplay(void)/*人人对战函数*/

void DrawQp(void)/*画棋盘函数*/

void SetPlayColor(int x)/*设置棋子第一次的颜色*/

void MoveColor(int x,int y)/*恢复原来棋盘状态*/

int QpChange(int x,int y,int z)/*判断棋盘的变化*/

void DoScore(void)/*处理分数*/

void PrintScore(int n)/*输出成绩*/

void playWin(void)/*输出胜利者信息*/

/******主函数*********/

void main(void)

{

int gd=DETECT,gr

initgraph(&gd,&gr,"c:\\tc")/*初始化图形系统*/

DrawQp()/*画棋盘*/

playtoplay()/*人人对战*/

getch()

closegraph()/*关闭图形系统*/

}

void DrawQp()/*画棋盘*/

{

int i,j

score1=score2=0/*棋手一开始得分都为0*/

setbkcolor(BLUE)

for(i=100i<=420i+=40)

{

line(100,i,420,i)/*画水平线*/

line(i,100,i,420)/*画垂直线*/

}

setcolor(0)/*取消圆周围的一圈东西*/

setfillstyle(SOLID_FILL,15)/*白色实体填凳颤充模式*/

fillellipse(500,200,15,15)/*在显示得分的位置画棋*/

setfillstyle(SOLID_FILL,8)/*黑色实体填充模式*/

fillellipse(500,300,15,15)

a[3][3]=a[4][4]=1/*初始两个黑棋*/

a[3][4]=a[4][3]=2/*初始两个白棋*/

setfillstyle(SOLID_FILL,WHITE)

fillellipse(120+3*40,120+3*40,15,15)

fillellipse(120+4*40,120+4*40,15,15)

setfillstyle(SOLID_FILL,8)

fillellipse(120+3*40,120+4*40,15,15)

fillellipse(120+4*40,120+3*40,15,15)

score1=score2=2/*有棋后改变分数*/

DoScore()/*输出开始分数*/

}

void playtoplay()/*人人对战*/

{

int x,y,t=1,i,j,cc=0

while(1)/*换棋好悄手走棋*/

{

x=120,y=80/*每次棋子一开始出来的坐标,x为行坐标,y为列坐标*/

while(1) /*具体一个棋手走棋的过程*/

{

PrintScore(1)/*输出棋手1的成绩*/

PrintScore(2)/*输出棋手2的成绩*/

SetPlayColor(t)/*t变量是友粗渣用来判断棋手所执棋子的颜色*/

fillellipse(x,y,15,15)

key=bioskey(0)/*接收按键*/

if(key==ESC)/*跳出游戏*/

break

else

if(key==ENTER)/*如果按键确定就可以跳出循环*/

{

if(y!=80&&a[(x-120)/40][(y-120)/40]!=1

&&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置没有棋子*/

{

if(t%2==1)/*如果是棋手1移动*/

a[(x-120)/40][(y-120)/40]=1

else/*否则棋手2移动*/

a[(x-120)/40][(y-120)/40]=2

if(!QpChange(x,y,t))/*落子后判断棋盘的变化*/

{

a[(x-120)/40][(y-120)/40]=0/*恢复空格状态*/

cc++/*开始统计尝试次数*/

if(cc>=64-score1-score2) /*如果尝试超过空格数则停步*/

{

MoveColor(x,y)

fillellipse(x,y,15,15)

break

}

else

continue/*如果按键无效*/

}

DoScore()/*分数的改变*/

break/*棋盘变化了,则轮对方走棋*/

}

else/*已经有棋子就继续按键*/

continue

}

else /*四个方向按键的判断*/

if(key==LEFT&&x>120)/*左方向键*/

{

MoveColor(x,y)

fillellipse(x,y,15,15)

SetPlayColor(t)

x-=40

fillellipse(x,y,15,15)

}

else

if(key==RIGHT&&x<400&&y>80)/*右方向键*/

{

MoveColor(x,y)

fillellipse(x,y,15,15)

SetPlayColor(t)

x+=40

fillellipse(x,y,15,15)

}

else

if(key==UP&&y>120)/*上方向键*/

{

MoveColor(x,y)

fillellipse(x,y,15,15)

SetPlayColor(t)

y-=40

fillellipse(x,y,15,15)

}

else

if(key==DOWN&&y<400)/*下方向键*/

{

MoveColor(x,y)

fillellipse(x,y,15,15)

SetPlayColor(t)

y+=40

fillellipse(x,y,15,15)

}

}

if(key==ESC)/*结束游戏*/

break

if((score1+score2)==64||score1==0||score2==0)/*格子已经占满或一方棋子为0判断胜负*/

{

playWin()/*输出最后结果*/

break

}

t=t%2+1/*一方走后,改变棋子颜色即轮对方走*/

cc=0 /*计数值恢复为0*/

} /*endwhile*/

}

void SetPlayColor(int t)/*设置棋子颜色*/

{

if(t%2==1)

setfillstyle(SOLID_FILL,15)/*白色*/

else

setfillstyle(SOLID_FILL,8)/*灰色*/

}

void MoveColor(int x,int y)/*走了一步后恢复原来格子的状态*/

{

if(y<100)/*如果是从起点出发就恢复蓝色*/

setfillstyle(SOLID_FILL,BLUE)

else/*其他情况如果是1就恢复白色棋子,2恢复黑色棋子,或恢复蓝色棋盘*/

switch(a[(x-120)/40][(y-120)/40])

{

case 1:

setfillstyle(SOLID_FILL,15)break/*白色*/

case 2:

setfillstyle(SOLID_FILL,8)break/*黑色*/

default:

setfillstyle(SOLID_FILL,BLUE)/*蓝色*/

}

}

int QpChange(int x,int y,int t)/*判断棋盘的变化*/

{

int i,j,k,kk,ii,jj,yes

yes=0

i=(x-120)/40/*计算数组元素的行下标*/

j=(y-120)/40/*计算数组元素的列下标*/

SetPlayColor(t)/*设置棋子变化的颜色*/

/*开始往8个方向判断变化*/

if(j<6)/*往右边*/

{

for(k=j+1k<8k++)

if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格结束*/

break

if(a[i][k]!=0&&k<8)

{

for(kk=j+1kk<k&&k<8kk++)/*判断右边*/

{

a[i][kk]=a[i][j]/*改变棋子颜色*/

fillellipse(120+i*40,120+kk*40,15,15)

}

if(kk!=j+1) /*条件成立则有棋子改变过颜色*/

yes=1

}

}

if(j>1)/*判断左边*/

{

for(k=j-1k>=0k--)

if(a[i][k]==a[i][j]||!a[i][k])

break

if(a[i][k]!=0&&k>=0)

{

for(kk=j-1kk>k&&k>=0kk--)

{

a[i][kk]=a[i][j]

fillellipse(120+i*40,120+kk*40,15,15)

}

if(kk!=j-1)

yes=1

}

}

if(i<6)/*判断下边*/

{

for(k=i+1k<8k++)

if(a[k][j]==a[i][j]||!a[k][j])

break

if(a[k][j]!=0&&k<8)

{

for(kk=i+1kk<k&&k<8kk++)

{

a[kk][j]=a[i][j]

fillellipse(120+kk*40,120+j*40,15,15)

}

if(kk!=i+1)

yes=1

}

}

if(i>1)/*判断上边*/

{

for(k=i-1k>=0k--)

if(a[k][j]==a[i][j]||!a[k][j])

break

if(a[k][j]!=0&&k>=0)

{

for(kk=i-1kk>k&&k>=0kk--)

{

a[kk][j]=a[i][j]

fillellipse(120+kk*40,120+j*40,15,15)

}

if(kk!=i-1)

yes=1

}

}

if(i>1&&j<6)/*右上*/

{

for(k=i-1,kk=j+1k>=0&&kk<8k--,kk++)

if(a[k][kk]==a[i][j]||!a[k][kk])

break

if(a[k][kk]&&k>=0&&kk<8)

{

for(ii=i-1,jj=j+1ii>k&&k>=0ii--,jj++)

{

a[ii][jj]=a[i][j]

fillellipse(120+ii*40,120+jj*40,15,15)

}

if(ii!=i-1)

yes=1

}

}

if(i<6&&j>1)/*左下*/

{

for(k=i+1,kk=j-1k<8&&kk>=0k++,kk--)

if(a[k][kk]==a[i][j]||!a[k][kk])

break

if(a[k][kk]!=0&&k<8&&kk>=0)

{

for(ii=i+1,jj=j-1ii<k&&k<8ii++,jj--)

{

a[ii][jj]=a[i][j]

fillellipse(120+ii*40,120+jj*40,15,15)

}

if(ii!=i+1)

yes=1

}

}

if(i>1&&j>1)/*左上*/

{

for(k=i-1,kk=j-1k>=0&&kk>=0k--,kk--)

if(a[k][kk]==a[i][j]||!a[k][kk])

break

if(a[k][kk]!=0&&k>=0&&kk>=0)

{

for(ii=i-1,jj=j-1ii>k&&k>=0ii--,jj--)

{

a[ii][jj]=a[i][j]

fillellipse(120+ii*40,120+jj*40,15,15)

}

if(ii!=i-1)

yes=1

}

}

if(i<6&&j<6)/* 右下*/

{

for(k=i+1,kk=j+1kk<8&&kk<8k++,kk++)

if(a[k][kk]==a[i][j]||!a[k][kk])

break

if(a[k][kk]!=0&&kk<8&&k<8)

{

for(ii=i+1,jj=j+1ii<k&&k<8ii++,jj++)

{

a[ii][jj]=a[i][j]

fillellipse(120+ii*40,120+jj*40,15,15)

}

if(ii!=i+1)

yes=1

}

}

return yes/*返回是否改变过棋子颜色的标记*/

}

void DoScore()/*处理分数*/

{

int i,j

score1=score2=0/*重新开始计分数*/

for(i=0i<8i++)

for(j=0j<8j++)

if(a[i][j]==1)/*分别统计两个人的分数*/

score1++

else

if(a[i][j]==2)

score2++

}

void PrintScore(int playnum)/*输出成绩*/

{

if(playnum==1)/*清除以前的成绩*/

{

setfillstyle(SOLID_FILL,BLUE)

bar(550,100,640,400)

}

setcolor(RED)

settextstyle(0,0,4)/*设置文本输出样式*/

if(playnum==1)/*判断输出哪个棋手的分,在不同的位置输出*/

{

sprintf(playone,"%d",score1)

outtextxy(550,200,playone)

}

else

{

sprintf(playtwo,"%d",score2)

outtextxy(550,300,playtwo)

}

setcolor(0)

}

void playWin()/*输出最后的胜利者结果*/

{

settextstyle(0,0,4)

setcolor(12)

if(score2>score1)/*开始判断最后的结果*/

outtextxy(100,50,"black win!")

else

if(score2<score1)

outtextxy(100,50,"white win!")

else

outtextxy(60,50,"you all win!")

}

五子棋游戏

/*五子棋*/

#include<stdio.h>

#include<stdlib.h>

#include<graphics.h>

#include<bios.h>

#include<conio.h>

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

#define SPACE 0x3920

#define BILI 20

#define JZ 4

#define JS 3

#define N 19

int box[N][N]

int step_x,step_y

int key

int flag=1

void draw_box()

void draw_cicle(int x,int y,int color)

void change()

void judgewho(int x,int y)

void judgekey()

int judgeresult(int x,int y)

void attentoin()

void attention()

{

char ch

window(1,1,80,25)

textbackground(LIGHTBLUE)

textcolor(YELLOW)

clrscr()

gotoxy(15,2)

printf("游戏 *** 作规则:")

gotoxy(15,4)

printf("Play Rules:")

gotoxy(15,6)

printf("1、按左右上下方向键移动棋子")

gotoxy(15,8)

printf("1. Press Left,Right,Up,Down Key to move Piece")

gotoxy(15,10)

printf("2、按空格确定落棋子")

gotoxy(15,12)

printf("2. Press Space to place the Piece")

gotoxy(15,14)

printf("3、禁止在棋盘外按空格")

gotoxy(15,16)

printf("3. DO NOT press Space outside of the chessboard")

gotoxy(15,18)

printf("你是否接受上述的游戏规则(Y/N)")

gotoxy(15,20)

printf("Do you accept the above Playing Rules? [Y/N]:")

while(1)

{

gotoxy(60,20)

ch=getche()

if(ch=='Y'||ch=='y')

break

else if(ch=='N'||ch=='n')

{

window(1,1,80,25)

textbackground(BLACK)

textcolor(LIGHTGRAY)

clrscr()

exit(0)

}

gotoxy(51,12)

printf(" ")

}

}

void draw_box()

{

int x1,x2,y1,y2

setbkcolor(LIGHTBLUE)

setcolor(YELLOW)

gotoxy(7,2)

printf("Left, Right, Up, Down KEY to move, Space to put, ESC-quit.")

for(x1=1,y1=1,y2=18x1<=18x1++)

line((x1+JZ)*BILI,(y1+JS)*BILI,(x1+JZ)*BILI,(y2+JS)*BILI)

for(x1=1,y1=1,x2=18y1<=18y1++)

line((x1+JZ)*BILI,(y1+JS)*BILI,(x2+JZ)*BILI,(y1+JS)*BILI)

for(x1=1x1<=18x1++)

for(y1=1y1<=18y1++)

box[x1][y1]=0

}

void draw_circle(int x,int y,int color)

{

setcolor(color)

setlinestyle(SOLID_LINE,0,1)

x=(x+JZ)*BILI

y=(y+JS)*BILI

circle(x,y,8)

}

void judgekey()

{

int i

int j

switch(key)

{

case LEFT :

if(step_x-1<0)

break

else

{

for(i=step_x-1,j=step_yi>=1i--)

if(box[i][j]==0)

{

draw_circle(step_x,step_y,LIGHTBLUE)

break

}

if(i<1)break

step_x=i

judgewho(step_x,step_y)

break

}

case RIGHT :

if(step_x+1>18)

break

else

{

for(i=step_x+1,j=step_yi<=18i++)

if(box[i][j]==0)

{

draw_circle(step_x,step_y,LIGHTBLUE)

break

}

if(i>18)break

step_x=i

judgewho(step_x,step_y)

break

}

case DOWN :

if((step_y+1)>18)

break

else

{

for(i=step_x,j=step_y+1j<=18j++)

if(box[i][j]==0)

{

draw_circle(step_x,step_y,LIGHTBLUE)

break

}

if(j>18)break

step_y=j

judgewho(step_x,step_y)

break

}

case UP :

if((step_y-1)<0)

break

else

{

for(i=step_x,j=step_y-1j>=1j--)

if(box[i][j]==0)

{

draw_circle(step_x,step_y,LIGHTBLUE)

break

}

if(j<1)break

step_y=j

judgewho(step_x,step_y)

break

}

case ESC :

break

case SPACE :

if(step_x>=1&&step_x<=18&&step_y>=1&&step_y<=18)

{

if(box[step_x][step_y]==0)

{

box[step_x][step_y]=flag

if(judgeresult(step_x,step_y)==1)

{

sound(1000)

delay(1000)

nosound()

gotoxy(30,4)

if(flag==1)

{

setbkcolor(BLUE)

cleardevice()

setviewport(100,100,540,380,1)

/*定义一个图形窗口*/

setfillstyle(1,2)

/*绿色以实填充*/

setcolor(YELLOW)

rectangle(0,0,439,279)

floodfill(50,50,14)

setcolor(12)

settextstyle(1,0,5)

/*三重笔划字体, 水平放?5倍*/

outtextxy(20,20,"The White Win !")

setcolor(15)

settextstyle(3,0,5)

/*无衬笔划字体, 水平放大5倍*/

outtextxy(120,120,"The White Win !")

setcolor(14)

settextstyle(2,0,8)

getch()

closegraph()

exit(0)

}

if(flag==2)

{

setbkcolor(BLUE)

cleardevice()

setviewport(100,100,540,380,1)

/*定义一个图形窗口*/

setfillstyle(1,2)

/*绿色以实填充*/

setcolor(YELLOW)

rectangle(0,0,439,279)

floodfill(50,50,14)

setcolor(12)

settextstyle(1,0,8)

/*三重笔划字体, 水平放大8倍*/

outtextxy(20,20,"The Red Win !")

setcolor(15)

settextstyle(3,0,5)

/*无衬笔划字体, 水平放大5倍*/

outtextxy(120,120,"The Red Win !")

setcolor(14)

settextstyle(2,0,8)

getch()

closegraph()

exit(0)

}

}

change()

break

}

}

else

break

}

}

void change()

{

if(flag==1)

flag=2

else

flag=1

}

void judgewho(int x,int y)

{

if(flag==1)

draw_circle(x,y,15)

if(flag==2)

draw_circle(x,y,4)

}

int judgeresult(int x,int y)

{

int j,k,n1,n2

while(1)

{

n1=0

n2=0

/*水平向左数*/

for(j=x,k=yj>=1j--)

{

if(box[j][k]==flag)

n1++

else

break

}

/*水平向右数*/

for(j=x,k=yj<=18j++)

{

if(box[j][k]==flag)

n2++

else

break

}

if(n1+n2-1>=5)

{

return(1)

break

}

/*垂直向上数*/

n1=0

n2=0

for(j=x,k=yk>=1k--)

{

if(box[j][k]==flag)

n1++

else

break

}

/*垂直向下数*/

for(j=x,k=yk<=18k++)

{

if(box[j][k]==flag)

n2++

else

break

}

if(n1+n2-1>=5)

{

return(1)

break

}

/*向左上方数*/

n1=0

n2=0

for(j=x,k=yj>=1,k>=1j--,k--)

{

if(box[j][k]==flag)

n1++

else

break

}

/*向右下方数*/

for(j=x,k=yj<=18,k<=18j++,k++)

{

if(box[j][k]==flag)

n2++

else

break

}

if(n1+n2-1>=5)

{

return(1)

break

}

/*向右上方数*/

n1=0

n2=0

for(j=x,k=yj<=18,k>=1j++,k--)

{

if(box[j][k]==flag)

n1++

else

break

}

/*向左下方数*/

for(j=x,k=yj>=1,k<=18j--,k++)

{

if(box[j][k]==flag)

n2++

else

break

}

if(n1+n2-1>=5)

{

return(1)

break

}

return(0)

break

}

}

void main()

{

int gdriver=VGA,gmode=VGAHI

clrscr()

attention()

initgraph(&gdriver,&gmode,"c:\\tc")

/* setwritemode(XOR_PUT)*/

flag=1

draw_box()

do

{

step_x=0

step_y=0

/*draw_circle(step_x,step_y,8)*/

judgewho(step_x-1,step_y-1)

do

{

while(bioskey(1)==0)

key=bioskey(0)

judgekey()

}

while(key!=SPACE&&key!=ESC)

}

while(key!=ESC)

closegraph()

}


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

原文地址: http://outofmemory.cn/yw/12547530.html

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

发表评论

登录后才能评论

评论列表(0条)

保存