C++ 实现五子棋 含计时功能、推箱子

笔记

细节:处理在同一点落子
工具:vs,图形库插件
控制台应用程序
getchar()防闪退
创建自己的窗口initgraph (宽,高)
cleardevice()刷新函数

void initgame初始化游戏界面:
loadimage(null,图片保存路径)加载图片
第一条线为窗口边框
for循环加载线,line(第一个点坐标(横,纵),第二个),竖线与横线的加载只是横纵坐标相反
setlinecolor(black)线条颜色
setlinestyle(样式,宽度)
最后加上边框的线条

outtextxy(横,纵,提示语句)

void playchess()下棋
MOUSEMSG m:鼠标相关结构体,理解为数据类型,m鼠标变量
while(1)死循环实现下棋过程

int chessboard[][]棋盘二维数组
m=GetMouseMsg获取鼠标消息
m.x鼠标横坐标
处理落子位置,通过鼠标位置与格子的距离绝对值小于格子宽度的一半判定
同时把数组下标换成坐标并记录落子点,用来判断是否落子重复。
m.uMsg=WM_LBUTTONDOWN左键按下

whoseturn变量实现玩家轮流落子,奇数玩家1
chessboard[][]=!0,表示已有
HWND hwnd定义窗口句柄
hwnd=gethwnd()窗口句柄置前
MessagBox(hwnd,内容,标题)信息框弹出
setfilcolor()
solidcircle(x,y,r)无边框填充圆

judge(x,y)判断
细节i>=1,i<=N-4
从当前位置依次从前往后5个5个判断是否相连

效果

在这里插入图片描述
在这里插入图片描述

代码

#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<windows.h>
#include <math.h>
#include<iostream.h>
#include<time.h>
#define N 20
HWND hWnd;
int chessboard[N][N]={0};
int whoseturn;
void initgame();
void playchess();
int judge(int x,int y);

char* to_string(int a){
char *s=new char[6];
int c=5;
while(c>-1){s[c]=a%10+'0';c--;a=a/10;}
return s;
}
int main(){
	initgame();
	playchess();
	
	getchar();
	
	return 0;
}


void initgame(){
	initgraph(600,500);
	loadimage(NULL,"ff.jpg");
	for (int i=1;i<20;i++){
		setlinecolor(BLACK);
		line(i*25,0,i*25,500);
		line(0,i*25,500,i*25);
	}
	setlinestyle(PS_SOLID,2);
	line(500,0,500,500);

	outtextxy(510,50,"黑棋:玩家一");
	outtextxy(510,80,"白棋:玩家二");
}


void playchess(){
	int i,j,x,y,a=0,b=0;
	MOUSEMSG m;
	hWnd=GetHWnd();



	int start=clock()/1000;
    int showTime=start;
    int now=0;
	while(1)
	{
		now=clock()/1000;
			 if(now!=showTime){
                  showTime=now;
                  outtextxy(520,100,to_string(showTime-start));
			 }
		m=GetMouseMsg();
		for (i=1;i<20;i++){
			for (j=1;j<20;j++){
				if(abs(i*25-m.x)<12.5&&abs(j*25-m.y)<12.5){
					x=i*25;
					y=j*25;
					a=i;
					b=j;

				}

			}

		}
		if(m.uMsg==WM_LBUTTONDOWN){
			if(whoseturn %2==1){
				outtextxy(505,200,"请玩家一落子");
				if (chessboard[a][b]!=0){
					MessageBox(hWnd,"请重新选择地点","这里已落子",MB_OK);
					continue;
				}
				else{
					setfillcolor(WHITE);
					solidcircle(x,y,10);
					chessboard[a][b]=2;
				}
			}
			else{
				outtextxy(505,200,"请玩家二落子");
				if (chessboard[a][b]!=0){
					MessageBox(hWnd,"请重新选择地点","这里已落子",MB_OK);
					continue;
				}
				else{
					setfillcolor(BLACK);
					solidcircle(x,y,10);
					chessboard[a][b]=1;
				}
			}
			whoseturn++;
		}
		if (judge(a,b)){
			if (whoseturn%2==1){
				MessageBox(hWnd,"玩家一胜利","游戏结束",MB_OK);
				exit(0);
			}
			else{
				MessageBox(hWnd,"玩家二胜利","游戏结束",MB_OK);
				exit(0);
			}

		}

	}
}










int judge(int x,int y)
{
   int i=0,j=0;
   int t=2-whoseturn%2;
   for (i =x -4,j =y;i<=x;i++)
     {
	   if (i>=1&&i<=N-4&&t==chessboard[i][j]  && t==chessboard[i+1][j] && t==chessboard[i + 2][j] && t==chessboard[i + 3][j] && t==chessboard[i+4][j]) 
               return 1;
      }

  for (i =x,j =y-4;j<=x;j++)
     {
          if (j>=1&&j<=N-4&&chessboard[i][j] == t && chessboard[i][j + 1] == t&& chessboard[i][j + 2] == t && chessboard[i][j + 3] == t && chessboard[i][j+ 4] == t) 
               return 1;
      }

for (i =x -4,j =y-4;i<=x,j<=y;i++,j++)
     {
          if (i>=1&&i<=N-4&&j>=1&&j<=N-4&&chessboard[i][j] == t && chessboard[i + 1][j + 1] == t && chessboard[i + 2][j + 2] == t && chessboard[i + 3][j + 3] == t && chessboard[i + 4][j + 4] == t     )                     
          return 1;
      }

for (i =x+4,j =y-4;i>=1,j<=y;i--,j++)
     {
          if (i>=1&&i<=N-4&&j>=1&&j<=N-4&&chessboard[i][j] == t && chessboard[i - 1][j + 1] == t &&chessboard[i - 2][j + 2] == t &&chessboard[i - 3][j + 3] == t &&chessboard[i - 4][j + 4] == t)
          return 1;
      }
 return 0;
}

推箱子代码

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>


void initgame();
void movebox();
void judge();
void judge()//0空地 1墙 3目的地 4箱子 5人
int map[9][9]={{1,1,1,1,1,0,0,0,0},
{1,5,0,0,1,0,0,0,0},
{1,0,4,4,1,0,1,1,1},
{1,0,4,0,1,0,1,3,1},
{1,1,1,0,1,1,1,3,1},
{0,1,1,0,0,0,0,3,1},
{0,1,0,0,0,1,0,0,1},
{0,1,0,0,0,1,1,1,1},
{0,1,1,1,1,1,0,0,0}};

int main()
{
	while(1)
	{
    initgame();
    judge();
	movebox();
	//getchar();}
	return 0;
}

void initgame()
{
    system("cls");//清屏
	for(int i=0;i<9;i++)
	{
		for(int j=0;j<9;j++)
		{
			switch (map[i][j])
			{
			case 0:
				printf("  ");//两个空格
				break;
			case 1:
				printf("■");
				break;
            case 3:
				printf("☆");
				break; 
			case 4:
				printf("◇");//两个空格
				break;
			case 5:
				printf("♀");
				break;
			case 8://人站在目的地上
				printf("♀");
				break;
			case 7://箱子在目的地上
				printf("★");
				break;

    				

			}
		}
		printf("\n");
	
	}

}

//动态界面
void movebox()
{
	int m,n;  
	for(int i=0;i<9;i++)
	{
		for(int j=0;j<9;j++)
		{
			if(map[i][j]==5||map[i][j]==8)//找到人
			{
				m=i;
				n=j;
			}


		
		}
		
	}
	switch(getch())//获取键盘按键
	{
	case 72://or"w"/up
		//人前面是空地目的地
		if(map[m-1][n]==0||map[m-1][n]==3)
		{
			map[m][n]-=5;
			map[m-1][n]+=5;
		}
		else if(map[m-1][n]==4||map[m-1][n]==7)
		{//箱子前面是空地目的地
			if(map[m-2][m]==0||map[m-2][m]==3)
			{
				map[m][n]-=5;
				map[m-1][n]-=1;
				map[m-2][n]+=4;

			}		
		}
		break;
	case 80:

		if(map[m+1][n]==0||map[m+1][n]==3)
		{
			map[m][n]-=5;
			map[m+1][n]+=5;
		}
		else if(map[m+1][n]==4||map[m+1][n]==7)
		{//箱子前面是空地目的地
			if(map[m+2][m]==0||map[m+2][m]==3)
			{
				map[m][n]-=5;
				map[m+1][n]-=1;
				map[m+2][n]+=4;

			}		
		}
		break;
	case 75:

		if(map[m][n-1]==0||map[m][n-1]==3)
		{
			map[m][n]-=5;
			map[m][n-1]+=5;
		}
		else if(map[m][n-1]==4||map[m][n-1]==7)
		{//箱子前面是空地目的地
			if(map[m][m-2]==0||map[m][m-2]==3)
			{
				map[m][n]-=5;
				map[m][n-1]-=1;
				map[m][n-2]+=4;

			}		
		}
		break;
		case 77:

		if(map[m][n+1]==0||map[m][n+1]==3)
		{
			map[m][n]-=5;
			map[m][n+1]+=5;
		}
		else if(map[m][n+1]==4||map[m][n+1]==7)
		{//箱子前面是空地目的地
			if(map[m][m+2]==0||map[m][m+2]==3)
			{
				map[m][n]-=5;
				map[m][n+1]-=1;
				map[m][n+2]+=4;

			}		
		}
		break;
	}
}
void judge()
{
     int win;
     for(int j=0;j<9;j++)
     {
         if(map[i][j]=7)
         {
           win++;
         }
     }
     if( win==3{
       MessageBox(NULL,"恭喜你",MB_OK;
       exit(0);
     }
}

音乐播放

//#include "stdafx.h"

#include<stdio.h>
#include<conio.h>//getch()

//micSendString
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")



void playSound(char* str)
{
	char buff[256]={0};
	sprintf(buff,"open sounds\\%s alias m",str); 
    mciSendString(buff,0,0,0);//打开音乐
	mciSendString("play m alias m",0,0,0);
    Sleep(300);//睡觉
    mciSendString("close m alias m",0,0,0);
}


int_tmain(int argc,_TCHAR* argv[])
{
	int c;
	while(1){
		c=getch();//获取按键值
		switch(c){
			case 49playSound("1.mp3");
				breakcase 50mciSendString("open 2.mp3 alias m",0,0,0);//打开音乐
	            mciSendString("play m alias m",0,0,0);
              	Sleep(300);//睡觉
	            mciSendString("close m alias m",0,0,0);
				breakcase 51mciSendString("open 3.mp3 alias m",0,0,0);//打开音乐
	            mciSendString("play m alias m",0,0,0);
              	Sleep(300);//睡觉
	            mciSendString("close m alias m",0,0,0);
				breakdefault: 
				break;

		
		}
	}
	mciSendString("open 1.mp3 alias m",0,0,0);//打开音乐
	mciSendString("play m alias m",0,0,0);
	Sleep(300);//睡觉
	mciSendString("close m alias m",0,0,0);

	while



}

贪吃蛇

#include<stdio.h>
 #include<graphics.h>
 #include<mmsystem.h>
 #pragma comment(lib,"winmm.lib")
 
 #define  Sl 500
  void InitSnake();
  void DrawSnake();
  void MoveSnake();
  void ChangeSnakeCh();

 enum Ch//方向
 {up=72,
 down= 80,
 left=75,
 right=77
 }
 struct Coor//坐标
 {int x;
 int y;}
 struct Snake
 {int n;
Coor szb[Sl];
Ch ch;
}snake;

 int main()
{InitSnake();
while (1){
while(!kbhit())
{cleardevice();
DrawSnake();
MoveSnake();
Sleep(200);
}ChangeSnakeCh();}
return 0;
//setbkcolor(GREEN);
//cleardevice();
//settextstyle(50,0,"微软雅黑")宽一般设为0 

}
 void InitSnake()
 {initgraph(640,480);
 //Play Sound();wav
 mciSendString("open xxx.mp3 alias BGM",0,0,0);
 mciSendString("play BGM",0,0,0);
 snake.n=1;
 snake.ch=right;
 snake.szb[0].x=0;
 snake.szb[0].y=0;
 }
 
 void DrawSnake()
 {setlinecolor(YELLOW);
 setfillcolor(YELLOW);
 for(int i=0;i<snake.n;i++)
 {
 fillrectangle(snake.szb[i].x,snake.szb[i].y,snake.szb[i].x+10,snake.szb[i ].y+10);
 }
 }
 
 void MoveSnake()
 {switch(snake.h)
 {case up:
 snake.szb[0].y-=10;
 break;
 case down:
 snake.szb[0].y+=10;
 break;
 case left:
 snake.szb[0].x-=10;
 break;
 case up:
 snake.szb[0].x-=10;
 break;
 }
 }
 
 void ChangeSnakeCh()
 {int move;
 move=getch();
 switch (move)
 {case up:
 if(snake.ch!=down)
 snake.ch=up;
 break;
 
 
 }
  
  
 }
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值