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;
}
运行页面
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
上一篇: 小游戏——飞机大战java实现