/********************************************************************
C-4.29-1:
实现五子棋游戏
操作说明:用方向键或者"w","s","a","d"控制棋子放置位置,
使用空格键放置棋子,使用“ESC”键退出游戏
     测试环境:Redhat5.5
********************************************************************/ #include <stdio.h>
#include <string.h>
#include <stdlib.h> #define ROW 30
#define COL 36
#define MOVECOLOR 36
#define MOVECHAR '*' //初始化五子棋表格
void initbox(char p[][COL])
{
int i = 0, j = 0; for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
p[i][j] = '+';
}
}
} //打印显示五子棋表格
void show(char p[][COL])
{
int i = 0, j = 0; for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
printf("%c ", p[i][j]);
}
putchar(10);
}
} //将当前光标定位于指定的(x, y)处
void gotoxy(int x, int y)
{
printf("\033[%d;%dH", x, y);
} //显示光标所在位置的坐标值(x, y)
void showxy(int x, int y)
{
int i = 0;
printf("\033[s");
gotoxy(ROW+1, COL-6);
for (i = 0; i < 14; i++)
{
printf(" ");
}
//printf("\033[K\033[10;10m");
printf("\033[14D");
printf("x = %d y = %d\n", x, y); printf("\033[u");
} //移动光标到要下棋点
void move(char rect[][COL], char *buf, int *x, int *y, int player)
{
char ch = 0; if (0 == player % 2)
{
ch = '@';
}
else
{
ch = '#';
} //方向键控制区按键识别,并处理
if (buf[0] == 27 && buf[1] == 91)
{
switch (buf[2])
{
case 65:
if (*x > 1 && *x <= ROW) //上移处理
{
if (rect[*x-1][*y-1] == '+') //下棋点位置在移动时要判断该位置是否为空,为空则将空的颜色恢复黑色
printf("\033[10;10m+\033[D\033[0m");
printf("\033[A"); //上移
if (rect[*x-2][*y-1] == '+')
printf("\033[%d;10m%c\033[D\033[0m", MOVECOLOR, MOVECHAR); //将下棋点位置标明为特殊字符,以便于识别
*x -= 1;
}
break;
case 66:
if (*x >= 1 && *x < ROW) //下移处理
{
if (rect[*x-1][*y-1] == '+')
printf("\033[10;10m+\033[D\033[0m");
printf("\033[B");
if (rect[*x][*y-1] == '+')
printf("\033[%d;10m%c\033[D\033[0m", MOVECOLOR, MOVECHAR);
*x += 1;
}
break;
case 67:
if (*y >= 1 && *y < COL) //右移处理
{
if (rect[*x-1][*y-1] == '+')
printf("\033[10;10m+\033[D\033[0m");
printf("\033[2C");
if (rect[*x-1][*y] == '+')
printf("\033[%d;10m%c\033[D\033[0m", MOVECOLOR, MOVECHAR);
*y += 1;
}
break;
case 68:
if (*y > 1 && *y <= COL) //左移处理
{
if (rect[*x-1][*y-1] == '+')
printf("\033[10;10m+\033[D\033[0m");
printf("\033[2D");
if (rect[*x-1][*y-2] == '+')
printf("\033[%d;10m%c\033[D\033[0m", MOVECOLOR, MOVECHAR);
*y -= 1;
}
break;
default:
break;
}
} //左侧控制键"w","s","a","d"识别,并处理
if (0 == buf[1])
{
switch (buf[0])
{
case 119:
if (*x > 1 && *x <= ROW) //上移处理
{
if (rect[*x-1][*y-1] == '+') //下棋点位置在移动时要判断该位置是否为空,为空则将空的颜色恢复
printf("\033[10;10m+\033[D\033[0m");
printf("\033[A"); //上移
if (rect[*x-2][*y-1] == '+')
printf("\033[%d;10m%c\033[D\033[0m", MOVECOLOR, MOVECHAR); //将下棋点位置标明为特殊字符,以便于识别
*x -= 1;
}
break;
case 115:
if (*x >= 1 && *x < ROW) //下移处理
{
if (rect[*x-1][*y-1] == '+')
printf("\033[10;10m+\033[D\033[0m");
printf("\033[B");
if (rect[*x][*y-1] == '+')
printf("\033[%d;10m%c\033[D\033[0m", MOVECOLOR, MOVECHAR);
*x += 1;
}
break;
case 100:
if (*y >= 1 && *y < COL) //右移处理
{
if (rect[*x-1][*y-1] == '+')
printf("\033[10;10m+\033[D\033[0m");
printf("\033[2C");
if (rect[*x-1][*y] == '+')
printf("\033[%d;10m%c\033[D\033[0m", MOVECOLOR, MOVECHAR);
*y += 1;
}
break;
case 97:
if (*y > 1 && *y <= COL) //左移处理
{
if (rect[*x-1][*y-1] == '+')
printf("\033[10;10m+\033[D\033[0m");
printf("\033[2D");
if (rect[*x-1][*y-2] == '+')
printf("\033[%d;10m%c\033[D\033[0m", MOVECOLOR, MOVECHAR);
*y -= 1;
}
break;
default:
break;
}
}
showxy(*x, *y);
} void playerchk(int *player)
{
if (0 == *player % 2)
{
printf("\033[s");
gotoxy(ROW+1, 0);
printf("\033[K");
gotoxy(ROW+1, 2);
printf("\033[10;10mPlayerA\033[K\033[0m");
printf("\033[u");
}
else if (1 == *player % 2)
{
printf("\033[s");
gotoxy(ROW+1, 0);
printf("\033[K");
gotoxy(ROW+1, 32);
printf("\033[10;10mPlayerB\033[K\033[0m");
printf("\033[u");
}
} //检查是否有五个连续并且一样的字符,有则游戏结束
int resultchk(char rect[][COL])
{
int i = 0, j = 0, k = 0;
int count = 0;
char cha = '@';
char chb = '#';
char ch = 0; //检查各行是否有五个连续字符
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL-4; j++)
{
if ((rect[i][j] != '+') && (rect[i][j] == rect[i][j+1]) && (rect[i][j] == rect[i][j+2]) && (rect[i][j] == rect[i][j+3]) && (rect[i][j] == rect[i][j+4]))
{
if (cha == rect[i][j])
{
ch = cha;
gotoxy (ROW+2, COL-11);
printf("Game over! PlayerA win!\n");
}
else if (chb == rect[i][j])
{
ch = chb;
gotoxy (ROW+2, COL-11);
printf("Game over! PlayerB win!\n");
}
for (k = 0; k < 5; k++)
{
gotoxy(i+1, (j+k+1) * 2-1);
printf("\033[10;43m%c\033[0m", ch);
}
return 1;
}
}
}
//检查各列是否有五个连续字符
for (j = 0; j < ROW; j++)
{
for (i = 0; i < COL-4; i++)
{
if ((rect[i][j] != '+') && (rect[i][j] == rect[i+1][j]) && (rect[i][j] == rect[i+2][j]) && (rect[i][j] == rect[i+3][j]) && (rect[i][j] == rect[i+4][j]))
{
if (cha == rect[i][j])
{
ch = cha;
gotoxy (ROW+2, COL-11);
printf("Game over! PlayerA win!\n");
}
else if (chb == rect[i][j])
{
ch = chb;
gotoxy (ROW+2, COL-11);
printf("Game over! PlayerB win!\n");
}
for (k = 0; k < 5; k++)
{
gotoxy(i+k+1, (j+1) * 2-1);
printf("\033[10;43m%c\033[0m", ch);
}
return 1;
}
}
}
//检查左上-右下斜线上是否有五个连续字符相同
for (i = 0; i < ROW-4; i++)
{
for (j = 0; j < COL-4; j++)
{
if ((rect[i][j] != '+') && (rect[i][j] == rect[i+1][j+1]) && (rect[i][j] == rect[i+2][j+2]) && (rect[i][j] == rect[i+3][j+3]) && (rect[i][j] == rect[i+4][j+4]))
{
if (cha == rect[i][j])
{
ch = cha;
gotoxy (ROW+2, COL-11);
printf("Game over! PlayerA win!\n");
}
else if ('#' == rect[i][j])
{
ch = chb;
gotoxy (ROW+2, COL-11);
printf("Game over! PlayerB win!\n");
}
for (k = 0; k < 5; k++)
{
gotoxy(i+k+1, (j+k+1) * 2-1);
printf("\033[10;43m%c\033[0m", ch);
}
return 1;
}
}
}
//检查左下-右上斜线上是否有五个连续字符相同
for (i = 0; i < ROW-4; i++)
{
for (j = 4; j < COL; j++)
{
if ((rect[i][j] != '+') && (rect[i][j] == rect[i+1][j-1]) && (rect[i][j] == rect[i+2][j-2]) && (rect[i][j] == rect[i+3][j-3]) && (rect[i][j] == rect[i+4][j-4]))
{
if (cha == rect[i][j])
{
ch = cha;
gotoxy (ROW+2, COL-11);
printf("Game over! PlayerA win!\n");
}
else if (ch == rect[i][j])
{
ch = chb;
gotoxy (ROW+2, COL-11);
printf("Game over! PlayerB win!\n");
}
for (k = 0; k < 5; k++)
{
gotoxy(i+k+1, (j-k+1) * 2-1);
printf("\033[10;43m%c\033[0m", ch);
}
return 1;
}
}
}
} int main(void)
{
int i = 0, j = 0;
char rect[ROW][COL] = { 0 };
int ret = 0;
int x = ROW / 2, y = COL / 2;
int player = 0; system("clear");
system("stty -echo");
system("stty -icanon"); initbox(rect);
show(rect);
printf("\033[s");
gotoxy(ROW+1, 2);
printf("\033[10;10mPlayerA(@)\033[K\033[0m");
printf("\033[u");
gotoxy(x, y * 2 - 1);
showxy(x, y);
printf("\033[?25l");
if (rect[x-1][y-1] == '+')
{
printf("\033[%d;10m%c\033[D\033[0m", MOVECOLOR, MOVECHAR);
}
fflush(NULL); while (1)
{
int i = 0;
char buf[10] = { 0 };
ret = read(0, buf, 10);
move(rect, buf, &x, &y, player);
//if (buf[0] == 119)
//for (i = 0; i < ret; i++)
//{
// printf("buf[%d] = %d\n", i, buf[i]);
//} if (buf[0] == 32 && buf[1] == 0) //按下空格键,在当前位置放下棋子
{
if ((0 == player % 2) && (rect[x-1][y-1] == '+')) //玩家一回合内,按下空格,放置'@'
{
rect[x-1][y-1] = '@';
printf("\033[31;10m@\033[D\033[0m");
printf("\033[s");
gotoxy(ROW+1, 2);
printf("\033[K");
printf("\033[u");
showxy(x, y);
printf("\033[s");
gotoxy(ROW+1, COL * 2 - 10);
printf("\033[K");
printf("\033[10;10mPlayerB(#)\033[K\033[0m");
printf("\033[u");
player++;
}
else if ((1 == player % 2) && (rect[x-1][y-1] == '+')) //玩家二回合内,按下空格,放置'#'
{
rect[x-1][y-1] = '#';
printf("\033[32;10m#\033[D\033[0m");
printf("\033[s");
gotoxy(ROW+1, 2);
printf("\033[K");
printf("\033[10;10mPlayerA(@)\033[K\033[0m");
printf("\033[u");
showxy(x, y);
player++;
}
} if (buf[0] == 27 && buf[1] == 0) //按下ESC键退出游戏
{
if ('+' == rect[x-1][y-1])
printf("\033[10;10m+");
gotoxy(ROW+2, 0);
//show(rect);
break;
}
if (resultchk(rect) == 1)
{
break;
} fflush(NULL);
} gotoxy(ROW+3, 0);
printf("\033[?25h");
system("stty echo");
system("stty icanon"); return 0;
}

  

C语言实现五子棋简单功能的更多相关文章

  1. R语言:用简单的文本处理方法优化我们的读书体验

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html 前言 延续之前的用R语言读琅琊榜小说,继续讲一下利用R语言做一些简单的文本处理.分词的事情.其实 ...

  2. Web应用开发工具及语言需要具备的功能探索

    1 前言 最近一个多月在做Web项目,用到的技术有(也不算泄漏公司机密吧): 后台:Struts 2(with JSP/FreeMarker).Spring.Hibernate.MySQL.Web S ...

  3. 用C语言编写一个简单的词法分析程序

    问题描述: 用C或C++语言编写一个简单的词法分析程序,扫描C语言小子集的源程序,根据给定的词法规则,识别单词,填写相应的表.如果产生词法错误,则显示错误信息.位置,并试图从错误中恢复.简单的恢复方法 ...

  4. 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)

    1.前言与作者 首先声明,我是由于非常偶然的机会获得<C语言入门很简单>这本书的,绝对不是买的.买这种书实在丢不起那人. 去年这书刚出版时,在CU论坛举行试读推广,我当时随口说了几句(没说 ...

  5. 留念 C语言第一课简单的计算器制作

    留念 C语言第一课简单的计算器制作 学C语言这么久了.  /* 留念 C语言第一课简单的计算器制作 */   #include<stdio.h>  #include<stdlib.h ...

  6. 【 VS 插件开发 】三、Vs插件简单功能的实现

    [ VS 插件开发 ]三.Vs插件简单功能的实现

  7. C语言 实现逆置功能

    C语言 实现逆置功能 //凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 字符串的逆置 方法1:利用数组 #include<stdio.h> ...

  8. 用Go语言实现一个简单的聊天机器人

    一.介绍 目的:使用Go语言写一个简单的聊天机器人,复习整合Go语言的语法和基础知识. 软件环境:Go1.9,Goland 2018.1.5. 二.回顾 Go语言基本构成要素:标识符.关键字.字面量. ...

  9. Fastjson是一个Java语言编写的高性能功能完善的JSON库。

    简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...

随机推荐

  1. php 获取目录下文件列表

    可以用 scandir() 函数 例如: http://www.w3school.com.cn/php/func_directory_scandir.asp

  2. php 写一个水仙花数的函数

    判断一个数是不是水仙花数 <?php function is_shuixianhua($i) { $length=strlen($i); $i=(string)$i; $sum=0; for($ ...

  3. spfa + slf优化

    最近在练习费用流 , 不是要用spfa吗 ,我们教练说:ns学生写朴素的spfa说出去都让人笑 . QwQ,所以就去学了一下优化 . slf优化就是双向队列优化一下,本来想用lll优化,可是优化后我t ...

  4. hdu4485 B-Casting(mod运算)

    B-Casting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. Android开发:Handler Runnable和Thread之间的区别和联系 应用--------------------看完本篇,从此一览无余!

    http://blog.csdn.net/yanzi1225627/article/details/8582081 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnab ...

  6. Linux性能及调优指南(翻译)

    http://blog.csdn.net/ljianhui/article/details/46718835 http://blog.chinaunix.net/uid-26000296-id-406 ...

  7. hadoop错误org.apache.hadoop.yarn.exceptions.YarnException Unauthorized request to start container

    错误: 14/04/29 02:45:07 INFO mapreduce.Job: Job job_1398704073313_0021 failed with state FAILED due to ...

  8. SOAP消息分析

    根据WebService学习笔记系列(二)中的介绍,使用tcpmon可以捕获到我们发出或者接收到的xml内容,接天我们就对这些xml内容做一个简单的分析.还记得在WebService学习笔记系列(四) ...

  9. Oracle 根据业务创建新的用户

    新的需求,创建一个用户,可以查询基表的数据,但是不能修改,同时自己也可以创建对象 1.创建用户第一种方式 详细常见,前提 表空间和临时表空间必须存在 格式: create user 用户名 ident ...

  10. Android ListView实现仿iPhone实现左滑删除按钮

    需要自定义ListView.这里就交FloatDelListView吧. 复写onTouchEvent方法.如下: @Override public boolean onTouchEvent(Moti ...