欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言小案例(五子棋实现)

程序员文章站 2024-03-18 14:45:28
...

这里getch库我依旧放在下面有需要的可以提取

/*五子棋*/
#include <stdio.h>
#include <stdlib.h>
#include <getch.h>//获取用户输入的库
#include <stdbool.h>//bool库

void show_chessboard();//显示棋盘

int is_legal(int x,int y,int number);//判断位置是否合法

int is_win();//判断是否胜利

void show_begin();//显示开始页面

int arr[15][15]={};//定义棋盘数组

int x = 7 , y = 7;//定义棋子的位置

int main(int argc,const char* argv[])
{
	int number=0;
	system("clear");
	while(true)
	{
		system("clear");
		show_begin();
		int f=0;//开始游戏的信号
		switch(getch())
		{
			case 49:f=1;break;//进入游戏
			case 48:exit(0);break;//退出游戏
			case 50:printf("游戏规则如下(可按任意键回到上页面)\n");
			printf("1号玩家先下(x)\n2号玩家后下(o)\n");
			getchar();
			break;
			//输入别的字符报错
			default:printf("输入有误请重新输入!!\n");
		}
		if(f)
		{
			break;
		}
	}
	while(true)			
	{																
		//清理屏幕
		system("clear");
		//显示棋盘
		show_chessboard();
		//获取光标的位置
		printf("\33[%d;%dH",x+1,(y+1)*2);							
		switch(getch())													
		{
			//在区间范围内上移
			case 183: x>0 && x--; break;
			//在区间范围内下移
			case 184: x<14 && x++; break;
			//在区间内右移
			case 185: y<14 && y++; break;
			//在区间内左移
			case 186: y>0 && y--; break;
			//确定落子的位置判断是否合法
			case 10:
			{
				if(is_legal(x,y,number))
				{
					number++;
				}
			}
		}
		if(is_win())
		{
			system("clear");
			if(is_win()==1)
			{
				printf("1号玩家胜利!!");
			}
			else
			{
				printf("2号玩家胜利!!");
			}
			return 0;
		}
	}
}

void show_begin()//显示开始页面
{
	printf("-------------------------\n");
	printf("|------五子棋v1.0------|\n");
	printf("|                       |\n");
	printf("|      1.开始游戏       |\n");
	printf("|                       |\n");
	printf("|      2.游戏规则       |\n");
	printf("|                       |\n");
	printf("|      0.退出游戏       |\n");
	printf("-------------------------\n");
}

void show_chessboard()//显示棋盘
{
	for(int i=0; i<15; i++)
	{
		for(int j=0; j<15; j++)
		{
			//如果是没下过的地方就显示*
			if(arr[i][j]==0)
			{
				printf(" *");
			}
			//如果是一号玩家下的就显示x
			else if(arr[i][j]==1)
			{
				printf(" x");
			}
			//如果是二号玩家下的就显示o
			else if(arr[i][j]==100)
			{
				printf(" o");
			}
		}					
		printf("\n");													
	}
}

int is_legal(int x,int y,int number)//判断位置是否合法
{
	//printf("----");
	if( 0==arr[x][y] && 0==number%2)
	{
		arr[x][y]+=1;
		return 1;
	}
	else if( 0==arr[x][y] && 1==number%2 )
	{
		arr[x][y]+=100;
		return 1;
	}
	return 0;
}

int is_win()
{
	for(int i=0;i<15;i++)
	{
		for(int j=0;j<15;j++)
		{
			if(i>=2 && i<=12 && arr[i][j]*4==arr[i-1][j]+arr[i-2][j]+arr[i+1][j]+arr[i+2][j])
			{
				//printf("%d %d",x,y);
				if(1==arr[i][j])
				{
					return 1;
				}
				else if(100==arr[i][j])
				{
					return 100;
				}
			}
			if(j>=2 && j<=12 && arr[i][j]*4==arr[i][j-1]+arr[i][j-2]+arr[i][j+1]+arr[i][j+2])
			{
				if(1==arr[i][j])
				{
					return 1;
				}
				else if(100==arr[i][j])
				{
					return 100;
				}
			}
			if(j>=2 && j<=12 && i>=2 && i<=14 && 4*arr[i][j]==arr[i-1][j-1]+arr[i-2][j-2]+arr[i+1][j+1]+arr[i+2][j+2])
			{
				if(1==arr[i][j])
				{
					return 1;
				}
				else if(100==arr[i][j])
				{
					return 100;
				}
			}
			if(j>=2 && j<=12 && i>=2 && i<=14 && 4*arr[i][j]==arr[i+1][j-1]+arr[i+2][j-2]+arr[i-1][j+1]+arr[i-2][j+2])
			{
				if(1==arr[i][j])
				{
					return 1;
				}
				else if(100==arr[i][j])
				{
					return 100;
				}
			}
		}
	}
	return 0;
}

运行页面
C语言小案例(五子棋实现)
getch库

#ifndef GETCH_H
#define GETCH_H

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

// 修改终端的控制方式,1取消回显、确认 2获取数据 3还原
static int getch(void)
{
    // 记录终端的配置信息
    struct termios old;
    // 获取终端的配置信息
    tcgetattr(STDIN_FILENO,&old);
    // 设置新的终端配置   
    struct termios _new = old;
    // 取消确认、回显
    _new.c_lflag &= ~(ICANON|ECHO);
    // 设置终端配置信息
    tcsetattr(STDIN_FILENO,TCSANOW,&_new);

    // 在新模式下获取数据   
    unsigned int key_val = 0; 
    do{
    	key_val = key_val+getchar();
    }while(stdin->_IO_read_end - stdin->_IO_read_ptr);

    // 还原配置信息
    tcsetattr(STDIN_FILENO,TCSANOW,&old); 
    return key_val; 
}

#endif//GETCH_H