三子棋
来源:互联网 发布:mac如何编辑pdf 编辑:程序博客网 时间:2024/09/21 06:19
用C语言实现三子棋
今天,我用c实现了简单三子棋,下面来详细记录一下我是如何构建的,因为时间仓促和能力有限,有错误和不足之处诚恳地希望大家指正。
首先我的逻辑是,先打印一个菜单,玩家选择来进入游戏或退出,当选择进入游戏时,程序进入一个封装好的函数“game()”当玩完时再跳出来,game函数要求能实现的功能分为如下几点:
1、初始化棋盘,并打印(这是考验美学功底的,但很不幸我功力不足)。
2、当玩家输入坐标是在棋盘上显示出来相应的棋子(将玩家输入的坐标对应的‘ ’转为‘P’注意检查看在下之前该元素是否已被赋值)
3、电脑可以自己下(利用rand函数得到随机值,注意也要检查是否已经被下过了)。
4、检查并判断输赢。(对横/竖/斜进行遍历判断)
以下是代码:
game.h
# ifndef __GAME_H_# define __GAME_H_#include<stdio.h>#include<stdlib.h>#include<string.h># define ROWS 3//此处为宏定义,方便改。# define COLS 3void init_board(char board[ROWS][COLS], int raw, int col);void display_board(char board[ROWS][COLS], int raw, int col);void player_mov(char board[ROWS][COLS], int raw, int col);void computer_mov(char board[ROWS][COLS], int raw, int col);char check_win(char board[ROWS][COLS], int raw, int col);# endif
game.c
# include"game.h"void init_board(char board[ROWS][COLS],int row,int col)//初始化棋盘{ memset(board, ' ', row*col*sizeof(board[0][0]));}void display_board(char board[ROWS][COLS], int row, int col)//打印棋盘{ int i = 0; for (i = 0; i < row; i++) { printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); if (i < 2) printf("---|---|---\n"); }}void player_mov(char board[ROWS][COLS], int row, int col)//玩家走。{ int a=0, b=0; while (1) { printf("请输入坐标:\n"); scanf_s("%d %d", &a, &b); if ((a >= 0) && (a <=row ) && (b >= 0) && (b <= col)) { if (board[a - 1][b - 1] == ' ') { board[a - 1][b - 1] = 'P'; break; } else { printf("输入错误,请重试:\n"); } } else { printf("输入错误,请重试:\n"); } }}void computer_mov(char board[ROWS][COLS], int row, int col)//电脑走{ printf("电脑走:\n"); while (1) { int x = rand() % ROWS; int y = rand() % COLS; if (board[x][y] == ' ') { board[x][y] = 'C'; break; } }}static int is_full(char board[ROWS][COLS], int row, int col)//判断是否满了{ int i = 0; int j = 0; for (i = 0; i <= row; i++) { for (j = 0; j <= col; j++) { if (board[i][j] == ' ') return 0; } } return 1;}char check_win(char board[ROWS][COLS], int row, int col)//检查输赢{ int i = 0; for (i = 0; i < row; i++) { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][0] != ' ')) return board[i][0]; if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]) && (board[0][i] != ' ')) return board[0][i]; if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[0][0] != ' ')) return board[0][0]; if (is_full(board, row, col)) { return 'p'; } } return ' ';}
test.c
# include"game.h"void menu(){ printf("************************\n"); printf("**** 0.play **1.exit****\n"); printf("************************\n");}void game(){ char board[ROWS][COLS] = { 0 }; init_board(board, ROWS, COLS); display_board(board, ROWS, ROWS, COLS); int ret = 0; while (1) { player_mov(board, ROWS, COLS); display_board(board, ROWS, COLS); ret=check_win(board, ROWS, COLS); if (ret != ' ') { break; } computer_mov(board, ROWS, COLS); display_board(board, ROWS, COLS); ret = check_win(board, ROWS, COLS); if (ret != ' ') { break; } } if (ret == 'C') { printf("电脑赢\n"); } else if (ret == 'P') { printf("玩家赢\n"); } else { printf("平局\n"); }}enum position{ play, EXIT};int main(){ int input = 0; do { menu(); printf("请选择>>\n"); scanf_s("%d", &input); switch (input) { case play: game(); break; case EXIT: break; default: { printf("错误指令,请重新选择:\n"); break; } } } while (input); return 0;}
完
0 0
- 三子棋
- 三子棋
- 三子棋
- 三子棋
- 三子棋
- 三子棋
- 三子棋
- 三子棋
- 三子棋
- 三子棋,
- 三子棋
- 三子棋
- 三子棋
- 三子棋
- 三子棋
- 三子棋
- 三子棋
- 三子棋
- Codeforces Round #408 (Div. 2)-C. Bank Hacking-(三种方法)分类讨论,二分,集合
- 数据库安全——Oracle
- PAT 1013. 数素数
- Android的进程间通信机制之Binder初探
- 正则表达式和Object类
- 三子棋
- caffe实现多标签输入(multilabel、multitask)
- hibernate教程--检索方式详解(hql,sql,QBC)
- Java 数字
- MATLAB深度学习CNN包计算次数统计
- 编程能力训练 —— 系列介绍
- 欢迎使用CSDN-markdown编辑器
- oc和swift对代码的分组,方便代码查找和导航用
- Eclipse 4.3 (Kepler)为 Maven 安装 Git Connector的方法