学了差不多一个学期的c语言了,期末写的五子棋。

       

     

        今年秋上了大一,开始接触c语言,开始写程序。感觉还不错的,总比上大物,数分神马的强多了。期末了,花了点时间写了个五子棋出来。其中的ai思考了很久,还是采用了书本上提供的方式写了。

       代码写的有点乱,大家别见怪,原谅初学者的知识不足啊。    

#include <iostream>
#include<stdio.h>
#include<conio.h>
#include<windows.h>
#include<string.h>
#define qx1num 27        //防御棋形的数量 
#define qx2num 26        //攻击棋形的数量

#define TEXTS 7;         //文本颜色 
#define BLACKCHESS 48;   //黑棋颜色 ,因图案本身黑色,故设置于棋盘颜色相同 
#define WHITECHESS 63    //白棋颜色 
#define CURSOR 96;       //光标颜色  
#define BCHESSBOARD 125  //棋盘背景颜色
#define CHESSBOARD  48   //棋盘颜色
#define MENU 124         //菜单颜色

int resultcheck(int x,int y,int player);
void huiqi();
void ai();
void stepp(int st);
void again();
void output(int i,int j);
void showboard();
void textcolor(int color);
void gotoxy(int x,int y);
void huiqi2();
void showplayer(int);
void board();

int x;
int y;
int player;                 //玩家标志 
int step=0;                 //记录下棋的步数
int status[16][16];         //棋盘中一个位置所处的状态 ,1表示该位置已经被玩家一下棋,2表示该位置已经被玩家二下棋,0表示该位置还未下子。
int x1,y1;
int px1,py1;                //用于记录前一个下棋位置,以便悔棋  
int px2,py2;                //用于记录电脑前一个下棋位置,以便悔棋 
int attackrend;
int defentrend;
int computer=0;
HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
struct Cursor{
       int x;
       int y;
       }cursor;

struct QIXING{
       char qx[8];                         //棋形 
       int value;                          //棋形的权值 
       };
       /*棋形 qx1为防御棋形,qx2为攻击棋形*/
QIXING qx1[qx1num]={
       {"x1111",2000000},{"1x111",2000000},{"11x11",2000000},
       {"0x1110",6000},{"01x110",6000},{"101x101",6000},
       {"0x111",1100},{"x0111",1100},{"0x1011",1100},{"0x1101",1100},
       {"01x11",1100},{"011x1",1100},{"1x011",1100},{"10x11",1100},
       {"11x01",1100},{"1x101",1100},
       {"x011102",250},{"0x110",250},{"01x10",250},{"0x01102",240},{"0x101",240},
       {"0x112",20},{"01x12",10},{"011x2",20},{"1x12",10},{"0x10",20},{"0x010",5}};
       /*防御棋形的基本棋形以及权值,0为空,1为对手,2为自己,x为下棋的位置*/
QIXING qx2[qx2num]={
       {"x1111",3000000},{"1x111",3000000},{"11x11",3000000},
       {"0x1110",3000000},{"01x110",3000000},{"101x101",24000},
       {"0x111",2000},{"x0111",1900},{"0x1011",1900},{"0x1101",2000},
       {"01x11",2000},{"011x1",2000},{"1x011",1900},{"10x11",2000},{"1x101",2000},
       {"x01112",2000},{"1x011",850},{"0x110",850},{"0x0110",850},{"0x101",850},
       {"0x112",125},{"01x12",125},{"011x2",115},{"1x12",115},
       {"0x10",125},{"0x010",110} 
       /*攻击棋形的基本棋形以及权值,0为空,1为自己,2为对手,x为下棋位置*/
       };
int direction[8][2]={
  {0,-1},{0,1},{-1,0},{1,0},{-1,-1},{1,1},{-1,1},{1,-1}};/*定义八个方向*/
/*更改颜色的函数*/
void textcolor(int color)   
{
     SetConsoleTextAttribute(hOutput,color);
     }
/*将光标移至坐标(x,y)处*/ 
void gotoxy(int x,int y)
{
     COORD coordScreen={0,0};
     coordScreen.X=x;
     coordScreen.Y=y;
     SetConsoleCursorPosition(hOutput,coordScreen);
     }
char map[15][15][3];          //棋盘的大小  因所采用的符号属于字符串 故采用**数组 
void board()                  //棋盘上各个位置符号的填入 ,这是和书上不同的,我是采用**数组存储棋盘符号,较为简单明了 
{
    int i,j,k;
    strcpy(map[0][0],"┌");    //采用三维数组定义棋盘的原因是符号 ┌占了并不是一个字符,而是占了两个字符的位置,相当于字符串 
    strcpy(map[14][14],"┘");
    strcpy(map[14][0],"└");
    strcpy(map[0][14],"┐");
    for(i=1;i<14;i++)
    {strcpy(map[i][0],"├");strcpy(map[i][14],"┤");}
    for(j=1;j<14;j++)
    {strcpy(map[0][j],"┬");strcpy(map[14][j],"┴");}
    for(i=1;i<14;i++)
    for(j=1;j<14;j++)
    strcpy(map[i][j],"┼");
     }
     /*显示首菜单*/
int showmenu()
{    
     int i;
     system("cls");
     textcolor(BCHESSBOARD);   //更改颜色
     for(i=0;i<300;i++)        //输出空白字符,形成背景。图形界面编程还不会做,所以采用这种方式构成背景 
      printf("/t");
     textcolor(MENU);     
     gotoxy(26,2);
     printf("欢迎使用五子棋");
     gotoxy(22,4);
     printf("★ 1:Two Person Games");
     gotoxy(22,6);
     printf("  (人人对战)");
     gotoxy(22,8);
     printf("★ 2:Person Vs Computer");
     gotoxy(22,10);
     printf("  (人机对战)");
     gotoxy(22,12);
     printf("★ 3:Exit(退出)");
     gotoxy(22,14);
     printf("请按Up,Down 和Enter键进行选择选择");
     textcolor(4); 
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 39
    评论
好的,以下是一个简单的五子棋游戏的 C 语言代码。请注意,这个代码可能不是最优的,但它可以作为一个起点来理解五子棋游戏的实现方式。 ``` #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define BOARD_SIZE 15 // 棋盘大小 typedef enum { // 定义棋子类型 EMPTY, BLACK, WHITE } PieceType; PieceType board[BOARD_SIZE][BOARD_SIZE]; // 棋盘 void print_board() { // 打印棋盘 printf(" "); for (int i = 0; i < BOARD_SIZE; i++) { printf("%c ", 'A' + i); } printf("\n"); for (int i = 0; i < BOARD_SIZE; i++) { printf("%2d", i + 1); for (int j = 0; j < BOARD_SIZE; j++) { if (board[i][j] == EMPTY) { printf(" +"); } else if (board[i][j] == BLACK) { printf(" x"); } else { printf(" o"); } } printf("\n"); } } bool is_valid_move(int row, int col) { // 判断移动是否有效 return row >= 0 && row < BOARD_SIZE && col >= 0 && col < BOARD_SIZE && board[row][col] == EMPTY; } bool is_win(int row, int col, PieceType piece) { // 判断是否获胜 int count = 0; for (int i = row - 4; i <= row + 4; i++) { // 横向判断 if (i < 0 || i >= BOARD_SIZE) continue; if (board[i][col] == piece) { count++; if (count == 5) return true; } else { count = 0; } } count = 0; for (int j = col - 4; j <= col + 4; j++) { // 竖向判断 if (j < 0 || j >= BOARD_SIZE) continue; if (board[row][j] == piece) { count++; if (count == 5) return true; } else { count = 0; } } count = 0; for (int i = row - 4, j = col - 4; i <= row + 4; i++, j++) { // 左上到右下判断 if (i < 0 || i >= BOARD_SIZE || j < 0 || j >= BOARD_SIZE) continue; if (board[i][j] == piece) { count++; if (count == 5) return true; } else { count = 0; } } count = 0; for (int i = row - 4, j = col + 4; i <= row + 4; i++, j--) { // 右上到左下判断 if (i < 0 || i >= BOARD_SIZE || j < 0 || j >= BOARD_SIZE) continue; if (board[i][j] == piece) { count++; if (count == 5) return true; } else { count = 0; } } return

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值