最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言實(shí)現(xiàn)雙人五子棋游戲

 更新時(shí)間:2021年06月06日 09:49:34   作者:兩片空白  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)雙人五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)雙人五子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下

實(shí)現(xiàn)功能

生成棋盤(pán)玩家1與玩家2對(duì)戰(zhàn),哪個(gè)玩家率先有連續(xù)5子連線(xiàn),哪個(gè)玩家贏。

如何實(shí)現(xiàn)

組成:

二維數(shù)組:board[ROW][COL],定義一個(gè)ROW*COL的棋盤(pán)。

主要邏輯:

顯示棋盤(pán),提示用戶(hù)下子,下子后判斷

1.顯示棋盤(pán)很簡(jiǎn)單,慢慢湊棋盤(pán)就好
2. 用戶(hù)下子,注意兩個(gè)條件:棋子在棋盤(pán)里,下子位置未被占用。
3.判斷是最難的,

方法:從下子位置的8個(gè)方向(上,下,左,右,右上,右下,左上,左下)計(jì)算相同棋子數(shù)目,然后將對(duì)角的棋子數(shù)相加,等于5說(shuō)明有5子連線(xiàn)

主要函數(shù)中用到三個(gè)主要實(shí)現(xiàn)函數(shù):

Showboard(board, ROW, COL);//展示棋盤(pán)
Playermove(board, ROW, COL, cur);//玩家下注,cur表示哪個(gè)玩家下子
Judge(board, ROW, COL);//判斷5子連線(xiàn)
Getcount(board[][COL], row, col, dir)//計(jì)算方向dir相同棋子數(shù)

代碼

頭文件

#ifndef __FIVECHREE_H__
#define __FIVECHEE_H__


#include<stdio.h>
#include<windows.h>
#pragma warning(disable:4996)

#define ROW 10//棋盤(pán)行數(shù)
#define COL 10//棋盤(pán)列數(shù)
#define INIT '*'//棋盤(pán)初始化

#define PLAYER1 1
#define PLAYER2 2
#define NEXT 3//繼續(xù)往下下
#define DRAW 4//棋盤(pán)下滿(mǎn) 平局

//8個(gè)方向
#define UP 10
#define RIGHT_UP 11
#define RIGHT 12
#define RIGHT_DOWN 13
#define DOWN 14
#define LEFT_DOWN 15
#define LEFT 16
#define LEFT_UP 17

extern void Menu();
extern void Game();

#endif

main函數(shù)源文件

#include"fivechree.h"
int main(){
 int quit = 0;
 while (!quit){
  Menu();
  int select = 0;
  scanf("%d", &select);
  switch (select){
  case 1:
   Game();
   break;
  case 2:
   quit = 1;
   break;
  default:
   printf("Enter Error!\n");
   break;
   
  }

 }
 printf("Byebye\n");
 system("pause");
 return 0;
}

函數(shù)定義源文件

#include"fivechree.h"

static int x = 0;
static int y = 0;

void Menu(){
 printf("+---------------------+\n");
 printf("+- 1.Play    2.Exit  -+\n");
 printf("+---------------------+\n");
 printf("Please Enter Your Select#");

}
static void Showboard(int board[][COL], int row, int col){//展示棋盤(pán) o玩家1棋子,x玩家2棋子
 system("cls");
 for (int i = 0; i < row; i++){
  for (int j = 0; j < col; j++){
   switch (board[i][j]){
   case PLAYER1:
    board[i][j] = 'o';
    break;
   case PLAYER2:
    board[i][j] = 'x';
    break;
   case 0:
    board[i][j] = INIT;
    break;
   default:
    break;
   }
  }
 }
 printf("  ");
 for (int i =1; i <= row; i++){
  printf("%2d ", i);
 }
 printf("\n");
 for (int i = 1; i <= row; i++){
  printf("%-2d", i);
  for (int j = 1; j <= col; j++){
   printf(" %c ", board[i - 1][j - 1]);
  }
  printf("\n");
 }
}

static void Playermove(int board[][COL], int row, int col, int who){//玩家下子,who 為哪個(gè)玩家下子
 while (1){
  printf("Please Enter PLAYER%d Postion<x,y>#", who);
  scanf("%d %d", &x, &y);
  if (x<1 || x>row || y<1 || y>col){  //超過(guò)棋盤(pán)范圍
   printf("Postion is error!\n");
   continue;
  }
  if (board[x - 1][y - 1] == INIT){//判斷位置是否已被下子
   board[x - 1][y - 1] = who;
   break;
  }
  printf("Postion is not empty\n");
 }

}

static int Getcount(int board[][COL], int row, int col, int dir){//判斷8個(gè)方向相同棋子的數(shù)目
 int _x = x;//_x,_y變化,后面與x,y棋子相比較
 int _y = y;
 int count = 0;
 while (1){
  switch (dir){
  case UP:
   _x--;
   break;
  case DOWN:
   _x++;
   break;
  case LEFT:
   _y--;
   break;
  case RIGHT:
   _y++;
   break;
  case RIGHT_UP:
   _x--, _y++;
   break;
  case RIGHT_DOWN:
   _x++, _y++;
   break;
  case LEFT_DOWN:
   _x++, _y--;
   break;
  case LEFT_UP:
   _x--, _y--;
   break;
  default:
   break;
  }
  if (_x>=1 || _x<=row || _y>=1 || _y<=col){//棋子不能越界
   if (board[x-1][y-1] == board[_x-1][_y-1]){
    //printf("yes\n");
    count++;
   }
   else{
    //printf("no\n");
    break;
   }
  }
  else{
   return count;
  }
  
 }
 return count;
}
//如何判斷:從下子位置的8個(gè)方向(上,下,左,右,右上,右下,左上,左下)
//計(jì)算相同棋子數(shù)目,然后將對(duì)角的棋子數(shù)相加,等于5說(shuō)明有5子連線(xiàn)
static int Judge(int board[][COL], int row, int col){
 int count1 = Getcount(board, row, col, UP)\
  + Getcount(board, row, col, DOWN);
 //printf("%d\n", count1);
 if (count1 >= 4){
  return board[x-1][y-1];
 }
 count1 = Getcount(board, row, col, RIGHT_UP)\
  + Getcount(board, row, col, LEFT_DOWN);
 //printf("%d\n", count1);
 if (count1 >= 4){
  return board[x-1][y-1];
 }
 count1 = Getcount(board, row, col, RIGHT)\
  + Getcount(board, row, col, LEFT);
 //printf("%d\n", count1);
 if (count1 >= 4){
  return board[x-1][y-1];
 }
 count1 = Getcount(board, row, col, RIGHT_DOWN)\
  + Getcount(board, row, col, LEFT_UP);
 if (count1 >= 4){
  return board[x-1][y-1];
 }

 for (int i = 0; i < row; i++){//判斷棋盤(pán)是否下滿(mǎn)
  for (int j = 0; j < col; j++){
   if (board[i][j] == INIT){
    return NEXT;
   }
  }
 }
 return DRAW;
}


void Game(){
 int board[ROW][COL] = { 0 };
 //memset(board, INIT, ROW*COL);
 int result = 0;
 int cur = PLAYER1;
 Showboard(board, ROW, COL);//先展示棋盤(pán)
 while (1){
  //Showboard(board, ROW, COL);
  Playermove(board, ROW, COL, cur);
  Showboard(board, ROW, COL);//棋盤(pán)將board數(shù)組變化,所以要在判斷前將數(shù)組變化
  result = Judge(board, ROW, COL);
  if (result != NEXT){
   break;
  }
  cur = (cur == PLAYER1 ? PLAYER2 : PLAYER1);//三目表達(dá)式,注意不是 PLAYER1 ? PLAYER2 : PLAYER1
 }

 Showboard(board, ROW, COL);
 switch (result){
 case 'o':
  printf("Player1 Win!\n");
  break;
 case 'x':
  printf("Player2 Win!\n");
  break;
 case DRAW:
  printf("Tie Game!\n");
  break;
 default:
  //printf("%c\n", result);
  printf("BUG\n");
  break;
 }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • c++ 構(gòu)造函數(shù)的初始化列表

    c++ 構(gòu)造函數(shù)的初始化列表

    構(gòu)造函數(shù)的初始化列表僅僅指定用于初始化成員的值,并不指定這些初始化執(zhí)行的次序。成員初始化的次序就是定義成員的次序,第一個(gè)成員首先被初始化,然后是第二個(gè),依次類(lèi)推
    2013-07-07
  • 基于VC中使用ForceInclude來(lái)強(qiáng)制包含stdafx.h的解決方法

    基于VC中使用ForceInclude來(lái)強(qiáng)制包含stdafx.h的解決方法

    本篇文章是對(duì)VC中使用ForceInclude來(lái)強(qiáng)制包含stdafx.h的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言結(jié)構(gòu)體成員賦值的深拷貝與淺拷貝詳解

    C語(yǔ)言結(jié)構(gòu)體成員賦值的深拷貝與淺拷貝詳解

    C語(yǔ)言中的淺拷貝是指在拷貝過(guò)程中,對(duì)于指針型成員變量只拷貝指針本身,而不拷貝指針?biāo)赶虻哪繕?biāo),它按字節(jié)復(fù)制的。深拷貝除了拷貝其成員本身的值之外,還拷貝成員指向的動(dòng)態(tài)內(nèi)存區(qū)域內(nèi)容。本文將通過(guò)示例和大家詳細(xì)說(shuō)說(shuō)C語(yǔ)言的深拷貝與淺拷貝,希望對(duì)你有所幫助
    2022-09-09
  • C++虛函數(shù)及虛函數(shù)表簡(jiǎn)析

    C++虛函數(shù)及虛函數(shù)表簡(jiǎn)析

    這篇文章主要介紹了C++虛函數(shù)及虛函數(shù)表,內(nèi)容非常詳細(xì),思路清晰,需要的朋友可以參考下
    2015-08-08
  • 使用emacs編寫(xiě)C語(yǔ)言教程

    使用emacs編寫(xiě)C語(yǔ)言教程

    這篇文章主要介紹了使用emacs編寫(xiě)C語(yǔ)言教程,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++實(shí)現(xiàn)雷霆戰(zhàn)機(jī)可視化小游戲

    C++實(shí)現(xiàn)雷霆戰(zhàn)機(jī)可視化小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)雷霆戰(zhàn)機(jī)可視化小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++圖論之Bellman-Ford算法和SPFA算法的實(shí)現(xiàn)

    C++圖論之Bellman-Ford算法和SPFA算法的實(shí)現(xiàn)

    貝爾曼-福特算法(Bellman-Ford)是由理查德·貝爾曼和萊斯特·福特創(chuàng)立的,求解單源最短路徑問(wèn)題的一種算法。SPFA 算法是 Bellman-Ford算法 的隊(duì)列優(yōu)化算法的別稱(chēng),通常用于求含負(fù)權(quán)邊的單源最短路徑。本文將詳解兩個(gè)算法的實(shí)現(xiàn),需要的可以參考一下
    2022-06-06
  • C語(yǔ)言中獲取和改變目錄的相關(guān)函數(shù)總結(jié)

    C語(yǔ)言中獲取和改變目錄的相關(guān)函數(shù)總結(jié)

    這篇文章主要介紹了C語(yǔ)言中獲取和改變目錄的相關(guān)函數(shù)總結(jié),包括getcwd()函數(shù)和chdir()函數(shù)以及chroot()函數(shù)的使用方法,需要的朋友可以參考下
    2015-09-09
  • COLORREF,COLOR,RGB,CString的轉(zhuǎn)化總結(jié)分析

    COLORREF,COLOR,RGB,CString的轉(zhuǎn)化總結(jié)分析

    實(shí)際的軟件開(kāi)發(fā)過(guò)程中,常需要用到非.net平臺(tái)的代碼。這時(shí)候就可能碰到ColorRef(也就是以int類(lèi)型代表的顏色值或是以DWORD值表示的顏色)。這跟.net平臺(tái)下的顏色的相互轉(zhuǎn)換MS并沒(méi)有直接實(shí)現(xiàn)
    2013-09-09
  • 使用Libmicrohttpd搭建內(nèi)嵌(本地)服務(wù)器的方法

    使用Libmicrohttpd搭建內(nèi)嵌(本地)服務(wù)器的方法

    下面小編就為大家?guī)?lái)一篇使用Libmicrohttpd搭建內(nèi)嵌(本地)服務(wù)器的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08

最新評(píng)論

庆安县| 新余市| 阿尔山市| 滦平县| 芦山县| 印江| 拜泉县| 汉源县| 景德镇市| 武川县| 石城县| 桑日县| 体育| 诸城市| 宁波市| 芒康县| 共和县| 西乌珠穆沁旗| 航空| 五家渠市| 沐川县| 蓬溪县| 霍山县| 东乡县| 什邡市| 睢宁县| 盐城市| 兴文县| 车险| 垦利县| 汨罗市| 谷城县| 克东县| 鞍山市| 蓝山县| 马龙县| 崇左市| 彰化县| 瓦房店市| 阿拉善左旗| 赣州市|